AABB вращающегося спрайта? - PullRequest
8 голосов
/ 12 июля 2011

Скажи, у меня есть спрайт. Его выравнивающий ось ограничивающий прямоугольник (AABB) легко найти, так как я знаю ширину и высоту. Скажем, я повернул его на 45 градусов, я не думаю, что AABB будет достаточно большим, чтобы покрыть его, поэтому мне нужен новый AABB. Как я могу рассчитать ограничивающий прямоугольник повернутого прямоугольника? (с учетом центральной точки, угла, ширины и высоты).

Обратите внимание, что OpenGL выполняет вращение, поэтому у меня нет доступа к информации о вершине.

То, что я пытаюсь сделать, - это получить AABBs, чтобы я мог выполнять 2D отбор для рендеринга.

Возможно ли жадный способ найти AABB, который удовлетворяет любому углу?

Спасибо

Ответы [ 3 ]

30 голосов
/ 12 июля 2011

enter image description here

1 голос
/ 19 июля 2011

Если вы хотите, чтобы один прямоугольник покрывал все углы, просто возьмите половину диагонали вашего существующего прямоугольника в качестве радиуса круга.Новое поле должно содержать этот круг, поэтому это должен быть квадрат с длиной стороны, равной удвоенному радиусу (эквивалент диагонали оригинальной AABB) и с тем же центром, что и у оригинала.

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

0 голосов
/ 12 июля 2011

Я не знаю, является ли это наиболее эффективным методом, но я бы просто вычислил новые позиции вершин и на основании этих данных выяснил AABB.Например,

Vertex v0, v1, v2, v3;
// in the local coordinates of the rectangle
// so for example v0 is always 0,0 and width and height define the others
// put some values to v0..v3

glLoadIdentity();
glTranslatef(the position of the rectangle);
glTranslatef(center_point);
glRotatef(angle, 0,0,1);
glTranslatef(-center_point);

GLfloat matrix[16];
glGetFloatv(GL_MODELVIEW_MATRIX, matrix);

v0 = multiply_matrix_by_vector(matrix, v0);
v1 = multiply_matrix_by_vector(matrix, v1);
v2 = multiply_matrix_by_vector(matrix, v2);
v3 = multiply_matrix_by_vector(matrix, v3);

AABB = find_the_minimums_and_maximums(v0, v1, v2, v3);

Если вы не знаете, как умножить матрицу на вектор, попробуйте поискать ее в Google.

Также обратите внимание, что, поскольку размеры матрицы равны 4x4, векторы длявершины также должны быть 4-мерными.Вы можете преобразовать 2D вектор в 4D вектор, добавив третий компонент 0 (ноль) и четвертый компонент 1 (один).После умножения вы можете преобразовать полученный вектор 4D обратно в 2D, разделив компоненты x и y на четвертый компонент и просто проигнорировав третий компонент, потому что вам не нужно третье измерение.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...