может ли кто-нибудь сказать мне, как заставить мою модель вращаться в своем собственном центре, переходить на гравитацию вместо оси по умолчанию (0,0,0)?проблема вращения opengl
и мое вращение, кажется, только идя слева и справа не 360 градусов ..
может ли кто-нибудь сказать мне, как заставить мою модель вращаться в своем собственном центре, переходить на гравитацию вместо оси по умолчанию (0,0,0)?проблема вращения opengl
и мое вращение, кажется, только идя слева и справа не 360 градусов ..
Если вы хотите, чтобы повернуть объект вокруг его центра, сначала нужно перевести его в начало координат, а затем повернуть и перевести его назад. Поскольку матрицы преобразования влияют на ваши векторы справа налево, вам необходимо закодировать эти шаги в противоположном порядке.
Вот некоторые псевдокод, так как я не знаю 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, а затем вращают вокруг начала координат, что приводит к каким-то странным искажениям в вашей модели.
спасибо! , но что вы понимаете под уравнениями? – noob88
Я добавил объяснение для уравнения. На самом деле это просто очень простая математика, вам нужно понять 3D-графику. –
спасибо, что это работает сейчас. , но все еще остается одна проблема, она не вращается по кругу, а на 180 градусов слева направо. Не может сказать, что случилось? – noob88