Отпроектирование 2D экранных координат в 3D координаты - PullRequest
4 голосов
/ 02 апреля 2012

Мне было интересно, как бы я смог сопоставить двухмерные экранные координаты с трехмерным миром (в частности, с плоскостью xz), зная:

-положение камеры

- уравнение плоскости экрана

- уравнение плоскости xz

Все, что я хочу сделать, это зажечь землю на плоскости xz, когда я наведу на нее мышь.

Любая помощь очень ценится!

Спасибо!

1 Ответ

5 голосов
/ 02 апреля 2012

Если ваш мир вращается и смещается так, что камера находится на x=y=z=0 (мировые координаты), координата мира z увеличивается от наблюдателя (на экран), а плоскость проекции параллельна экрануи находится в z=d (мировая координата; d > 0), тогда вы определяете экранные координаты из мировых координат следующим образом:

xs = d * xw / zw
ys = d * yw / zw

И это довольноинтуитивно понятный: чем дальше объект от плоскости просмотра / проекции, тем больше его zw и меньше xs и ys, ближе к точке схода xw=yw=0 и zw=+infinity, которая выступает в центрплоскость проекции xs=ys=0.

Переставляя все вышеперечисленное, вы получаете xw и zw назад:

xw = xs * zw / d
zw = d * yw / ys

Теперь, если ваш объект (земля) представляет собой плоскость с определенной yw, то, хорошо, этот yw известен, так что вы можете заменить его и получить zw:

zw = d * yw / ys

Найдя zw, теперь вы можете получить xw, опять же, заменивon:

xw = xs * zw / d = xs * (d * yw / ys) / d = xs * yw / ys

Итак, с учетом настройки, описанной в начале, и экранных координат xs и ys указателя мыши (0,0 - экран /центр окна), расстояние между камерой и проекционной плоскостью d, а на наземной плоскости yw вы получите местоположение точки, на которую указывает мышь:

xw = xs * yw / ys
zw = d * yw / ys

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

В этом суть.

...