Скажем, вы знаете 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 с перекрестным произведением. Если они не нормализованы, просто нормализуйте их. Если они не ортогональны, все становится сложнее.