Глобальный угол 3d векторов - PullRequest
2 голосов
/ 01 октября 2009

У меня есть 3 вектора, вверх направо и вперед, которые представляют направление.

Мне нужно преобразовать их в угол XYZ (3 поплавка), чтобы я мог использовать его с glRotatef ()

Пожалуйста, помогите

[EDIT]

Это не рендеринг должным образом. Можете ли вы увидеть, если это что-то вопиющее здесь: pastebin.com / f6683492d

Ответы [ 2 ]

6 голосов
/ 01 октября 2009

Я предполагаю, что вы имеете в виду «вверх, вправо и вперед», потому что «вниз» - это противоположность «вверх» и не дает никакой новой информации.
Ваш вопрос не очень ясен, но я думаю, что вы имеете в виду, что вы хотите создать преобразование в новую базу координат, которая определяется векторами, которые вы описываете. Если эти векторы ортогональны (имеют 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
0 голосов
/ 01 октября 2009
x = acos( dp3( nrm( up ), new vec3( 0, 1, 0 ) ) );
y = acos( dp3( nrm( dir ), new vec3( 0, 0, 1 ) ) );
z = acos( dp3( nrm( right ), new vec3( 1, 0, 0 ) ) );

, где dp3 - это трехкомпонентное скалярное произведение, nrm нормализует трехкомпонентный вектор, а vec3 создает его, как определено.

Это даст вам угол между вашим vectr и базисом координат по умолчанию.

Редактировать: Конечно, как указано выше, у вас, скорее всего, уже есть базовая матрица, которую вы можете применить. Очень легко ортонормировать. Реально я не могу вспомнить время, когда тебе нужно было бы делать то, что я сделал выше ... но ... эй ... это то, что ты просил;)

...