2009-03-26 4 views
1

может ли кто-нибудь сказать мне, как заставить мою модель вращаться в своем собственном центре, переходить на гравитацию вместо оси по умолчанию (0,0,0)?проблема вращения opengl

и мое вращение, кажется, только идя слева и справа не 360 градусов ..

ответ

10

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

Вот некоторые псевдокод, так как я не знаю OpenGL процедур наизусть:

PushMatrix(); 
LoadIdentity(); // Start with a fresh matrix 
Translate();  // Move your object to its final destination 
Rotate();  // Apply rotations 
Draw();   // Draw your object using coordinates relative to the object center 
PopMatrix(); 

Эти матрицы получить применяется:

v_t = (I * T * R) * v = (I * (T * (R * v))) 

Итак заказ: вращение, перевод.


РЕДАКТИРОВАТЬ: Объяснение для приведенного выше уравнения.

Преобразование вращения, масштаб и перевод влияют на модель-вид матрицы . Каждая трехмерная точка (вектор) вашей модели умножается на эту матрицу, чтобы получить ее конечную точку в трехмерном пространстве, затем она умножается на матрицу проекции для получения двумерной точки (на вашем 2D экране).

Игнорирование проекционный материал, ваша точка преобразуется в модель-представление-матрицы:

v_t = MV * v 

Значение оригинальную точку v, умноженной на модель-представление-матрицы MV.

В приведенном выше коде, мы построили MV на единичную матрицу I, перевод T и вращение R:

MV = I * T * R 

Сложив все вместе, вы видите, что ваша точка v сначала зависит от вращения R, то перевод T, так что ваша точка поворачивается прежде, чем оно переводится, как мы хотели, чтобы это было:

v_t = MV * v = (I * T * R) * v = T * (R * v) 

Вызов Rotate() перед Перевести() приведет к:

v_t = (I * R * T) * v = R * (T * v) 

, который будет плохо: Переведенный в какой-то момент в 3D, а затем вращают вокруг начала координат, что приводит к каким-то странным искажениям в вашей модели.

+0

спасибо! , но что вы понимаете под уравнениями? – noob88

+0

Я добавил объяснение для уравнения. На самом деле это просто очень простая математика, вам нужно понять 3D-графику. –

+0

спасибо, что это работает сейчас. , но все еще остается одна проблема, она не вращается по кругу, а на 180 градусов слева направо. Не может сказать, что случилось? – noob88