【问题标题】:Error control of directx camera rotation?directx相机旋转的错误控制?
【发布时间】:2014-02-24 12:42:48
【问题描述】:

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

【问题讨论】:

  • 您可能想尝试在第一种方法中旋转(0, 1, 0)
  • @NicoSchertler:事实上,我确实想围绕 vUp 而不是 (0,1,0) 旋转。我在回复 cdoubleplusgood 时解释了我的错误。感谢您的帮助

标签: c++ camera directx


【解决方案1】:

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

1。 不要存储vLookvRight;相反,只需存储 2 个角度。假设 x 是正确的,y 是顶部,z 是后部,存储 a)您的视图轴与 xz 平面之间的角度,以及 b)您的视图轴在 xz 平面上的投影与 z 轴之间的角度或 x 轴。根据鼠标移动更新这些角度并从中计算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))

【讨论】:

  • 感谢您的建议。我发现我犯的错误是“围绕向上或向右矢量旋转不应导致围绕 Look 矢量旋转”。事实上,在绕vUp旋转角度α,然后绕vRight旋转角度β之后,我们只能通过围绕vRight旋转角度-beta然后再围绕vUp旋转角度-alpha,而不是通过旋转来回到原点状态。围绕 vUp 获得角度 -alpha,然后围绕 vRight 旋转获得角度 -beta。所以当我把鼠标转一圈回到起点时,相机就无法回到原来的状态。
  • 是的,Nico 已经给出了正确的答案。我错过了这一点。然而,向量的非规范化也可能是一个真正的问题。
猜你喜欢
  • 2015-01-30
  • 1970-01-01
  • 2015-04-18
  • 1970-01-01
  • 1970-01-01
  • 2022-09-23
  • 1970-01-01
  • 2019-08-09
  • 2018-02-22
相关资源
最近更新 更多