2009-10-07 2 views
1

(Это все в режиме орто, происхождения находится в верхнем левом углу, х положительна справа, у положительно вниз по оси у)C++ OpenGL преобразования координаты модели в мировой системе координат для обнаружения столкновений

I имеют прямоугольник в мировом пространстве, который может иметь поворот m_rotation (в градусах).

Я могу работать с прямоугольником в порядке, вращать, масштабировать, все, что вы могли бы хотеть этого сделать.

Часть, с которой я действительно запуталась, вычисляет координаты мира прямоугольников из ее локальных координат.

Я пытался использовать формулу:

x' = x*cos(t) - y*sin(t) 
y' = x*sin(t) + y*cos(t) 

where (x, y) are the original points, 
(x', y') are the rotated coordinates, 
and t is the angle measured in radians 

from the x-axis. The rotation is 
counter-clockwise as written. 
-credits duffymo 

Я попытался реализации формулу так:

//GLfloat Ax = getLocalVertices()[BOTTOM_LEFT].x * cosf(DEG_TO_RAD(m_orientation)) - getLocalVertices()[BOTTOM_LEFT].y * sinf(DEG_TO_RAD(m_orientation)); 
//GLfloat Ay = getLocalVertices()[BOTTOM_LEFT].x * sinf(DEG_TO_RAD(m_orientation)) + getLocalVertices()[BOTTOM_LEFT].y * cosf(DEG_TO_RAD(m_orientation)); 

//Vector3D BL = Vector3D(Ax,Ay,0); 

я создаю вектор для переведенного точки, хранить его в прямоугольники переменная члена world_vertice. Хорошо. Однако в моем основном рисовальном цикле я рисую строку из (0,0,0) в вектор BL, и кажется, что линия идет по кругу из точки на прямоугольнике (нижний левый угол прямоугольника) вокруг происхождения координат мира.

В основном, когда m_orientation становится больше, он рисует огромный круг вокруг (0,0,0) мировой системы координат. Редактирование: когда m_orientation = 360, он получает значение на 0.

Я чувствую, что я делаю эту часть неправильно:

и т угол в радианах от оси х.

Возможно, я не должен использовать m_orientation (угол поворота прямоугольников) в этой формуле?

Спасибо!

изменить: причина, по которой я делаю это, - это обнаружение столкновения. Мне нужно знать, где координаты прямоугольников (скоро быть твердыми телами) лежат в мировом координатном месте для обнаружения столкновения.

ответ

2

Что вы делаете, это вращение [специальное линейное преобразование] вектора с углом Q на 2d.Он держит длину вектора и меняет свое направление вокруг начала координат.

alt text

[линейное преобразование: Добавка L (M + N) = L (M) + L (п), где {т, п} € вектор, однородная л (к .m) = k .L (m) где m € vector и k € scalar] So:

Вы разделите свой вектор на две части. Подобно m [1, 0] + n [0, 1] = ваш вектор. Тогда, как вы видите на изображении, вращение производится на этих двух частей, после того, что ваш вектор принять форму:

м [cosQ, SINQ] + п [-sinQ, cosQ] = [м cosQ - п SINQ, м SINQ + п cosQ]

вы также можете посмотреть на Wiki Rotation

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

Для M => модели представления матрицы и транспонирования из [xyzw] Ваш координаты объекта вы делаете:

M [xyzw] T = Eye координата [xyzw] T

+1

спасибо. Я буду работать над этим позже сегодня вечером! :) –

+0

OpenGL обрабатывает графику, а не операции линейной алгебры. Если ему нужны преобразованные координаты для обнаружения столкновений, это, по моему мнению, плохой совет. Но +1 для хорошего объяснения. Если вы используете OpenGL для преобразования сетки во время фактического рендеринга, не забудьте вращаться вокруг оси Z. – 2009-10-08 23:50:34

1

Это, кажется, усложнять что-то несколько: обычно вы должны хранить мировое положение и ориентацию объекта отдельно от своего набора собственных локальных координат. Вращение объекта выполняется в пространстве модели, и поэтому позиция не изменяется. Мировое положение каждой координаты одинаково независимо от того, выполняете ли вы поворот или нет - добавьте мировое положение в локальное положение, чтобы перевести локальные координаты в мировое пространство.

Любое вращение происходит вокруг определенного происхождения, и типичная формула sin/cos предполагает (0,0) ваше происхождение. Если используемая система координат в настоящее время не имеет (0,0) в качестве источника, вы должны перевести ее в ту, которая выполняет, выполняет поворот, а затем преобразует обратно. Обычно пространство модели определяется так, что (0,0) является началом для модели, делая этот шаг тривиальным.

Смежные вопросы