DirectX11 學習筆記7 - 支持自由移動的攝像機

如今將又一次制定一個camera攝像機。能夠自由移動。

比方前進 后退,上游 下潛。 各個方向渲染之類的。

首先設置按鍵。

這個時候須要在

XWindow.h 里面

bool XWindow::frame()
{//推斷是否按下ESC鍵if(x_input->isKeyDown(VK_ESCAPE))return false;//假設A,S,D,W,Q,E,Z,X,C鍵按下。移動攝像機 if(GetAsyncKeyState('W') & 0x8000)    //前后 x_graphics->x_camera->walk(-0.1f); if(GetAsyncKeyState('S') & 0x8000)    x_graphics->x_camera->walk(0.1f); if(GetAsyncKeyState('A') & 0x8000)    //左右 x_graphics->x_camera->strafe(-0.1f); if(GetAsyncKeyState('D') & 0x8000)    x_graphics->x_camera->strafe(0.1f); //if(GetAsyncKeyState('Q') & 0x8000)    //上下 //	x_graphics->x_camera->fly(-0.1f); //if(GetAsyncKeyState('E') & 0x8000)    //	x_graphics->x_camera->fly(0.1f); //if(GetAsyncKeyState('Z') & 0x8000)    //	x_graphics->x_camera->pitch(PI/180); //if(GetAsyncKeyState('X') & 0x8000)    //	x_graphics->x_camera->yaw(PI/180); //if(GetAsyncKeyState('C') & 0x8000)    //	x_graphics->x_camera->roll(PI/180);//動畫。旋轉攝像機 //x_graphics->x_camera->roll(PI/180);//開始渲染return x_graphics->frame();
}
加入一些按鍵。假設報錯的話, 可能是x_camera 在XGraphics.h 類里面是私有的,能夠設置成公有

private: bool render(); 
public:XCamera *x_camera;//攝像機
private:XD3Device *x_d3d;//3D設備XModel *x_model;//模型XShader *x_shader;//渲染器HWND hwnd;


然后非常easy吧

然后就是改動攝像機了

先上代碼再解說吧

#pragma once
#include <xnamath.h>
class XCamera
{
public:enum CameraType { LANDOBJECT, AIRCRAFT };XCamera();void strafe(float units); // l左右//void fly(float units);    // 上下void walk(float units);   // 前后//void pitch(float angle); // 旋轉view坐標系right向量//void yaw(float angle);   // 旋轉up向量//void roll(float angle);  // 旋轉look向量void getViewMatrix(XMMATRIX& V); void setCameraType(CameraType cameraType); void getPosition(XMFLOAT3* pos); void setPosition(XMFLOAT3* pos); void getRight(XMFLOAT3* right);void getUp(XMFLOAT3* up);void getLook(XMFLOAT3* look);
private:CameraType _cameraType;XMFLOAT3 _right,_up,_look,_pos;
};
XCamera::XCamera()
{_cameraType=AIRCRAFT;_pos=XMFLOAT3(0.0f, 0.0f, -10.0f);_right=XMFLOAT3(1.0f,0.0f,0.0f);_up=XMFLOAT3(0.0f,1.0f,0.0f);_look=XMFLOAT3(0.0f,0.0f,1.0f);
}
void XCamera::getPosition(XMFLOAT3* pos)
{*pos = _pos;
}void XCamera::setPosition(XMFLOAT3* pos)
{_pos = *pos;
}void XCamera::getRight(XMFLOAT3* right)
{*right = _right;
}void XCamera::getUp(XMFLOAT3* up)
{*up = _up;
}void XCamera::getLook(XMFLOAT3* look)
{*look = _look;
}//行走,沿著攝像機觀察方向的移動
void XCamera::walk(float units)
{XMVECTOR vpos,vlook;vpos=XMLoadFloat3(&_pos);vlook=XMLoadFloat3(&_look);// 僅在x,z平面移動if( _cameraType == LANDOBJECT ){vpos += XMVectorSet(_look.x, 0.0f, _look.z,0)*units;}if( _cameraType == AIRCRAFT )vpos += vlook * units;XMStoreFloat3(&_pos,vpos);
}//掃視。是指保持觀察方向不變,沿向量right方向從一邊平移到還有一邊
void XCamera::strafe(float units)
{XMVECTOR vpos,vright;vpos=XMLoadFloat3(&_pos);vright=XMLoadFloat3(&_right);// 僅在x,z平面移動if( _cameraType == LANDOBJECT )vpos += XMVectorSet(_right.x, 0.0f, _right.z,0.0f) * units;if( _cameraType == AIRCRAFT )vpos += vright * units;XMStoreFloat3(&_pos,vpos);
}/*
//飛行模式,升降,指沿著向量up方向的移動
void XCamera::fly(float units)
{// 僅在y軸移動if( _cameraType == LANDOBJECT )_pos.y += units;if( _cameraType == AIRCRAFT )_pos += _up * units;
}void XCamera::pitch(float angle)
{XMMATRIX T;T=XMMatrixRotationAxis( _right, angle);// 繞著right向量。旋轉up和look_up=XMVector3TransformCoord(_up,_up, T);_look=XMVector3TransformCoord(_look, T);
}void XCamera::yaw(float angle)
{D3DXMATRIX T;//對LANDOBJECT,總是繞著(0,1,0)旋轉。

if( _cameraType == LANDOBJECT ) T=XMMatrixRotationY(angle); //對于aircraft,繞著up向量旋轉 if( _cameraType == AIRCRAFT ) T=XMMatrixRotationAxis(_up, angle); // 繞著up或者y軸,旋轉right和look _right=XMVector3TransformCoord(_right, T); _look=XMVector3TransformCoord(_look, T); } void XCamera::roll(float angle) { //僅僅對aircraft模式才左roll旋轉 if( _cameraType == AIRCRAFT ) { D3DXMATRIX T; T=XMMatrixRotationAxis(_look, angle); // 繞著look向量,旋轉up和right _right=XMVector3TransformCoord(_right, T); _up=XMVector3TransformCoord(_up, T); } } */ void XCamera::getViewMatrix(XMMATRIX &V) { XMVECTOR vlook,vup,vright,vpos; vpos=XMLoadFloat3(&_pos); vlook=XMLoadFloat3(&_look); vup=XMLoadFloat3(&_up); vright=XMLoadFloat3(&_right); // 保持view局部坐標系,各軸的彼此正交 vlook=XMVector3Normalize(vlook); // look X right vup=XMVector3Cross(vlook, vright); vup=XMVector3Normalize(vup); vright=XMVector3Cross(vup, vlook); vright=XMVector3Normalize(vright); V=XMMatrixLookAtLH( vpos,vlook, vup); // 生成view矩陣: //float x = -D3DXVec3Dot(&_right, &_pos); //float y = -D3DXVec3Dot(&_up, &_pos); //float z = -D3DXVec3Dot(&_look, &_pos); //(*V)(0,0) = _right.x; (*V)(0, 1) = _up.x; (*V)(0, 2) = _look.x; (*V)(0, 3) = 0.0f; //(*V)(1,0) = _right.y; (*V)(1, 1) = _up.y; (*V)(1, 2) = _look.y; (*V)(1, 3) = 0.0f; //(*V)(2,0) = _right.z; (*V)(2, 1) = _up.z; (*V)(2, 2) = _look.z; (*V)(2, 3) = 0.0f; //(*V)(3,0) = x; (*V)(3, 1) = y; (*V)(3, 2) = z; (*V)(3, 3) = 1.0f; } void XCamera::setCameraType(CameraType cameraType) { _cameraType = cameraType; }


凝視掉的地方是一個坑。為什么呢。

以下就要講XMVECTOR 和XMFloat3的差別

前者是向量。后者就是一個點結構

前者支持各種運算。

差 點 ?乘 加減

后者 僅僅能賦值啊什么的。

是不是特別奇怪。

由于XMVECTOR

看源代碼

// Vector intrinsic: Four 32 bit floating point components aligned on a 16 byte 
// boundary and mapped to hardware vector registers
#if defined(_XM_SSE_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_)
typedef __m128 XMVECTOR;
#else

128位懂了吧。不能隨便玩, 不然會報錯 涉及到對齊問題

上節說了。全局變量和局部變量能夠用XMVECTOR 可是類變量不建議用

偏偏這個攝像機是類變量。

作死啊。僅僅有設成XMFloat3了

看源代碼

// 3D Vector; 32 bit floating point components
typedef struct _XMFLOAT3
{FLOAT x;FLOAT y;FLOAT z;#ifdef __cplusplus_XMFLOAT3() {};_XMFLOAT3(FLOAT _x, FLOAT _y, FLOAT _z) : x(_x), y(_y), z(_z) {};_XMFLOAT3(CONST FLOAT *pArray);_XMFLOAT3& operator= (CONST _XMFLOAT3& Float3);#endif // __cplusplus

32位的 僅僅能賦值 怎么玩 怎么玩?

上面攝像機類加凝視了的函數是之前悲劇了的,我以為Float能夠做運算。結果悲劇了。

后來查了一下。 能夠用一個轉換

XMVECTOR vpos,vright;vpos=XMLoadFloat3(&_pos);vright=XMLoadFloat3(&_right);// 僅在x,z平面移動if( _cameraType == LANDOBJECT )vpos += XMVectorSet(_right.x, 0.0f, _right.z,0.0f) * units;if( _cameraType == AIRCRAFT )vpos += vright * units;XMStoreFloat3(&_pos,vpos);

看懂了嗎 看懂了嗎。 先load 把float裝到vector局部變量 ?然后進行運算

運算完畢后 ?再store?

是不是非常煩

是不是

沒辦法。

眼下我僅僅會這樣弄。你嫌煩 直接全局變量吧。

或者回歸dx10math.h?

廢話不說 效果圖。

僅僅改了walk函數。 其它自己改改吧,鍛煉下自己

//(*V)(0,0) = _right.x; (*V)(0, 1) = _up.x; (*V)(0, 2) = _look.x; (*V)(0, 3) = 0.0f;//(*V)(1,0) = _right.y; (*V)(1, 1) = _up.y; (*V)(1, 2) = _look.y; (*V)(1, 3) = 0.0f;//(*V)(2,0) = _right.z; (*V)(2, 1) = _up.z; (*V)(2, 2) = _look.z; (*V)(2, 3) = 0.0f;//(*V)(3,0) = x;        (*V)(3, 1) = y;     (*V)(3, 2) = z;       (*V)(3, 3) = 1.0f;

對了還有上面這個。原教程是直接這樣算的一個矩陣,麻煩吧。

麻煩吧。 懂不起含義了吧 快看龍書就懂了。

懂了之后怎么辦。還敲這么多??

V=XMMatrixLookAtLH( vpos,vlook, vup);

一句話搞定。就不要造輪子了

轉載于:https://www.cnblogs.com/jhcelue/p/7141917.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/370047.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/370047.shtml
英文地址,請注明出處:http://en.pswp.cn/news/370047.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

騰訊吃雞 android,騰訊吃雞手游《光榮使命》正式上線:安卓/iOS不限號測試

IT之家11月29日消息 今天下午&#xff0c;騰訊首款百人戰術競技手游《光榮使命》在安卓、iOS雙平臺正式上線&#xff0c;開啟全面測試。(官網下載&#xff1a;點此鏈接&#xff0c;雙平臺已開放下載。)該游戲采用第三人稱射擊視角&#xff0c;玩家化身參與“使命行動”軍事演習…

lazada鋪貨模式的選品_lazada小白的運營難點→鋪貨與精細化運營的優劣勢詳解

lazada是鋪貨還是精細化經營第一種鋪貨鋪貨作為平臺早期都是比較受歡迎的&#xff0c;平臺的蠻荒期&#xff0c;成長期當中&#xff0c;鋪貨的商家是非常受歡迎的&#xff0c;因為平臺需要更多SKU產品&#xff0c;去吸引買家&#xff0c;鋪貨這個時候是最好的也是能最快的成長起…

ife 零基礎學院 day 2

第二天&#xff1a;給自己做一個在線簡歷吧 最后的驗證&#xff0c;提出了幾個問題&#xff0c;嘗試解答一下 HTML是什么&#xff0c;HTML5是什么 HTML的定義摘抄自w3school的HTML 簡介 HTML 是用來描述網頁的一種語言。 HTML 指的是超文本標記語言 (Hyper Text Markup Langua…

excel數據生成sql?insert語句

excel數據生成sql insert語句 excel表格中有A、B、C三列數據&#xff0c;希望導入到數據庫users表中&#xff0c;對應的字段分別是name,sex,age 。 在你的excel表格中增加一列&#xff0c;利用excel的公式自動生成sql語句&#xff0c;方法如下&#xff1a; 1、增加一列&#xf…

Java中的推斷異常

借用和竊取其他語言的概念和想法總是很高興的。 Scala的Option是我真正喜歡的一個主意&#xff0c;因此我用Java編寫了一個實現。 它包裝了一個可能為null或不為null的對象&#xff0c;并提供了一些可按某種功能使用的方法。 例如&#xff0c;isDefined方法添加了一種面向對象的…

重載,覆蓋,隱藏

轉載于:https://www.cnblogs.com/jhcelue/p/7145525.html

Animate.css介紹

Animate.css簡介 animate.css 動畫庫&#xff0c;預設了抖動&#xff08;shake&#xff09;、閃爍&#xff08;flash&#xff09;、彈跳&#xff08;bounce&#xff09;、翻轉&#xff08;flip&#xff09;、旋轉&#xff08;rotateIn/rotateOut&#xff09;、淡入淡出&#x…

logstash 吞吐量優化_1002-談談ELK日志分析平臺的性能優化理念

在生產環境中&#xff0c;我們為了更好的服務于業務&#xff0c;通常會通過優化的手段來實現服務對外的性能最大化&#xff0c;節省系統性能開支&#xff1b;關注我的朋友們都知道&#xff0c;前段時間一直在搞ELK&#xff0c;同時也記錄在了個人的博客篇章中&#xff0c;從部署…

spark SQL(三)數據源 Data Source----通用的數據 加載/保存功能

Spark SQL 的數據源------通用的數據 加載/保存功能 Spark SQL支持通過DataFrame接口在各種數據源上進行操作。DataFrame可以使用關系變換進行操作&#xff0c;也可以用來創建臨時視圖。將DataFrame 注冊為臨時視圖允許您對其數據運行SQL查詢。本節介紹使用Spark Data Sou…

sqlserver日期函數

SQLServer時間日期函數詳解,SQLServer,時間日期, 1. 當前系統日期、時間 select getdate() 2. dateadd 在向指定日期加上一段時間的基礎上&#xff0c;返回新的 datetime 值 例如&#xff1a;向日期加上2天 select dateadd(day,2,2004-10-15) --返回&#xff1a…

榮耀鴻蒙系統開機動畫,榮耀趙明:鴻蒙系統首發設備欲屏蔽開機廣告

來源&#xff1a;硅谷分析獅余承東表示8月9日會發布鴻蒙系統&#xff0c;而從他透露的一些細節看&#xff0c;鴻蒙系統將首先運用在智慧屏終端上&#xff0c;其配合大屏幕和自研芯片(麒麟AI芯片&#xff0c;鴻鵠智慧顯示芯片&#xff0c;凌霄WIFI芯片)&#xff0c;將實現生態上…

編寫Maven插件的提示

最近&#xff0c;我花了很多時間來編寫或為Maven開發插件。 它們簡單&#xff0c;有趣且有趣。 我以為我會分享一些技巧&#xff0c;使他們在編寫時變得更輕松。 提示1&#xff1a;將任務與Mojo分開 最初&#xff0c;您將把mojo的所有代碼放入mojo的類&#xff08;即&#xf…

oracle通信通道的文件結尾_ORA-03113:通信通道的文件結尾解決

提示ORA-03113&#xff1a;通信通道的文件結尾解決事情原由&#xff1a;oracle安裝到win7下&#xff0c;以為都是直接sqlplus / as sysdba&#xff0c;使用數據庫&#xff0c;但最近連接時頻繁報錯&#xff0c;提示ORA-03113&#xff1a;通信通道的文件結尾進程 ID &#xff1a…

Python_迭代器與生成器

迭代器 迭代是Python最強大的功能之一&#xff0c;是訪問集合元素的一種方式。。 迭代器是一個可以記住遍歷的位置的對象。 迭代器對象從集合的第一個元素開始訪問&#xff0c;直到所有的元素被訪問完結束。迭代器只能往前不會后退。 迭代器有兩個基本的方法&#xff1a;iter()…

JSOI 2009 BZOJ 1444 有趣的游戲

題面 題目描述 小陽陽發明了一個有趣的游戲&#xff1a;有n個玩家&#xff0c;每一個玩家均有一個長度為 l 的字母序列&#xff0c;任何兩個玩家的字母序列不同。共有m種不同的字母&#xff0c;所有的字母序列都由這m種字母構成&#xff0c;為了方便&#xff0c;我們取大寫字母…

html語言dl與ul,HTML中DL、UL、OL用哪個比較好

大家好~ 我是一枚正直純潔的苦逼程序員&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;ul&#xff0c;ol&#xff0c;dl標簽是CSS網頁布局中常用的列表元素。 列表將具有相似特征或先后順序的內容按照從上到下的順序排列起來。1.ul標簽&#xff1a;無序列表始于…

slot多作用域 vue_詳解Vue.js 作用域、slot用法(單個slot、具名slot)

作用域HEi免費資源網在介紹slot前&#xff0c;需要先知道一個概念&#xff1a;編譯的作用域。比如父組件中有如下模板&#xff1a;HEi免費資源網{{message}}這里的message就是一個slot&#xff0c;但是它綁定的是父組件的數據&#xff0c;而不是組件< child-component >的…

Java – JDK 8的遠景

世界正在緩慢但肯定地發生變化。 經過更改后&#xff0c;Java有了JDK 7的全新外觀&#xff0c;Java社區期待JDK 8&#xff08;可能還有JDK 9&#xff09;所帶來的其余改進。 JDK 8的目標目的是填補JDK 7實施中的空白-該實施中剩下的部分難題&#xff0c;應該在2013年底之前為廣…

CSS 學習路線(一)元素

元素(element) 類型:替換和非替換元素 替換元素(replaced element): 用來替換元素內容的部分并非由文檔內容直接顯示. eg:img input 非替換元素(nonreplaced element): 其內容由用戶代理在元素本身生成的框顯示. eg:絕大多數都是非替換元素 基本元素類型:塊級(block-lev…

[urllib]urlretrieve在python3

python3下面要使用&#xff1a;urllib.request.urlretrieve()這種形式的調用 1 from urllib.request import urlretrieve 2 3 4 urlretrieve(url, path) 轉載于:https://www.cnblogs.com/sigai/p/8178375.html