Интенсивное искажение при вращении объектов OpenGL - PullRequest
0 голосов
/ 03 октября 2019

Я пытался повернуть квад, создав матрицу вида и матрицу модели. Я использую GLM для этого.

Вот код для создания матриц:

glm::mat4 view = glm::translate(glm::mat4(1.0f), position);
view = view * glm::rotate(glm::radians(pitch), glm::vec3(1.0f, 0.0f, 0.0f));

glm::mat4 model = glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.0f, 0.0f));

Вот вершинный шейдер:

#version 330 core
layout (location = 0) in vec3 aPos;

uniform mat4 projection;
uniform mat4 view;
uniform mat4 model;

void main()
{
    gl_Position = projection * view * model * vec4(aPos, 1.0);
}

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

РЕДАКТИРОВАТЬ: Вот ссылка на искажение: https://imgur.com/a/HzUNJAe

img

1 Ответ

1 голос
/ 04 октября 2019

Для перспективных изображений обычно искажаются формы. Ваш случай выглядит следующим образом:

overview

Ось X проходит через центр QUAD, поэтому при вращении вокруг x половина вашего квадрацикла становится ближе к камереи другая половина становится далеко ... Как вы можете видеть, более близкая часть может быть намного больше, чем размер необращенного QUAD.

Диспропорциональное искажение может быть вызвано двумя причинами:

  1. рыбий глаз

    вы находитесь слишком близко к камере, попробуйте отодвинуть квадратор от камеры, например, на 10.0 или более единиц по оси z. Чем ближе вы находитесь к znear, тем больше диспропорция между ближними и дальними частями «рыбьего глаза» QUAD

    сильно зависит от znear и FOV камеры, так что их изменение тоже может помочь ... (больше znear, меньше FOV)

    Я вижу «рыбий глаз» следующим образом:

    fisheye

    если ваш объект находится слишком близко к камере, тогда необращенный QUAD на самом деле меньше, чем повернутыйпотому что он имеет меньший угол обзора между фокусной точкой направления обзора камеры (ось -z) и краем объекта в плоскости ZY. Как только камера или QUAD будут перемещены дальше от каждого, этого не произойдет.

  2. неправильная коррекция соотношения сторон

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

...