Снятие проекции с экранной точки обратно на изометрически спроецированный мир

StackOverflow https://stackoverflow.com/questions/912418

Вопрос

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

У меня есть проекционная матрица, которая в своей простейшей форме выглядит следующим образом:

 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

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

Например

Туалет: 500,0,500 = Экран: -1.44, 350, 500 (X и Y верны)

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

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

Экран: -1.44, 350, 0 = Туалет: -2, -402.97, 0 (Итак, мусор.)

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

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

Редактировать

Я должен отметить, что смысл unproject в том, чтобы получить луч для выбора мышью..

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top