Отказ от проецирования экрана обратно в изометрически спроецированный мир - PullRequest
7 голосов
/ 26 мая 2009

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

У меня есть матрица проекции, которая в простейшем виде такова:

 0.7       0.35     0
 0        -0.87     0
-0.71      0.35     1

Пара знаков перевернута, потому что моя система координат двигателей равна 0,0 слева вверху, + X вправо / востоку и + Z югу.

Теперь, обратное этому:

1.4080  0.5670   0.0000
0.0000 -1.1490   0.0000
1.0000  0.8050   1.0000

Теперь эти матрицы в основном работают.

Например,

WC: 500,0500 = Экран: -1,44, 350, 500 (X и Y верны)

WC: 0,0,500 = Экран: -355, 175, 500 (X и Y снова верны)

Но теперь, если вам нужно пойти другим путем, у вас больше нет этого удобного значения Z, поэтому

Экран: -1,44, 350, 0 = WC: -2, -402,97, 0 (итак, фигня.)

И многое другое - как только у меня больше не будет этого значения Z, я не смогу извлечь мировые координаты из экранных координат.

Какой здесь обходной путь?

EDIT

Я должен отметить, что цель не-проекта в том, чтобы получить луч для выбора мыши.

Кажется, что это только мое неправильное восприятие того, что я делал, что меня здесь напортачило.

Ответы [ 3 ]

8 голосов
/ 27 мая 2009

Как вы обнаружили, ваше преобразование обратно в трехмерное пространство требует какой-то координаты Z, чтобы иметь какой-либо смысл.

Я бы посоветовал вам сделать обратное преобразование дважды . Один раз с координатой Z возле экрана (ближайшей к наблюдателю), и один раз с координатой Z в задней части 3D-сцены. Эти две 3D-точки дадут вам 3D-линию, которая займет все позиции "позади" этой 2D-точки.

2 голосов
/ 27 мая 2009

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

2 голосов
/ 27 мая 2009

ты не можешь. Вы проецируете на экран, который теряет информацию.

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

[править] смотря на ваши экранные координаты, вы даете им все z-значение 0. Это означает, что последние столбцы вашей матрицы проекции должны иметь все нули, что делает эту матрицу необратимой.

...