C ++ OpenGL преобразование координат модели в мировые координаты для обнаружения столкновений - PullRequest
1 голос
/ 07 октября 2009

(Это все в орто-режиме, начало координат в верхнем левом углу, x положительно вправо, y положительно вниз по оси y)

У меня есть прямоугольник в мировом пространстве, который может иметь вращение 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.

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

и t - угол, измеренный в радианах от оси х.

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

Спасибо!

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

Ответы [ 2 ]

2 голосов
/ 07 октября 2009

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

alt text

[линейное преобразование: добавка L (m + n) = L (m) + L (n), где {m, n} € вектор, однородный L ( k .m) = k .L (m) где m € вектор и k € скаляр] Итак:

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

м [cosQ, sinQ] + n [-sinQ, cosQ] = [м cosQ - n sinQ, м sinQ + n cosQ]

Вы также можете посмотреть Вики Вращение

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

Для M => матрицы вида модели и транспонирования [x y z w] - это ваши координаты объекта, которые вы делаете:

M [x y z w] T = координата глаза [x y z w] T

1 голос
/ 08 октября 2009

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

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

...