Показать рекурсивно визуализированную сцену в плоскости - PullRequest
0 голосов
/ 01 мая 2018

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

Для более подробного описания, это рисунок для описания более простого случая. (В этом случае у нас есть вспомогательная сцена на центральной линии основного усеченного конуса)

С помощью этих параметров легко рассчитать перспективную матрицу, визуализированную в виде красного усеченного конуса.

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

Я думаю, что это своего рода косая перспективная проекция. А также это очень похоже на рендер зеркало. Как рассчитать эту перспективную матрицу?

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

Как уже заметил @ Rabbid76, это просто стандартный асимметричный усеченный конус. Для этого вам просто нужно знать координаты прямоугольника на ближней плоскости, которую вы собираетесь использовать, в пространстве глаз.

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

Предположим, что ваш видовой экран имеет ширину w * h пикселей и начинается с (0,0) в окне. И вы хотите создать усеченную фигуру, которая просто визуализирует под прямоугольник, который начинается в нижнем левом углу пикселя (x,y), и который имеет ширину a пикселей и высоту b пикселей.

  1. Преобразовать в НДЦ:

    x_ndc = (x / w) * 2 - 1 и y_ndc = (y / h) * 2 - 1

    a_ndc = (a / w) * 2 и b_ndc = (b / h) * 2

  2. Создание преобразования масштаба и перевода, которое отображает диапазон от [x_ndc, x_ndc+a_ndc] до [-1,1], и аналогично y:

          ( 2/a_ndc      0         0      -2*x_ndc/a_ndc-1 )
    M  =  (    0      2/b_ndc      0      -2*y_ndc/b_ndc-1 )
          (    0         0         1              0        )
          (    0         0         0              1        )
    

    (обратите внимание, что фактор 2 будет отменен. Вместо перехода на [-1,1] пространство NDC на шаге 1, мы также могли бы просто использовать нормализованный [0,1], я просто хотел использовать стандартные пробелы.)

  3. Предварительное умножение M на исходную матрицу проекции P:

    P' = M * P

    Обратите внимание, что даже если мы определили преобразование в пространстве NDC, а P работает в пространстве клипа до деления, математика все равно сработает. Используя однородные координаты, часть перевода M будет соответственно масштабирована на w. Полученная матрица будет просто общей асимметричной проекционной матрицей.

Теперь это не регулирует плоскости отсечения near и far оригинальной проекции. Но вы можете настроить их таким же образом, добавив соответствующий масштаб и перевод к координате z.

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

0 голосов
/ 01 мая 2018

Как рассчитать эту матрицу перспективы?

Асимметричная матрица проекции перспективы (основной порядок столбцов) устанавливается следующим образом:

m[16] = [
    2*n/(r-l),     0,             0,               0,
    0,             2*n/(t-b),     0,               0,
    (r+l)/(r-l),   (t+b)/(t-b),   -(f+n)/(f-n),   -1,    
    0,             0,             -2*f*n/(f-n),    0];

Где r, l, b и t - это левое, правое, нижнее и верхнее расстояния до плоскостей усечений в ближней плоскости. n и f - расстояния до ближней и дальней плоскости.

Обычно в каркасе или библиотеке проекционная матрица, подобная этой, создается функцией под названием frustum .

, например

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