Задать вопрос
@Nikitoschg

Ошибка при ручном высчитывании перспективной проекции и точки на экране?

Для начала я рисую серую платформу с проекцией перспективы и задаю её с помощью gluPerspective:
float fov = 69;
float aspectRatio = 960.0f / 480.0f;
float zNear = 0.1;
float zFar = 1000.0;

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(fov, aspectRatio, zNear, zFar);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(
    0.0f, 0.0f, 5.0f,
    0.0f, 0.0f, 0.0f,
    0.0f, 1.0f, 0.0f
);

65661065dcc1a004980172.png

Потом я устанавлию ортографическую проекцию на весь экран. Отрисовка идёт от левого верхнего угла окна. Моя задача нарисовать красный квадрат в точке где начинается отрисовка первой вершины серой платформы:
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, 960, 480, 0, 1, -1);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

drawRedRect(Project(glm::vec3(-1.0f, -1.0f, -1.0f), fov, aspectRatio, zNear, zFar));


Код Project:
float fov = tan(glm::radians(fovy / 2.0F));
glm::mat4x4 identity = glm::mat4x4(
    1.0f, 0, 0, 0,
    0, 1, 0, 0,
    0, 0, 1, 0,
    0, 0, 0, 1
);
glm::mat4x4 projectionMatrix = glm::mat4x4(
    fov / aspectRatio, 0.0f, 0.0f, 0.0f,
    0.0f, fov, 0.0f, 0.0f,
    0.0f, 0.0f, (zFar + zNear) / (zNear - zFar), (2.0f * zFar * zNear) / (zNear - zFar),
    0.0f, 0.0f, -1.0f, 0.0f
);

glm::mat4x4 lookAt = glm::lookAt(
    glm::vec3(0.0f, 0.0f, 5.0f),
    glm::vec3(0.0f, 0.0f, 0.0f),
    glm::vec3(0.0f, 1.0f, 0.0f)
);

glm::vec4 platformVector4 = glm::vec4(platformVector.x, platformVector.y, platformVector.z, 1.0f);
platformVector4 = projectionMatrix * lookAt * platformVector4;
//platformVector4 /= platformVector4.w;

float halfWidth = 960.0f / 2.0f;
float halfHeight = 480.0f / 2.0f;

glm::vec2 screenProjectedVector = glm::vec2(
    halfWidth + (platformVector4.x * 960.0f) * 0.5f,
    halfHeight - (platformVector4.y * 480.0f) * 0.5f
);

return screenProjectedVector;


Согласно формуле, которую использует gluPerspective я высчитал fov и матрицу перспективной проекции:
6566103ac8d84200965022.png

Результат:
6566107e7a1a8689942198.png

Может быть есть догадки что я делаю не так?
  • Вопрос задан
  • 107 просмотров
Подписаться 1 Средний 13 комментариев
Пригласить эксперта
Ответы на вопрос 1
@MarkusD
все время мелю чепуху :)
Для начала тут нужно разобраться с пространствами.
В каком пространстве рисуется серая платформа? В каком пространстве задана область обзора камеры для платформы? В каком пространстве задана область проекции камеры для платформы?
В каком пространстве рисуется красный квадрат? В каком пространстве задана область обзора камеры для квадрата? В каком пространстве задана область проекции камеры для квадрата?

А следом надо разобраться с порядком переходов между этими пространствами.
У тебя используется два пространства мировых координат и две камеры, результат проекции которых сводится в одну поверхность презентации. Чтобы из точки мирового пространства плоскости получить точку мирового пространства квадрата, тебе нужно взять прямую матрицу WVP пространства плоскости и умножить ее на обратную матрицу WVP пространства квадрата.
Результирующая матрица будет матрицей перехода из мирового пространства плоскости в мировое пространство квадрата. Умножая вершины плоскости на эту матрицу, ты будешь переводить их координаты в пространство, в котором тебе в этих вершинах надо рисовать красные квадраты.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы