2013-11-01 49 views
1

我有一台需要在物体周围局部围绕轨道的摄像机。该对象具有任意旋转,由法向量描述。设想一个球形行星,用相机低头看着那个星球上的某个三角形。正常矢量的旋转矩阵,围绕着极点翘曲

我目前的实现是使用经典的矢量交叉法从三角形的法线生成旋转矩阵,然后使用该矩阵作为标准轨道相机的基础。这个星球在赤道附近工作的很好,但是一旦它接近极点,它就会开始爆炸,相机的行为越来越不规律,越接近极点的中心。

我确定这是由于第一个矢量叉,因为在这种情况下两个矢量彼此靠近 - 我不确定这个现象的技术名称是什么。如果第一个矢量是0,1,0,当法线接近0,1,0或0,-1,0时发生疯狂。

我发现这个问题的相当多的描述,但没有工作方案。我来的最近的是这里:http://xboxforums.create.msdn.com/forums/p/13278/13278.aspx它提到,为了处理'奇点',当它被检测到时使用不同的矢量。我可以很容易地确定摄像机在行星表面上何时会导致这种情况发生(因为我的行星球体是从投影到球形坐标的6个四叉树产生的),但是当我切换到新的矢量时,会有一个非常明显的瞬间。

下面是当前的代码:

Vector3 triNormal; //the current normal of the target vertex 
Vector3 origin = Vector3.Forward; 
Matrix orientation.Forward = origin; 

orientation.Up = triNormal; 
orientation.Right = Vector3.Cross(orientation.Up, orientation.Forward); 
orientation.Right.Normalize(); 
orientation.Forward = Vector3.Cross(orientation.Right, orientation.Up); 
orientation.Forward.Normalize(); 

我和检测时三正是极面的一个,并设置“原点”到别的东西,如权试点。一旦它在脸上,照相机就会正常运行,但是当它穿过时,它会立即捕捉到新的旋转。这是有道理的,因为它的参考向量刚刚发生了变化,但为了顺利的用户体验需要消除。我试图找出如何抵消相机对轨道相机的偏航以抵消新的坐标系,但它似乎不是一个常数值,这取决于相机当前瞄准的球体的位置。我不知道我怎么能计算出差别。

还要注意,因为它在XNA和C#中,所以我使用的是右手坐标系。

回答

0

我不明白你为什么这样做:

orientation.Forward = Vector3.Cross(orientation.Right, orientation.Up); 
orientation.Forward.Normalize(); 
当您已经使用了以前 orientation.Forward获得 orientation.Right


(如果你是“穿越”法线我不认为你需要正常化他们。)

无论如何,如果triNormal是当前正常的目标顶点的,和你的摄像机观察到它,我认为你应该有:

orientation.Forward = -triNormal 
+0

规范化可能是不必要的;这更像是一个理智的检查,以确保这不可能是问题。 采取第二个交叉它似乎并没有太大的影响。它在那里,因为它在我见过的用于从旋转中生成旋转矩阵的其他所有算法中都存在 - 我还没有找到一个合适的解释来说明它究竟做了什么。 将前向量设置为-triNormal不起作用。如果我把它放在那里,向上设置为+ triNormal,矩阵似乎是无效的,因为它不显示任何东西。如果它是唯一被设置的,那么它是相同的。 – Stardreamer

+0

当然如果你设置'Forward = -triNormal',你不能离开'Up = triNormal',但我无法弄清楚其他法线。 – pinckerman