我使用鼠标控制相机在我的程序中的旋转(使用DirectX9.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”向量的旋转。我认为这是因为计算时的错误,但我不知道如何消除或控制它。有什么想法吗?
发布于 2014-02-25 02:10:06
这是一个常见的问题。您应用了许多旋转,并且随着时间的推移,舍入错误之和。过了一段时间后,三个向量vUp
、vLook
和vRight
不再是归一化和正交的。我会使用两种选择之一:
vLook
和vRight
;相反,只需存储两个角度。假设x是对的,y是顶的,z是返回的,存储a)视图轴和xz平面之间的角度,b)视图轴在xz平面上的投影与z轴或x轴之间的角度。根据鼠标移动更新这些角度,并从它们中计算vLook
和vRight
。vRight
的y-组件设置为0,因为vRight
应该在xz-平面上。然后再对向量进行正交化(你知道向量应该是垂直的,长度为1)。因此,在计算新的vLook
和vRight
之后,应用以下更正:vRight.y = 0
vRight = Normalize(vRight)
vUp = Normalize(Cross(vLook, vRight))
vLook = Normalize(Cross(vRight, vUp))
https://stackoverflow.com/questions/21988150
复制相似问题