Как создать матрицу проекции полуорто-полу-перспективы

8

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

Таким образом, вид Frustum будет выглядеть так: Посмотреть фруструм

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

Можно ли достичь той перспективы, которую я хочу? Если так, то как будет выглядеть матрица проекции?

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

Ответы:

2

Эта проекционная матрица должна сделать свое дело:

.tg  {border-collapse:collapse;border-spacing:0;}
.tg td{font-family:Arial, sans-serif;font-size:14px;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;}
.tg th{font-family:Arial, sans-serif;font-size:14px;font-weight:normal;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;}
<table class="tg">
  <tr>
    <th class="tg-031e">1/r</th>
    <th class="tg-031e">0</th>
    <th class="tg-031e">0</th>
    <th class="tg-031e">0</th>
  </tr>
  <tr>
    <td class="tg-031e">0</td>
    <td class="tg-031e">1/t</td>
    <td class="tg-031e">0</td>
    <td class="tg-031e">0</td>
  </tr>
  <tr>
    <td class="tg-031e">0</td>
    <td class="tg-031e">0</td>
    <td class="tg-031e">-2/(f-n)</td>
    <td class="tg-031e">-(f+n)/(f-n)</td>
  </tr>
</table>

r = половина ширины ближней плоскости

t = половина высоты ближней плоскости

f = расстояние до дальней плоскости

n = расстояние до ближней плоскости

Например, попробуйте выбрать:

r = 0,1 (ширина будет 0,2)

t = 0,5 (высота будет 1,0)

f = 1000 (дальняя плоскость на расстоянии 1000)

n = 1 (ближняя плоскость на расстоянии 1)

walkingBird
источник
0

К сожалению, я не думаю, что это возможно, просто изменив матрицу проекции. После проекционной матрицы окончательные координаты экрана рассчитываются путем деления (x, y, z) на w. Для матрицы перспективы, w установлен в z. Для орфографической матрицы w установлено на 1. Вы не можете иметь разные значения w для горизонтального и вертикального значений. Другой ответ на этот вопрос - просто стандартная ортографическая матрица.

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

Мах Кобаяши
источник