在保持向前方向的同时将物体对准球体表面

时间:2017-03-29 18:42:59

标签: opengl vector geometry quaternions

使用OpenGL作为渲染引擎我试图生成一个旋转矩阵,该矩阵将网格放置在给定位置的球体表面上。最初我试图通过计算给定位置的球体曲面法线并将其用作我的网格up向量来做到这一点。

这很有效,但事实很复杂,因为我还希望能够使用绝对yawpitchroll值来旋转网格 - 其中一个{ {1}}为0将始终使网格向北(0,1,0)向北方向。

我对如何实现这一点有一个心理障碍,并希望得到任何意见。

使用Ripi2提供的解决方案进行更新:

yaw

1 个答案:

答案 0 :(得分:1)

让我们在地球"上工作。其旋转轴(r)从南极到北极。表面的法线(n)进入" out"地球

叉积e= r x n给出一个向东的向量。
叉积d= n x e给出一个向北的向量。

使用e, n, d的标准化版本并转换为曲面中的点,您可以构建lookAt矩阵(请参阅here)。
up = nf= center-eye = d以及s = e。请注意,您可能希望更改f符号,因为这不是真实的' lookAt'变换,它没有看,但只是找到。

现在,如果您的网格可以被视为与第一个球体同心的另一个球体,则所有旋转都必须位于两个球体的共享中心之上。旋转轴,始终保持向北和#34;可以是"地球轴" (r)和#34;向东走去" (E)。使用' e'你以某种方式失去北方,矢量去#34;内部"球体。角度可以从交叉积计算,因为c= a x b然后是|c| = |a|·|b|·sin(beta)