Проекция и отбраковка экрана объединены
В настоящее время я имею дело с несколькими тысячами ящиков, которые я хотел бы проецировать на экран, чтобы определить их размеры и расстояние до камеры.
Мой текущий подход состоит в том, чтобы получить сферу, представляющую прямоугольник и проект, которые используют матрицы вида и проекции и значения области просмотра.
// 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 ответ
[Обновлено]
Каково расстояние от коробки до камеры?
В [каком] координатном пространстве координата z соответствует расстоянию до камеры?
Ответ не из обычных пробелов. Самый близкий будет в пространстве вида (то есть после того, как вы примените матрицу вида, но не матрицу проекции). В поле зрения расстояние до камеры должно быть sqrt(x*x + y*y + z*z)
, потому что камера находится в начале координат. (z было бы разумным приближением, только если |x| и |y| были действительно малы по отношению к |z|.) Это предполагает, что знание расстояния от камеры до центра коробки достаточно хорошее.
Я думаю, что если вы действительно хотите пространство, в котором координата z соответствует расстоянию до камеры, вам необходимо сопоставить сферическое местоположение точек sqrt(x*x + y*y + z*z) = d
на самолет z = d
, Я не знаю, что вы можете сделать это с помощью матрицы.
- Коробка в поле зрения?
- Каков размер коробки на экране?
Я думаю, что вы находитесь на правильном пути с этим, но в зависимости от того, в каком направлении направлена камера, ваши левая и правая точки могут не определять, как широко выглядит бокс или пересекает ли блок фреймум вида. Смотрите мой ответ на ваш другой вопрос для долгого пути, чтобы сделать это.