Как уже заметил @ Rabbid76, это просто стандартный асимметричный усеченный конус. Для этого вам просто нужно знать координаты прямоугольника на ближней плоскости, которую вы собираетесь использовать, в пространстве глаз.
Однако есть и другой вариант: вы также можете изменить существующую матрицу проекции. Такой подход будет проще, если вы знаете положение вашего прямоугольника в координатах окна или в нормализованных координатах устройства. Вы можете просто предварительно умножить масштаб и матрицы перевода, чтобы выбрать любой субрегион вашего исходного усеченного конуса.
Предположим, что ваш видовой экран имеет ширину w * h
пикселей и начинается с (0,0)
в окне. И вы хотите создать усеченную фигуру, которая просто визуализирует под прямоугольник, который начинается в нижнем левом углу пикселя (x,y)
, и который имеет ширину a
пикселей и высоту b
пикселей.
Преобразовать в НДЦ:
x_ndc = (x / w) * 2 - 1
и y_ndc = (y / h) * 2 - 1
a_ndc = (a / w) * 2
и b_ndc = (b / h) * 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], я просто хотел использовать стандартные пробелы.)
Предварительное умножение M
на исходную матрицу проекции P
:
P' = M * P
Обратите внимание, что даже если мы определили преобразование в пространстве NDC, а P
работает в пространстве клипа до деления, математика все равно сработает. Используя однородные координаты, часть перевода M
будет соответственно масштабирована на w
. Полученная матрица будет просто общей асимметричной проекционной матрицей.
Теперь это не регулирует плоскости отсечения near
и far
оригинальной проекции. Но вы можете настроить их таким же образом, добавив соответствующий масштаб и перевод к координате z
.
Также обратите внимание, что при использовании этого подхода вы даже не ограничены выбором прямоугольника, параллельного оси, вы также можете произвольно вращать или наклонять его, поэтому, в основном, вы можете выбрать произвольный параллелограмм в пространстве окна.