Проекция и отбраковка экрана объединены

В настоящее время я имею дело с несколькими тысячами ящиков, которые я хотел бы проецировать на экран, чтобы определить их размеры и расстояние до камеры.

Мой текущий подход состоит в том, чтобы получить сферу, представляющую прямоугольник и проект, которые используют матрицы вида и проекции и значения области просмотра.

// PSEUDOCODE

// project box center from world into viewspace
boxCenterInViewSpace = viewMatrix * boxCenter;

// get two points left and right of center
leftPoint = boxCenter - radius;
right = boxCenter + radius;

// project points from view into eye space
leftPoint = projectionMatrix * leftPoint;
rightPoint = projectionMatrix * rightPoint;

// normalize points
leftPoint /= leftPoint.w;
rightPoint /= rightPoint.w;

// move to 0..1 range
leftPoint = leftPoint * 0.5 + 0.5;
rightPoint = rightPoint * 0.5 + 0.5;

// scale to viewport
leftPoint.x = leftPoint.x * viewPort.right + viewPort.left;
leftPoint.y = leftPoint.y * viewPort.bottom + viewPort.top;

rightPoint.x = rightPoint.x * viewPort.right + viewPort.left;
rightPoint.y = rightPoint.y * viewPort.bottom + viewPort.top;

// at this point i check if the node is visible on screen by comparing the points to the viewport

// calculate size
length(rightPoint - leftPoint)

В другой точке я вычисляю расстояние от коробки до камеры.

Первая проблема заключается в том, что я не буду знать, находится ли поле чуть ниже области просмотра, поскольку я просто вычисляю горизонтальность. Есть ли способ как-то спроецировать реальную сферу на экран? Какой-то метод, который выглядит так:

float getSizeOfSphereProjectedOnScreen(vec3 midpoint, float radius)

Другой вопрос проще: в координатном пространстве координата z соответствует расстоянию до камеры?

Подводя итог, я хочу рассчитать:

  1. Коробка в поле зрения?
  2. Каков размер коробки на экране?
  3. Каково расстояние от коробки до камеры?

Чтобы упростить вычисления, я хотел бы использовать представление сферы для этого, но я не знаю, как спроектировать сферу.

1 ответ

Решение

[Обновлено]

Каково расстояние от коробки до камеры?

В [каком] координатном пространстве координата z соответствует расстоянию до камеры?

Ответ не из обычных пробелов. Самый близкий будет в пространстве вида (то есть после того, как вы примените матрицу вида, но не матрицу проекции). В поле зрения расстояние до камеры должно быть sqrt(x*x + y*y + z*z), потому что камера находится в начале координат. (z было бы разумным приближением, только если |x| и |y| были действительно малы по отношению к |z|.) Это предполагает, что знание расстояния от камеры до центра коробки достаточно хорошее.

Я думаю, что если вы действительно хотите пространство, в котором координата z соответствует расстоянию до камеры, вам необходимо сопоставить сферическое местоположение точек sqrt(x*x + y*y + z*z) = d на самолет z = d, Я не знаю, что вы можете сделать это с помощью матрицы.

  • Коробка в поле зрения?
  • Каков размер коробки на экране?

Я думаю, что вы находитесь на правильном пути с этим, но в зависимости от того, в каком направлении направлена ​​камера, ваши левая и правая точки могут не определять, как широко выглядит бокс или пересекает ли блок фреймум вида. Смотрите мой ответ на ваш другой вопрос для долгого пути, чтобы сделать это.

Другие вопросы по тегам