Ориентация объекта траектории траектории

У меня есть космический корабль в 3D-среде. Я нарисовал кривую B-сплайна, используя контрольные точки (преобразованные в кривую Безье, чтобы иметь возможность рисовать). Каждый раз, когда вызывается событие рисования, судно находится в точке (0,0,0) и переводится на следующую координату на кривой. Теперь, прежде чем делать этот перевод, мне нужно будет сделать поворот так, чтобы ориентация судна была вдоль тангенса кривой в этой точке.

Я могу аппроксимировать касательную, найдя точку на кривой, которая находится рядом с текущей, сделав это. Я использую 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]);

Я думаю, что вектор вращения является касательным, но не может найти угол, необходимый для вращения корабля. Как я могу повернуть корабль, чтобы выровнять его с касательной?

2 ответа

Ну ортонормальная (т.е. ориентировочная) матрица состоит из следующего:

Направление, Tangent, BiTangent (вектор вверх).

Итак, если у вас есть направление и тангенс, вы можете пересечь продукт, чтобы получить свой бинагентный сигнал и сформировать матрицу из трех векторов направления (D, T, B) и вектора положения (P) следующим образом

Tx, Bx, Dx, Px
 Ty, By, Dy, Py
 Tz, Bz, Dz, Pz
 0, 0, 0, 1

Теперь ваш объект ориентирован вдоль вектора направления...


Прежде всего, см. этот сайт для получения информации о поиске фактической касательной в данной точке вдоль кривой B-Spline.

Во-вторых, вы можете использовать atan(y/x) для получения угла (в радианах) касательного вектора. Используйте этот угол для поворота вашего корабля, предполагая, что угол "нуль" имеет ваш корабль, указывающий вдоль оси x.

licensed under cc by-sa 3.0 with attribution.