Некоторые источники говорят о том, что это происходит в пространстве клипа после применения матрицы перспективной проекции, но до разделения перспективы (так и в трехмерном пространстве). Другие источники говорят о выполнении этого в 2D-пространстве (после разделения перспективы) с помощью такого алгоритма, как отсечение линий Коэна-Сазерленда
Традиционные алгоритмы отсечения, такие как отсечение линий Коэна-Сазерленда или многоугольника Сазерленда-Ходжмана может быть описано в 2D, но в принципе они работают и в 3D.
По сути, информация по этому вопросу не очень ясна, и я на самом деле не видел, как можно на самом деле обрезать в однородном пространстве клипа. Говорят, что вы должны это сделать, но никто не показывает, как.
Это естественно следует из определения однородного пространства и условия отсечения -w <= x,y,z <= w
. Рассмотрим обрезку отрезка прямой линии AB
(и обрезка многоугольника может быть в основном реализована как последовательность обрезки линии по краям многоугольника). Алгоритм обрезки линий Коэна-Сазерленда тривиально расширяется до однородного пространства, вы просто применяете -w
и w
в качестве границ объема просмотра в каждом измерении. Для фактического расчета пересечения нам нужно найти новую однородную точку C =(C_x, C_y, C_z, C_w)^T
, чтобы C
лежал на плоскости пересечения и на AB
, поэтому нам нужно найти t
для
C = t * A + (1-t) * B
Предположим, что мы хотим обрезать ближайшую плоскость, которая равна z = -w
.
Для C
до l ie на этой плоскости, отсюда следует, что C_z = -C_w
. Что оставляет нас с простой линейной системой уравнений:
C_x = t * A_x + (1-t) * B_x
C_y = t * A_y + (1-t) * B_y
C_z = t * A_z + (1-t) * B_z = -t * A_w - (1-t)*B_w
C_w = t * A_w + (1-t) * B_w
Из уравнения для C_z
, если следует, что:
t = (B_z + B_w) / ( (B_z + B_w) - (A_z + A_w))
Также обратите внимание, что это t
также может быть используется для интерполяции всех связанных атрибутов вершин для C. Линейная интерполяция вполне достаточна даже в случаях с искажением перспективы, потому что мы находимся здесь до разделения на перспективы, где вся трансформация перспективы совершенно аффинна относительно. 4D пространство, в котором мы работаем.