2013-03-26 68 views
2

我有一个以球体表面上的一个点为中心的3D摄像头。它遵循并完美地旋转,除了在球体的两极之外。请注意,球体实际上是投影到球体的立方体,以便于位置坐标的管理。摄像头看着一个球体 - 杆子包裹

如果对象在球体周围水平移动,则摄像机按预期工作。但是,如果物体穿过球体的顶部或底部的极点,则摄像机会缠绕在极点上。如果它直线穿过杆子,它会在穿过杆子时转动180度。

我明白为什么会发生这种情况 - 必须有一个全局的Up向量才能知道如何定位自己。如果我将其向上方向更改为不同的方向,例如右侧,相机将不再翻转顶部或底部的杆,而是在球体的左右两极展现相同的行为。

我的问题是如何改变我的相机的行为,这样就不会发生。我想让我的相机感觉到,相机处于一个恒定的位置,看着球体,球体在X轴和Z轴上旋转。我知道这可能导致“错误的”方向 - 例如,如果用户从球体的前表面开始,向上,然后离开,它们将最终在球体的左侧,但是相机在其Z轴上旋转90度,而如果它们从前面开始并直接移动到左侧,则不会旋转。这很好,因为我可以检测相机何时穿过脸部并缓慢“修复”相机的本地旋转,或允许用户解锁相机,并且可以自己处理相机的角度。

仅供参考,我的相机是目前正在使用中这个问题的解决计算: Camera rotation aligned to arbitrary plane

任何有识之士将不胜感激!

+0

看看SketchUp的旋转模型。当你穿过两极时,它们会反转向上的方向。 – 2013-03-26 14:01:53

+0

你如何做球体周围的旋转?矩阵或四元数? – Kobunite 2013-03-26 14:30:43

回答

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) 
+0

不幸的是,我不能这样做,因为相机,球体和球体上的物体必须位于世界空间中。我链接的线索解释了我如何设置事物;我不明确的道歉。 – Stardreamer 2013-03-26 18:31:12

+0

是的,您可以:您只需要弄清楚应用旋转的位置。实质上,您需要将您的相机放在球体的中心,并在那里应用旋转。 (请注意,相机转换是从相应的父母层次结构的矩阵堆栈的“另一端”反向应用的) – comingstorm 2013-03-26 19:00:27