在看了《無極》,看了《逃出克隆島》,看了《情癲大圣》以后,又把《friends》看到了season7,在感覺到一個人的節日極其無聊之后連續打了兩天籃球,打到肌肉拉傷、疲憊,渾身像散了架子一樣,然后沒日沒夜的睡覺用來休息,就這樣,墮落的元旦假期過去了。
struts Object{D3DMATRIX matLocal;}
D3DXVec3Normalize(&vLook,&vLook);D3DXVec3Cross(&vRight,&vUp,&vLook);D3DXVec3Normalize(&vRight,&vRight);D3DXVec3Cross(&vUp,&vLook,&vRight);D3DXVec3Normalize(&vUp,&vUp);
m_pObjects[0].matLocal._11 = vRight.x;m_pObjects[0].matLocal._12 = vRight.y;m_pObjects[0].matLocal._13 = vRight.z;m_pObjects[0].matLocal._21 = vUp.x;m_pObjects[0].matLocal._22 = vUp.y;m_pObjects[0].matLocal._23 = vUp.z;m_pObjects[0].matLocal._31 = vLook.x;m_pObjects[0].matLocal._32 = vLook.y;m_pObjects[0].matLocal._33 = vLook.z;m_pObjects[0].matLocal._41 = vPos.x;m_pObjects[0].matLocal._42 = vPos.y;m_pObjects[0].matLocal._43 = vPos.z;
- 確定旋轉角度和旋轉軸。
- 取出當前的vRight,vLook,vUp,vPos向量;
- 對三個向量進行歸一化;
- 利用D3DMatrixRotationAxis(D3DXMatrix* mat,D3DXVector* vAxis,FLOAT fRad)產生旋轉矩陣;
- 利用D3DXVectorTransformCoord(D3DXVector* vNew,D3DXVector* vOld,D3DXMatrix* mat)對當前的vRight,vLook,vUp向量進行變換,得到新的vRight,vLook,vUp向量。
- 移動位置,獲得新的vPos;
- 將新的vRight,vLook,vUp,vPos向量設置到matLocal中。
----------------------------
上邊的表示方法我們看到要7個過程,這略微有些復雜,那么下面我們來看另外一種簡潔的計算方法-四元數(Quaternion)。
我們先對比一下實現的差別,然后再具體解釋API的含義。
- 確定旋轉角度和旋轉軸。
- 利用D3DXQuaternionRotationYawPitchRoll(D3DXMatrix* mat,Float fYaw,FLOAT fPitch,FLOAT fRoll)的到變換矩陣。
- 把上述得到的矩陣同matLocal相乘得到新的matLocal;
- 做位置的變換。
四元數的原理有點復雜,由于速成關系我也沒有怎么看,只是知道可以簡單想象成一個向量加上一次旋轉,具體的運算推導有機會再研究吧。但這個東西用途的確很廣泛,因此被作為一種專門的方法被D3D介紹。
上邊只用到了一個API,那就是D3DXQuaternionRotationYawPitchRoll(D3DXMatrix* mat,Float fYaw,FLOAT fPitch,FLOAT fRoll),給定繞三個軸的旋轉角度,返回一個變換矩陣。
-----------------------------
下邊看一下觀察變換,觀察矩陣同物體定位矩陣唯一不同的就是其存儲方式,它采取列向量的存儲方式。相機的各種變換同物體的變換沒有任何不同,最后也是得到一個矩陣,只是D3D提供了一個根據視點位置,相機朝向和向上方向構造矩陣的函數:D3DXMatrixLookAtLH(D3DXMatrix* mat,D3DXVECTOR3* pEye,D3DXVECTOR3* pAt,D3DXVECTOR3* pUp),省著自己算了。最后用m_pd3Device->SetTransform(D3DTS_VIEW,&mat)設置一下就可以了。
這里需要注意的是D3DXMatrixLookAtLH()只適合于簡單的頭罩式顯示或者視點跟隨,對于具有復雜旋轉的飛行模擬器這類相機最好還是自己來算。計算的方式同前邊介紹的物體變換的方式一樣,也有兩種方式,一種是復雜的7步變換,一種是簡單的四元數變換。最后將得到的向量按照列向量的形式賦給視矩陣,再利用SetTransform()設置一下就好了。這實際上是一種自己維護相機的方式。
------------------------------
下面看一下投影變換。提到投影就會想到視錐,就會有視域角(FOV-field of view)、寬高比(aspect)和遠近裁減面這四個參數。在D3D里邊可以利用D3DXMatrixPerspectiveFoVLH(D3DXMATRIX* pOut,FLOAT fovY,FLOAT Aspect,FLOAT zn,FLOAT zf),通過給定的四個參數獲得投影矩陣,然后用m_pd3Device->SetTranform(D3DTS_PROJECTION,&pOut)來設置投影矩陣即可。








