DirectX圖形介面指南的介紹(轉)

post0發表於2007-08-12
DirectX圖形介面指南的介紹(轉)[@more@]

  第一人稱視角變換主要是view transformation matrix的變換。其實就是不斷變動eye point和camera look-at target的座標。具備基本的三維數學和矩陣運算技巧就可以了。

  

  要弄清視角移動和轉動的原理,有必要先看看DX文件的Matrices和View Transformation章節。文件的相關3D數學原理和距陣計算以及介面方法搞清楚了。下面的工作就相當簡單。

  

  首先定義D3DXVECTOR3 VDot,VAtPoint,VUp;

  

  視景的移動

  

  前後移動和左右移動

  

  其實就是同時移動VDot和VAtPoint,即同時移動眼睛的位置和眼睛所看到的點的位置。程式碼比較簡單。udragon在他的主頁上有一段程式碼很清楚。可以參考:http:/

  

  視角的轉動

  

  原理就是繞透過VDot的向量VUp旋轉VDot。即相當於站在原地旋轉Camera。udragon在他的主頁上關於視角旋轉的程式碼寫得思路比較晦澀難懂,主要是他的思路比較特殊,幾乎在程式裡把某點繞軸旋轉的公式按數學證明推導了一遍。其實如果數學運算得當以及合理運用D3D介面方法,這段程式碼可以簡化許多:

  

  可能用到的變數

  D3DXVECTOR3 pOut;

  D3DXVECTOR3 pOut2;

  D3DXVECTOR3 ab;

  D3DXVECTOR3 ac;

  D3DXVECTOR4 Vtemp;

  D3DXMATRIX R,RT,R2;

  

  //左右移動

  D3DXVec3Normalize(&pOut,&ac);

  `

  RT = D3DXMATRIX(1, 0, 0, 0,

  0, 1, 0, 0,

  0, 0, 1, 0,

  -VDot.x, -VDot.y, -VDot.z, 1);

  

  D3DXMatrixRotationAxis( &R2, &pOut, u);

  R = RT * R2;

  RT = D3DXMATRIX(1, 0, 0, 0,

  0, 1, 0, 0,

  0, 0, 1, 0,

  VDot.x, VDot.y, VDot.z, 1);

  R = R * RT;

  D3DXVec3Transform(&Vtemp, &VAtPoint, &R);

  VAtPoint.x = Vtemp.x;

  VAtPoint.y = Vtemp.y;

  VAtPoint.z = Vtemp.z;

  

  

  //上下移動

  s1 = D3DXVec3Length(&ab)*D3DXVec3Length(&VUp);

  s2 = (float)acos(D3DXVec3Dot(&ab, &VUp)/s1);

  if(u>0)

  {

  if(s2<=0.018)

  break;

  }//一度

  else

  if(s2>=3.124)

  break;

  D3DXVec3Cross(&pOut,&ab,&ac);

  D3DXVec3Normalize(&pOut2,&pOut);

  

  

  RT = D3DXMATRIX(1, 0, 0, 0,

  0, 1, 0, 0,

  0, 0, 1, 0,

  -VDot.x, -VDot.y, -VDot.z, 1);

  D3DXMatrixRotationAxis( &R2, &pOut2, u);

  R = RT * R2;

  RT = D3DXMATRIX(1, 0, 0, 0,

  0, 1, 0, 0,

  0, 0, 1, 0,

  VDot.x, VDot.y, VDot.z, 1);

  R = R * RT;

  D3DXVec3Transform(&Vtemp, &VAtPoint, &R);

  VAtPoint.x = Vtemp.x;

  VAtPoint.y = Vtemp.y;

  VAtPoint.z = Vtemp.z

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8225414/viewspace-951744/,如需轉載,請註明出處,否則將追究法律責任。

相關文章