Кривая Траектория ориентации объекта - PullRequest
3 голосов
/ 04 декабря 2010

У меня есть космический корабль в 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 ]

2 голосов
/ 04 декабря 2010

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

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

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

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

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

1 голос
/ 04 декабря 2010

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

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

...