Как позиционировать объект, используя координаты вперед, верх и центр в opengl - PullRequest
0 голосов
/ 10 апреля 2010

У меня есть сцена и объект, размещенный в некоторых координатах. Я могу преобразовать объект, используя glTranslate (в центре) и затем glRotate ...

Но как мне повернуть объект, используя не углы, а направления вверх и вперед?

Спасибо

Я ищу перевод между системой координат модели и глобальной системой координат.

Ответы [ 2 ]

2 голосов
/ 10 апреля 2010

Скажем, вы знаете 3 оси для вашего объекта в объектном пространстве. Для простоты предположим, что это декартовы оси (если это не так, описанный ниже процесс может быть применен дважды, чтобы позаботиться об этом):

ox = (1, 0, 0)
oy = (0, 1, 0)
oz = (0, 0, 1)

И скажем, у вас есть 3 других ортогональных и нормализованных оси в мировом пространстве, указывающих top , вперед и стороны направления вашего объекта [*]:

wx = (wx.x, wx.y, wx.z)
wy = (wy.x, wy.y, wy.z)
wz = (wz.x, wz.y, wz.z)

Тогда следующее (предполагая векторы столбцов) - это матрица вращения, переносящая вас из пространства объектов в пространство мира:

    [ wx.x  wx.y  wx.z ]
M = [ wy.x  wy.y  wy.z ]
    [ wz.x  wz.y  wz.z ]

Это матрица вращения, потому что определитель равен 1 (отогональные и нормализованные линии). Чтобы проверить, идет ли он из мирового пространства в пространство объекта, просто отметьте, как M*wx = (1, 0, 0) и т. Д.

Теперь вы хотите прямо противоположное: из пространства объекта в пространство мира. Просто переверните матрицу. В этом случае обратное значение совпадает с транспонированием, поэтому ваш окончательный ответ:

objectToWorld = transpose(M)

Осталось две вещи:

1) Загрузка этой матрицы в OpenGL. glMultMatrix сделает это за вас (будьте осторожны, glMultMatrix является главным столбцом и нуждается в матрице 4x4):

double objectToWorld[] = [ wx.x, wy.x, wz.x, 0, 
                           wx.y, wy.y, wz.y, 0, 
                           wx.z, wy.z, wz.z, 0,
                              0,    0,    0, 1 ];
glMultMatrixd( objectToWorld ); 

2) Перевод. Это можно сделать, просто позвонив по номеру glTranslate.

[*] Если у вас есть только два из трех, скажем top и forward , вы можете легко вычислить side с перекрестным произведением. Если они не нормализованы, просто нормализуйте их. Если они не ортогональны, все становится сложнее.

0 голосов
/ 10 апреля 2010

Поскольку OpenGL работает только с матрицами, отсутствует понятие top , bottom и т. Д.

вам нужно будет найти соответствие между вращением, которое вы хотите дать, и необходимой ориентацией. Поскольку glRotates(angle,x,y,z,) хочет угол в градусах, вы можете просто использовать двумерный массив и хранить все 16 возможностей (из одного из top , bottom , left , вправо на одно и то же .. в противном случае вы можете просто увидеть, сколько нужно шагов в 90 ° от фактического положения к новому, и умножить значение на 90 ..

например:

сверху вниз = 2 шага = 180 °

справа налево = 1 шаг назад = -90 °

...