我使用鼠标控制程序中的相机旋转(使用Directx 9.0c)。鼠标X控制相机围绕向上矢量旋转,鼠标Y控制围绕右矢量旋转。旋转计算如下:
void Camera::RotateCameraUp(float angle)
{
D3DXMATRIX RoMatrix;
D3DXMatrixRotationAxis(&RoMatrix, &vUp, angle);
D3DXVec3TransformCoord(&vLook, &vLook, &RoMatrix);
D3DXVec3TransformCoord(&vRight, &vRight, &RoMatrix);
}
void Camera::RotateCameraRight(float angle)
{
D3DXMATRIX RoMatrix;
D3DXMatrixRotationAxis(&RoMatrix, &vRight, angle);
D3DXVec3TransformCoord(&vLook, &vLook, &RoMatrix);
D3DXVec3TransformCoord(&vUp, &vUp, &RoMatrix);
}
假设围绕向上或向右矢量的旋转不应导致围绕“LookAt”向量旋转,但如果我将鼠标旋转一段时间并在起始点停止,围绕“LookAt”向量的旋转已经发生。我认为这是因为计算时的错误,但我不知道如何消除它或控制它。有什么想法吗?
答案 0 :(得分:0)
这是一个常见问题。您应用了许多旋转,并且随着时间的推移,舍入误差总结。过了一会儿,三个向量vUp
,vLook
和vRight
不再标准化和正交。
我会使用以下两个选项之一:
1。
不要存储vLook
和vRight
;相反,只存储2个角度。假设x是正确的,y是顶部,z是返回,存储a)视轴和xz平面之间的角度,b)视轴在xz平面上的投影与z轴之间的角度或x轴。根据鼠标移动更新这些角度,并从中计算vLook
和vRight
。
2。
将vRight
的y分量设置为0,因为vRight
应该在xz-Plane中。然后对矢量进行重新正规化(你知道矢量应该彼此垂直并且长度为1)。因此,在计算新的vLook
和vRight
后,请应用以下更正:
vRight.y = 0
vRight = Normalize(vRight)
vUp = Normalize(Cross(vLook, vRight))
vLook = Normalize(Cross(vRight, vUp))