Вычисление пиксельной координаты 3d-точки - PullRequest
1 голос
/ 09 апреля 2020

Я пытаюсь вычислить пиксельные координаты 3d-точки (назовите это p) в мировом пространстве. Я понимаю, что я должен преобразовать p из мирового пространства в пространство камеры, умножив его на обратную матрицу камеры в мир. Затем найдите координаты точки на холсте, используя перспективную проекцию, затем преобразуйте ее в пиксельные координаты. Я думаю, что это правильно?

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

vec3 cameraPos = vec3(0.f, 0.f, -5.f);
vec3 cameraDir = vec3(0.f, 0.f, 1.f);

Нужен ли мне вектор подъема камеры и что это представляет?

I использую glm.

1 Ответ

1 голос
/ 09 апреля 2020

В настоящее время я застрял в поиске матрицы 4x4, которая позволила бы мне преобразовать p из мирового пространства в пространство камеры.

Эта матрица называется матрицей вида. Матрица вида - это Обратная матрица этой матрицы, которая определяется положением и ориентацией камеры (точка обзора).
Положение - это 3D-точка (cameraPos). Ориентация камеры определяется линией визирования (cameraDir) и вектором вверх. Вы должны определить вектор повышения, например, (0, 1, 0).

Библиотека OpenGL Matmatics (GLM) предоставляет удобную функцию (glm::lookAt* 1016). *), чтобы вычислить матрицу вида по положению, цели и вектору вверх:

#include <glm/gtc/matrix_transform.hpp>
glm::vec3 cameraPos = glm::vec3(0.f, 0.f, -5.f);
glm::vec3 cameraDir = glm::vec3(0.f, 0.f, 1.f);
glm::vec3 cameraUp = glm::vec3(0.f, 1.f, 0.f);

glm::mat4 viewMatrix = glm::lookAt(cameraPos, cameraPos+cameraDir, cameraUp);
...