Имитация 3D-карт с помощью просто орфографического рендеринга - PullRequest
2 голосов
/ 07 апреля 2010

Я рендерил текстурированные квадраты с точки зрения орфографии и хотел бы имитировать «глубину», изменяя UV и положения вершин четырехугольников (верхний левый, верхний правый, нижний левый, нижний правый).

Я обнаружил, что если сделать положение верхнего левого и нижнего правого углов у одинаковым, я получу не линейный «перекос», а скорее искривленный, где текстура покрывает верхний треугольник (который составляет четырехугольник). ) кажется раздавленным, в то время как текстура нижних треугольников выглядит нормально.

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

в идеале мне бы хотелось, чтобы в такой ситуации я мог установить поворот по оси x / y, а также виртуальную z-позицию (которая имитирует глубину z) с помощью функции и видеть, как она внутренне вычисляет позиции / uvs для создания 3D-эффект. Кажется, что все это должно быть математическим, когда набор двумерных преобразований может быть применен к каждому углу четырехугольника для имитации глубины, я просто не знаю, как это сделать. Я предполагаю, что это требует тригонометрии или чего-то еще, я пытаюсь вычислить математику, но не добиваюсь большого прогресса.

вот что я имею в виду:

alt text

Вверху слева - просто карта, в центре - карта с поворотом y на X градусов, а справа - карта с поворотом x и y на разные степени.

1 Ответ

4 голосов
/ 07 апреля 2010

Чтобы вычислить 2D-координаты углов, просто выберите координаты в 3D и примените трехмерные уравнения перспективы:

Оригинальный уголок карты (x, y, z)

Применить вращение (умножением матрицы), которое вы получите (x ', y', z ')

Применение перспективной проекции (выберите точку начала камеры, направление и поле обзора) Для самого простого случая это:

  • x '' = x '/ z
  • y '' = y '/ z

Теперь большая проблема - текстурирование, используемое для получения координат текстуры из пиксельных координат:

Правильный способ для вас - использовать гомографическое преобразование формы:

  • U (x, y) = (ax + cy + e) ​​/ (gx + hy + 1)
  • V (x, y) = (bx + dy + f) / (gx + hy + 1)

Факт, который является результатом соответствующих уравнений, примененных к плоскости.

a, b, c, d, e, f, g, h вычисляются таким образом, чтобы (с U, V в [0..1]):

  • U (вверху, слева) = (0,0)
  • U (сверху '', справа '') = (0,1)
  • U (внизу '', слева '') = (1,0)
  • U (внизу '', справа '') = (1,1)

Но ваша структура 2D-рендеринга, вероятно, использует вместо этого билинейную интерполяцию:

  • U (x, y) = a + b * x + c * y + d * (x * y)
  • V (x, y) = e + f * x + g * y + h * (x * y)

В этом случае вы получите плохо выглядящий результат.

И еще хуже, если визуализатор разбивает квад на два треугольника!

Так что я вижу только два варианта:

  • использовать 3D рендерер
  • вычислите текстуру самостоятельно, если вам нужно всего несколько изображений, а не анимация в реальном времени.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...