Если ваш мир вращается и смещается так, что камера находится на 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
находятся в повернутых и сдвинутых мировых координатах, и если вы хотите получить исходные абсолютные координаты на «карте» земли, вы отменяете и-сдвинуть их.
В этом суть.