Я предполагаю, что вы имеете в виду «вверх, вправо и вперед», потому что «вниз» - это противоположность «вверх» и не дает никакой новой информации.
Ваш вопрос не очень ясен, но я думаю, что вы имеете в виду, что вы хотите создать преобразование в новую базу координат, которая определяется векторами, которые вы описываете. Если эти векторы ортогональны (имеют 90 градусов между ними), вам не нужно проходить через все трудности вычисления углов и использования glRotate (). Вместо этого вы можете использовать векторы новой базы непосредственно в качестве преобразования.
Скажите, что у вас есть векторы A (a1, a2, a3) - вверх, B (b1, b2, b3) - вправо и C (c1, c2, c3) - вперед.
Во-первых, если они не полностью ортогональны, вам нужно убедиться, что они становятся ортогональными, возможно, с несколькими перекрестными произведениями. во-вторых, вам нужно убедиться, что их длина равна 1. Теперь создайте следующую матрицу:
a1 b1 c1 0
a2 b2 c2 0
a3 b3 c3 0
0 0 0 1
Это матрица вращения, которая перенесет вас из базы юнитов в базу, определенную A, B, C
С этой матрицей все, что вам нужно сделать, это использовать glMultMatrix (), и все готово.
Если первая попытка не сработает, транспонирование матрицы, вероятно, исправит это.
РЕДАКТИРОВАТЬ После повторной проверки правильный порядок матрицы должен выглядеть следующим образом:
для вектора A (ax, ay, az), B (bx, by, bz), C (cx, cy, cz)
ax ay az 0
bx by bz 0
cx cy cz 0
0 0 0 1
Это транспонирование приведенного выше ответа.
Кроме того, я рекомендую сначала попытаться проверить, работает ли он без перевода.
И затем вы можете добавить перевод, просто добавив его в матрицу следующим образом:
ax ay az 0
bx by bz 0
cx cy cz 0
pos.x pos.y pos.z 1