Сопоставление экранных точек с реальным 3D-местоположением

Конкретное название того, что я пытаюсь сделать, - «отменить проект» = сопоставить точку экрана с трехмерным миром.

Итак, я нашел этот сайт, на котором есть простые уравнения для отображения 3D-координат на 2D-экране:

http://www.petesqbsite.com/sections/tutorials/tuts/perspective.html

Я широко использовал эти уравнения, но теперь я хочу иметь возможность взаимодействовать с трехмерным миром, наводя курсор на экран.

Вместо того, чтобы связывать 2D-координаты с 3D-объектами, я хотел найти уравнение, которое сопоставляет экранные точки с реальными. Я попытался реконструировать следующие 2 уравнения, чтобы попытаться найти ответ:

screenPoint.x = (int) ((eye.z * (realPoint.x-eye.x)) / (eye.z + realPoint.z) + eye.x);
screenPoint.y = 480 - (int) ((eye.z * (realPoint.y-eye.y)) / (eye.z + realPoint.z) + eye.y);

Однако мне это не удалось (не математически возможно).

Любая помощь будет принята с благодарностью!

Спасибо!


person user1170679    schedule 31.03.2012    source источник
comment
В общем случае это невозможно (проекция необратима). Но в простых случаях вы можете использовать трассировку лучей, чтобы определить, какой объект проецируется на данный пиксель. Или вы можете предварительно сгенерировать информацию при создании 2D-изображения.   -  person Oliver Charlesworth    schedule 31.03.2012
comment
Итак, вы говорите, что с трассировкой лучей я могу, учитывая: -координаты камеры -уравнение плоскости экрана -уравнение некоторой плоской (xz) плоскости в 3D-карте мира точки от экрана к плоскости в 3D-мире? Я просто пытаюсь, чтобы точки на плоскости xz загорались, когда я наводил на них курсор.   -  person user1170679    schedule 31.03.2012
comment
Я нашел ответ на свой вопрос: stackoverflow.com/questions/9971701/   -  person user1170679    schedule 02.04.2012


Ответы (1)


У меня когда-то была похожая проблема. Что я сделал, так это выяснил поле зрения, которое использовалось в opengl, и вычислил расстояние по Z, при котором 1 пиксель на экране = 1 единице в opengl. Теперь всякий раз, когда я указываю куда-либо на экране, у меня есть координаты X и Y мыши на экране и координата Z, которую я вычислил ранее на основе FOV. Теперь у меня есть определенная трехмерная координата. Затем я «провел» воображаемую линию от камеры к этой точке и посмотрел, во что она попала. Я знаю, что это не простой ответ, но то, о чем вы спрашиваете, невозможно. Вот способ сделать это с некоторой хитростью

person Cedric Mamo    schedule 16.03.2013