Обнаружение столкновений окон OpenGL 3.0 - PullRequest
0 голосов
/ 22 ноября 2018

Может кто-нибудь сказать мне, как заставить вершины треугольника сталкиваться с краями экрана?Для математической библиотеки я использую GLM, а для создания окон и ввода с клавиатуры / мыши я использую GLFW.Я создал перспективную матрицу и простой массив вершин треугольника.

Затем я умножил все это в вершинном шейдере, как:

gl_Position = projection * view * model * vec4(pos, 1.0);

Матрица проекции определяется как:

glm::mat4 projection = glm::perspective(
    45.0f, (GLfloat)screenWidth / (GLfloat)screenHeight, 0.1f, 100.0f);

У меня полностью рабочая камера и проекция.Я могу передвигаться по своему «миру» и видеть стоящий там треугольник.Проблема в том, что я хочу убедиться, что треугольник сталкивается с краями экрана.

Я отключил камеру и включил только движение клавиатуры.Затем я инициализировал матрицу перевода как glm::translate(model, glm::vec3(xMove, yMove, -2.5f)); и масштабировал матрицу до 0,4.

Теперь все это работает нормально.Когда я нажимаю ПРАВО, треугольник движется вправо, когда я нажимаю ВВЕРХ, треугольник движется вверх и т. Д. Проблема в том, что я понятия не имею, как заставить его перестать двигаться, тогда он ударяет по краям.

Вот что я пробовал:

triangleRightVertex.x - это glm::vec3 объект.

0,4 - это значение масштабирования, которое я использовал в матрице масштабирования .

if(((xMove + triangleRightVertex.x) * 0.4f) >= 1.0f)
{
 cout << "Right side collision detected!" << endl; 
}

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

Понятия не имею, что здесь делать, может кто-нибудь объяснить мне это, пожалуйста?

1 Ответ

0 голосов
/ 22 ноября 2018

Каждая из координат вершины треугольника преобразуется пространством модели матрицы model в мировое пространство, матрицей view из мирового пространства для просмотра пространства и матрицей projection из пространства просмотра в клиппространство.gl_Position - это Однородная координата в пространстве клипа и далее преобразуется Перспективным делением из пространства клипа в нормализованное пространство устройства.Нормализованное пространство устройства представляет собой куб с правой, нижней, передней частью (-1, -1, -1) и левой верхней верхней частью (1, 1, 1).
Вся геометрия, которая находится вэтот (объемный) куб «видим» в области просмотра.

В пространстве клипа выполняется отсечение сцены.
Точка находится в пространстве клипа, если x, y и *Компоненты 1015 * находятся в диапазоне, заданном инвертированным компонентом w и компонентом w однородных координат точки:

-w <=  x, y, z  <= w

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

Вычислить позицию пространства клипа вершин в CPU, как это делает вершинный шейдер.Библиотека glm очень подходит для таких вещей:

glm::vec3 triangleVertex = ... ; // new model coordinate of the triangle
glm::vec4 h_pos = projection * view * model * vec4(triangleVertex, 1.0);

bool x_is_clipped = h_pos.x < -h_pos.w || h_pos.x > h_pos.w;

Если вы не знаете, как ориентация треугольника преобразуется матрицей model и viewматрица, то вы должны сделать это для всех 3-х координат вершины треугольника-

...