обратная перспективная проекция

я использую

worldview_inverse * (projection_inverse * vector)

для преобразования координат экранного пространства в координаты мирового пространства. Я предполагал, что

(x,y,1,1)

превратится в точку на дальней плоскости, а

(x,y,-1,1)

преобразуется в точку на ближайшей плоскости, и, соединяя линию, я могу запросить все объекты в пирамиде обзора, которые пересекают линию. После преобразования я делю полученные точки на их соответствующие компоненты .w. Это работает для дальней плоскости, но точка на ближней плоскости каким-то образом преобразуется в начало мирового пространства.

Я думаю, что это связано с w-компонентами единицы, которую я использую в обратной проекции, потому что обычно это 1 до проекции, а не после, а я делаю обратную проекцию. Что я делаю неправильно?


person heeen    schedule 26.02.2009    source источник
comment
Я думаю, вам нужен еще пример кода. Особенно та часть, которая устанавливает вашу близкую точку к исходной точке.   -  person Neil N    schedule 27.02.2009
comment
Кроме того, не могли бы вы предоставить матрицу проекции, которую вы используете? Это смещение?   -  person Coincoin    schedule 27.02.2009


Ответы (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
person Coincoin    schedule 26.02.2009
comment
да, я обдумал это, но теперь меня интересует математическая сторона исходной задачи;) - person heeen; 27.02.2009
comment
Хе-хе, извините за это. Я обновил свой ответ, чтобы попытаться решить вашу настоящую проблему. - person Coincoin; 27.02.2009