繁体   English   中英

DirectX相机旋转的错误控制?

[英]Error control of directx camera rotation?

我使用鼠标来控制程序中的相机旋转(使用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); } 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); } 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); }假设围绕Up或Right向量的旋转不应导致围绕“ LookAt”向量的旋转,但是如果我将鼠标转一圈并在起点处停止,则发生了围绕“ LookAt”向量的旋转。 我认为这是因为计算时出现错误,但我不知道如何消除或控制它。 任何想法?

这是一个普遍的问题。 您应用许多旋转,随着时间的推移,四舍五入误差加起来。 一段时间后,三个向量vUpvLookvRight不再归一化并且正交。 我将使用以下两个选项之一:

1.不要存储vLookvRight 相反,只需存储2个角度。 假设x是正确的,y是顶部,z是后退,请存储a)视图轴与xz平面之间的角度,以及b)视图轴在xz-Plane上的投影与z轴之间的角度或x轴。 根据鼠标移动来更新这些角度,并vRight计算vLookvRight

2.将vRight的y分量设置为0,因为vRight应该在xz平面中。 然后重新正交化向量(您知道向量应该彼此垂直并且长度为1)。 因此,在计算了新的vLookvRight ,请应用以下更正:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM