2010-12-03 3 views
3

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

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

+0

Почему аппроксимировать касательную, если вы можете получить ее аналитически? Просто помните, что dy/dx = (dy/dt)/(dx/dt). – Sjoerd 2010-12-03 23:14:17

+0

Просто потому, что я не знал, что математические функции для производных были в C++. Я мог бы изучить это, чтобы сделать его более точным. – Amaranth 2010-12-03 23:36:48

ответ

2

Ну ап (т.е. ориентация) матрица ортонормированной состоит из следующих действий:

Направления, Tangent, бикасательных (Up вектора).

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

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

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

+0

Прошу прощения, что мне делать с этой матрицей? метод поворота opengl запрашивает поворот vecor (массив 1x3) и угол. – Amaranth 2010-12-03 23:30:24

1

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

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