如何旋转模型以遵循路径

时间:2019-06-26 01:21:20

标签: c++ opengl model glm-math

我有一个要沿圆形路径移动的太空飞船模型。我希望船的鼻子始终指向船的前进方向。

这是我现在必须将其移动一圈的代码:

Array of Objects

我将如何移动它以便鼻子始终指向前方?我尝试做glm :: rotate旋转轴设置为x或y或z,但我无法使其正常工作。

1 个答案:

答案 0 :(得分:0)

首先请参阅Understanding 4x4 homogenous transform matrices,因为我正在使用术语和从那里开始的东西...

通常出于导航目的而使用对象的变换矩阵,而不要反过来使用。因此,您的太空飞船应该有一个变换矩阵M,以表示其在中的位置和方向> [GCS] (全局坐标系)。有时最重要的是,乘以另一个矩阵M0,该矩阵将太空飞船的网格与第一个矩阵对齐(您知道某些网格不是围绕(0,0,0)居中,也不是轴对齐的……)

现在,当您移动对象时,您只需在M上进行局部变换,所以向前移动只是将M的原始位置平移了多个前向轴基向量。滑动到侧面(只是使用不同的基本向量)也是如此,从而导致对象始终与它应该位于的位置对齐(关于运动)。转弯也一样。因此,绕圈走就是向前移动,并在每个时间迭代步骤(计时器)中以恒定的速度转弯。

您首先要向后进行此操作,然后计算位置和方向,然后尝试进行运算,使矩阵也可以执行相同的操作...在这种情况下,构造要容易得多矩阵M而不是创建将创建矩阵的转换...因此,您需要的是:

  • 原产地
  • 3个垂直(最可能的单位)基本向量

因此,原点是您的x,y,z职位。可以从圆中获得2个基向量,因此正向是切线(或position-last_position),而朝圆心cen的向量用作(右或左)。可以通过叉积获得第三个向量,因此假设:

  • +X轴是正确的
  • +Y轴朝上
  • +Z轴向前

您得到了:

r=100.0
a=speed*t
pos = (r*cos(a),0.0,r*sin(a))
center = (0.0,0.0,0.0)

如此:

Z = (cos(a-0.5*M_PI),0.0,sin(a-0.5*M_PI))
X = (cos(a),0.0,sin(a))-ceneter
Y = cross(X,Z)
O = pos

规格化:

X /= length(X)
Y /= length(Y)
Z /= length(Z)

所以现在只需将X,Y,Z,O馈入矩阵(取决于您使用的惯例,例如乘法顺序,正/逆矩阵,行矩阵或列矩阵……)

例如这样的

double M[16]=
 {
 X[0],X[1],X[2],0.0,
 Y[0],Y[1],Y[2],0.0,
 Z[0],Z[1],Z[2],0.0,
 O[0],O[1],O[2],1.0,
 };

或:

double M[16]=
 {
 X[0],Y[0],Z[0],O[0],
 X[1],Y[1],Z[1],O[1],
 X[2],Y[2],Z[2],O[2],
 0.0 ,0.0 ,0.0 ,1.0,
 };

仅此而已...矩阵可能会根据您使用的约定进行转置,倒置等。抱歉,我没有使用GLM,但是语法应该非常相似...如果行或列可以由向量加载,则矩阵馈送甚至会更加简单...