Ориентация объекта Кривая Траектория
У меня есть космический корабль в 3D-среде. Я нарисовал кривую B-сплайна, используя контрольные точки (преобразованные в кривую Безье, чтобы иметь возможность нарисовать ее). Каждый раз, когда вызывается событие рисования, корабль находится в точке (0,0,0) и переводится в следующую координату на кривой. Теперь, прежде чем делать этот перевод, мне нужно сделать поворот так, чтобы ориентация корабля была вдоль касательной кривой в этой точке.
Я могу аппроксимировать касательную, находя точку на кривой, которая находится рядом с текущей, делая это. Я использую OpenGL в C++
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 ответа
Ну, ортонормированная (то есть ориентационная) матрица состоит из следующего:
Направление, касательная, би-касательная (вектор вверх).
Таким образом, если у вас есть направление и касательная, вы можете скрестить произведение, чтобы получить свой битангенс и сформировать матрицу из 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.