我在3D环境中有一艘宇宙飞船。我使用控制点绘制了B样条曲线(转换为贝塞尔曲线以便能够绘制它)。每次调用绘制事件时,船只位于(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]);
我认为旋转矢量是切线,但无法找到旋转船只所需的角度。如何旋转船只以使其与切线对齐?
答案 0 :(得分:2)
正交(即方向)矩阵由以下组成:
方向 切线, BiTangent(向上传播)。
因此,如果您有方向和切线,您可以跨越乘积以获得您的位置并从3个方向向量(D,T,B)和位置向量(P)形成矩阵,如下所示
Tx, Bx, Dx, Px
Ty, By, Dy, Py
Tz, Bz, Dz, Pz
0, 0, 0, 1
您的对象现在沿着方向向量...
答案 1 :(得分:1)
首先,请参阅this site,了解有关在B样条曲线的给定点找到实际切线的信息。
其次,您可以使用atan(y/x)
来获得切线向量的角度(以弧度表示)。假设“零”角度使您的船沿x轴指向,则使用该角度旋转您的船。