Как я могу определить вершины плоскости, которая всегда параллельна камере?

Я пытаюсь нарисовать прямоугольник (в основном плоскость), который всегда параллелен камере. Я хочу ограничить плоскость определенным размером (скажем, высота = 2 и ширина = 2 единицы). Однако я не понимаю, как установить положение вершин так, чтобы прямоугольник всегда был параллелен камере.

Сначала я вычисляю нормаль (направление) камеры, используя:

glm::normalize(mPosition - mTargetPos); // normal

а затем я использую точечно-нормальное уравнение для определения плоскости:

normal = (A, B, C)
point = (a, b, c)  // this point will serve as a center to the plane
A(x−a)+B(y−b)+C(z−c) = 0

Вопрос: Как определить вершины плоскости?


person Elnur    schedule 05.07.2020    source источник


Ответы (2)


  1. Возьмите некоторый нормализованный вектор UpDir для направления вверх (это может быть UpDir=(0,1,0) или UpDir=(0,0,1) в зависимости от вашей системы координат, или его можно как-то вычислить)
  2. Вычислите векторное произведение SideDir normal и UpDir.
  3. Теперь вы можете использовать SideDir и UpDir в качестве основы для системы координат вашей плоскости и вычислить четыре вершины прямоугольника как point+width*SideDir+height*UpDir, point+width*SideDir-height*UpDir, point-width*SideDir-height*UpDir, point-width*SideDir+height*UpDir.
person Doj    schedule 06.07.2020

Рекомендую определять точки в пространстве обзора. Наконец, преобразуйте точки с помощью обратной матрицы просмотра.
В пространстве обзора точки параллельно виду, если они имеют одинаковую координату z. Координата z должна быть отрицательной, а ее величина должна быть больше расстояния до ближней плоскости и меньше расстояния до дальней плоскости:

near < -z < far

Вычислите матрицу вида (view_mat) и определите точки обзора:

glm::mat4 view_mat = glm::lookAt(mPosition, mTargetPos, mUp);
float z = 

glm::vec3 pt1View(x1, y1, z);
glm::vec3 pt2View(x2, y2, z);
// [...]

Преобразуйте точки из пространства обзора в мировое пространство:

glm::mat4 inverse_view_mat = glm::inverse(view_mat);

glm::vec3 pt1World = glm::vec3(inverse_view_mat * glm::vec4(pt1View, 1.0f));
glm::vec3 pt2World = glm::vec3(inverse_view_mat * glm::vec4(pt2View, 1.0f));
// [...]
person Rabbid76    schedule 06.07.2020