第一人称视角变换



  第人称视角变换主要是view transformation matrix变换其实就是不断变动eye po和camera look-at target坐标具备基本 3维数学和矩阵运算窍门技巧就可以了

要弄清视角移动和转动原理有必要先看看DX文档Matrices和View Transformation章节文档相关3D数学原理和距阵计算以及接口思路方法搞清楚了下面工作就相当简单

首先定义D3DXVECTOR3 VDotVAtPoVUp;

视景移动

前后移动和左右移动

其实就是同时移动VDot和VAtPo即同时移动眼睛位置和眼睛所看到位置代码比较简单udragon在他主页上有段代码很清楚可以参考:http:/www.udragon.net/ZHZX/3d-5.htm

视角转动

原理就是绕通过VDot矢量VUp旋转VDot即相当于站在原地旋转Cameraudragon在他主页上有关视角旋转代码写得思路比较晦涩难懂主要是他思路比较特殊几乎在里把某点绕轴旋转公式按数学证明推导了其实如果数学运算得当以及合理运用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, &VAtPo, &R);
VAtPo.x = Vtemp.x;
VAtPo.y = Vtemp.y;
VAtPo.z = Vtemp.z;


//上下移动
s1 = D3DXVec3Length(&ab)*D3DXVec3Length(&VUp);
s2 = (float)acos(D3DXVec3Dot(&ab, &VUp)/s1);
(u>0)
{
    (s2<=0.018)
    ;
}//

(s2>=3.124)
    ;
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, &VAtPo, &R);
VAtPo.x = Vtemp.x;
VAtPo.y = Vtemp.y;
VAtPo.z = Vtemp.z;
Tags: 

延伸阅读

最新评论

发表评论