2

我有一个以球体表面上的点为中心的 3D 相机。它完美地跟随并围绕它旋转,除了球体的两极。请注意,球体实际上是投影到球体的立方体,以便于管理位置坐标。

如果对象在球体周围水平移动,则相机按预期工作。但是,如果对象向球体的顶部或底部极点移动,则相机会环绕该极点。如果它直接穿过杆子,它会在穿过时出现 180 度转弯。

我理解为什么会发生这种情况 - 必须有一个全局 Up 向量让相机知道如何定位自己。如果我将其向上矢量更改为不同的方向,例如向右,则相机不再围绕顶部或底部极点翻转,而是在球体的左右两极上表现出相同的行为。

我的问题是如何改变我的相机的行为,这样就不会发生这种情况。我想让我的相机感觉好像相机处于恒定位置,看着球体,球体在其 X 和 Z 轴上旋转。

我意识到这可能会导致“错误”的方向 - 例如,如果用户从球体的正面开始,向上然后向左,他们最终会在球体的左侧但相机旋转 90 Z 轴上的度数,而如果它们从正面开始并直接移动到左侧面,则不会旋转。这很好,因为我可以检测相机何时穿过脸部并慢慢“修复”相机的局部旋转,或者允许用户解锁相机并且他们可以自己处理相机的角度。

作为参考,我的相机目前正在使用此问题中的解决方案进行计算: 相机旋转与任意平面对齐

任何见解将不胜感激!

4

1 回答 1

1

如果您希望球体像轨迹球一样,请按照用户控件的指定对旋转矩阵应用增量旋转(例如,x 轴和 y 轴)。

您仍然需要在更新后“重新规范化”旋转矩阵 - 否则,数值错误将蔓延,您的旋转矩阵最终将不是旋转矩阵。计算应该是这样的:

update =  RotX(userInput.dX) * RotY(userInput.dY)
rawUpdatedRot = userRot * update
newZ = Normalize( Cross(rawUpdatedRot.x, rawUpdatedRot.y) )
newY = Normalize( Cross(newZ, rawUpdatedRot.x) )
newX = Normalize( rawUpdatedRot.x )
userRot = Matrix(newX, newY, newZ)
于 2013-03-26T17:23:41.680 回答