第一人称视角变换主要是view transformation matrix的变换其实就是不断变动eye point和camera lookat target的坐标具备基本的三维数学和矩阵运算技巧就可以了 要弄清视角移动和转动的原理有必要先看看DX文档的Matrices和View Transformation章节文档的相关D数学原理和距阵计算以及接口方法搞清楚了下面的工作就相当简单 首先定义DDXVECTOR VDotVAtPointVUp; 视景的移动 前后移动和左右移动 其实就是同时移动VDot和VAtPoint即同时移动眼睛的位置和眼睛所看到的点的位置代码比较简单udragon在他的主页上有一段代码很清楚可以参考 视角的转动 原理就是绕通过VDot的矢量VUp旋转VDot即相当于站在原地旋转Cameraudragon在他的主页上关于视角旋转的代码写得思路比较晦涩难懂主要是他的思路比较特殊几乎在程序里把某点绕轴旋转的公式按数学证明推导了一遍其实如果数学运算得当以及合理运用DD接口方法这段代码可以简化许多 可能用到的变量 DDXVECTOR pOut; DDXVECTOR pOut; DDXVECTOR ab; DDXVECTOR ac; DDXVECTOR Vtemp; DDXMATRIX RRTR; //左右移动 DDXVecNormalize(&pOut&ac); ` RT = DDXMATRIX( VDotx VDoty VDotz ); DDXMatrixRotationAxis( &R &pOut u); R = RT * R; RT = DDXMATRIX( VDotx VDoty VDotz ); R = R * RT; DDXVecTransform(&Vtemp &VAtPoint &R); VAtPointx = Vtempx; VAtPointy = Vtempy; VAtPointz = Vtempz; //上下移动 s = DDXVecLength(&ab)*DDXVecLength(&VUp); s = (float)acos(DDXVecDot(&ab &VUp)/s); if(u>) { if(s<=) break; }//一度 else if(s>=) break; DDXVecCross(&pOut&ab&ac); DDXVecNormalize(&pOut&pOut); RT = DDXMATRIX( VDotx VDoty VDotz ); DDXMatrixRotationAxis( &R &pOut u); R = RT * R; RT = DDXMATRIX( VDotx VDoty VDotz ); R = R * RT; DDXVecTransform(&Vtemp &VAtPoint &R); VAtPointx = Vtempx; VAtPointy = Vtempy; VAtPointz = Vtempz; |