直接相机旋转的错误控制?

时间:2014-02-24 12:42:49

标签: c++ camera directx

我使用鼠标控制程序中的相机旋转(使用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”向量的旋转已经发生。我认为这是因为计算时的错误,但我不知道如何消除它或控制它。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

这是一个常见问题。您应用了许多旋转,并且随着时间的推移,舍入误差总结。过了一会儿,三个向量vUpvLookvRight不再标准化和正交。 我会使用以下两个选项之一:

1。 不要存储vLookvRight;相反,只存储2个角度。假设x是正确的,y是顶部,z是返回,存储a)视轴和xz平面之间的角度,b)视轴在xz平面上的投影与z轴之间的角度或x轴。根据鼠标移动更新这些角度,并从中计算vLookvRight

2。 将vRight的y分量设置为0,因为vRight应该在xz-Plane中。然后对矢量进行重新正规化(你知道矢量应该彼此垂直并且长度为1)。因此,在计算新的vLookvRight后,请应用以下更正:

vRight.y = 0
vRight = Normalize(vRight)
vUp = Normalize(Cross(vLook, vRight))
vLook = Normalize(Cross(vRight, vUp))