О матрице вида и отбраковке усеченного конуса - PullRequest
1 голос
/ 03 октября 2019

Я пытался определить, находится ли объект (сфера) внутри усеченного вида. Моя стратегия была первой, чтобы получить матрицу вида:

glm::lookAt(cameraPosition, lookAtPosition, cameraUp);

Где cameraPosition - это позиция камеры, lookAtPosition рассчитывается по cameraPosition + cameraDirection, а cameraUp говорит само за себя.

После получения матрицы вида я вычисляю 8 вершин усеченного контура в виде камеры, затем умножаю инверсию матрицы вида на каждую точку, чтобы получить их координату в мировом пространстве.

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

Итак, мои вопросы:

  • Всегда ли вид с камеры установлен на (0,0,0) и смотрит в положительном направлении z?
  • Матрица вида преобразует вид на мир в вид с камеры, если я использую его инверсию, чтобы преобразовать вид с камеры на вид на мир, это правильно?

Мой усеченный противоположен моему cameraDirection из-за чего на экране ничего не видно (но он все еще рисует вещи на задней панели моей камеры).

1 Ответ

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

Всегда ли вид с камеры установлен на (0,0,0) и смотрит в положительном направлении z?

Пространство вида - это пространство, которое определяет вид наscene.
Какая часть является «видимой» (является проекцией на область просмотра), зависит от матрицы проекции. В общем (в OpenGL) исходная точка (0,0,0) и ось пространства z указывает за пределы области просмотра. Но матрица проекции инвертирует ось * z. Он превращается из системы для правой руки области обзора в систему для левой руки в нормированном пространстве устройства.

в обратном направлении для преобразования вида камеры вмировоззрение

Да.

Матрица представления преобразуется из мирового пространства в пространство просмотра. Матрица проекции преобразует декартовы координаты пространства просмотра в однородные координаты пространства отсечения. Координаты пространства клипа преобразуются в нормализованное пространство устройства путем деления компонентов xyz на w компонента (Перспективное деление ).

Нормализованное пространство устройствакуб с минимумом (-1, -1, -1) и максимумом (1, 1, 1). Таким образом, 8 угловых точек куба являются углом объема представления в нормализованном пространстве устройства.

(-1, -1, -1) ( 1,  -1, -1) ( 1,  1, -1) (-1,  1, -1) // near plane
(-1, -1,  1) ( 1,  -1,  1) ( 1,  1,  1) (-1,  1,  1) // far plane

Если вы хотите преобразовать точку из нормализованного пространства устройства для просмотра пространства, то вам необходимо:

  • преобразование с помощью матрицы обратной проекции
  • преобразование с помощью матрицы обратного просмотра
  • делит компонент xyz результата на его ш компонент
glm::mat4 view;      // view matrix
glm::mat4 projetion; // projection matrix
glm::vec3 p_ndc;     // a point in normalized device space
glm::mat4 inv_projetion = glm::inverse( projetion );
glm::mat4 inv_view      = glm::inverse( view );

glm::vec4 pth = inv_view * inv_projetion * glm::vec4( p_ndc, 1.0f );

glm::vec3 pt_world = glm::vec3( pth ) / pth.w;
...