C++ 曲线轨迹对象定向

C++ 曲线轨迹对象定向,c++,math,opengl,animation,curve,C++,Math,Opengl,Animation,Curve,我有一个在3D环境中的宇宙飞船。我使用控制点绘制了一条B样条曲线(转换为贝塞尔曲线以便能够绘制)。每次调用draw事件时,船舶都位于点(0,0,0)处,并转换为曲线上的下一个坐标。现在,在做这个平移之前,我需要做一个旋转,使船的方向是沿着曲线在该点的切线 我可以通过在曲线上找到一个接近当前点的点来近似切线。我在C中使用OpenGL++ float mDifference[1][3] = {nearPoint[0][0] - currentPosition[0][0],

我有一个在3D环境中的宇宙飞船。我使用控制点绘制了一条B样条曲线(转换为贝塞尔曲线以便能够绘制)。每次调用draw事件时,船舶都位于点(0,0,0)处,并转换为曲线上的下一个坐标。现在,在做这个平移之前,我需要做一个旋转,使船的方向是沿着曲线在该点的切线

我可以通过在曲线上找到一个接近当前点的点来近似切线。我在C中使用OpenGL++

float mDifference[1][3] = {nearPoint[0][0] - currentPosition[0][0],
                           nearPoint[0][1] - currentPosition[0][1],
                           nearPoint[0][2] - currentPosition[0][2]};

float norm = sqrt(mDifference[0][0] * mDifference[0][0] 
             + mDifference[0][1] * mDifference[0][1]
             + mDifference[0][2] * mDifference[0][2]);

float tangent[1][3] = { mDifference[0][0] / norm,
                        mDifference[0][1] / norm,
                        mDifference[0][2] / norm};

//tangent = rotationVector?
spacecraftTransformGroup->setRotationVector(tangent[0][0],tangent[0][1],tangent[0][2]);
我认为旋转向量是切线,但找不到旋转船舶所需的角度。如何旋转船舶使其与切线对齐?

正交(即方向)矩阵由以下部分组成:

方向, 切线, 双切线(上向量)

因此,如果你有方向和切线,你可以叉积得到你的双切线,然后从3个方向向量(D,T,B)和位置向量(p)形成你的矩阵,如下所示

 Tx, Bx, Dx, Px
 Ty, By, Dy, Py
 Tz, Bz, Dz, Pz
  0,  0,  0,  1
对象现在沿方向向量定向…

首先,请参见以获取有关沿B样条曲线在给定点处查找实际切线的信息


其次,您可以使用atan(y/x)获得切向量的角度(弧度)。使用该角度旋转船舶,假设“零”角度使船舶指向x轴。

如果可以解析推导切线,为什么要近似切线?只要记住Dy/Dx=(Dy/dt)/(Dx/dt)。仅仅因为我不知道C++中的导数的数学函数是什么。我可以研究一下,让它更精确。对不起,我该怎么处理那个矩阵?opengl旋转方法要求一个旋转向量(1x3数组)和一个角度。@Mathieu-这已经很长时间了,但我记得opengl允许您加载一个预先计算的矩阵作为Modelview矩阵,而不是使用一系列旋转。@ysap:GLfloat M[16]={Tx,Ty,Tz,0,Bx,By,Bz,0,Dx,Dy,Dz,0,Px,Py,Pz,1};glLoadMatrix(M);这不是只有在2d中才能工作吗?也许我可以试试这个,然后用y坐标和z坐标之间的角度进行另一个旋转。