Обратная перспектива
Я использую
worldview_inverse * (projection_inverse * vector)
преобразовать координаты экранного пространства в координаты мирового пространства. Я предположил, что
(x,y,1,1)
превратится в точку на дальней плоскости, в то время как
(x,y,-1,1)
превращается в точку на ближней плоскости, и, соединяя линию, я могу запросить все объекты в усеченной области вида, которые пересекают линию. После преобразования я делю полученные точки на их соответствующие компоненты.w. Это работает для дальней плоскости, но точка на ближней плоскости каким-то образом трансформируется в начало мирового пространства.
Я думаю, что это связано с компонентами w 1, которые я подаю в обратную проекцию, потому что обычно это 1 до проекции, а не после, и я делаю обратную проекцию. Что я делаю неправильно?
1 ответ
Я знаю, что это только обходной путь, но вы можете определить точку ближней плоскости, используя только дальнюю точку и положение просмотра.
near_point = view_position
+ (far_point - view_position) * (near_distance / far_distance)
Что касается вас, настоящая проблема. Во-первых, не забудьте разделить на W! Кроме того, в зависимости от вашей матрицы проекции, вы пробовали (x,y,0,1), а не z=-1.
near_point = worldview_inverse * (projection_inverse * vector)
near_point /= near_point.W