ref
Fast Extraction of Viewing Frustum Planes from the World View-Projection Matrix
视椎体平面方程
V = ( x , y , z , w = 1 ) V = (x,y,z,w=1) V=(x,y,z,w=1)
matrix M,
M
=
[
m
11
m
21
m
31
m
41
m
12
m
22
m
32
m
42
m
13
m
23
m
33
m
43
m
14
m
24
m
34
m
44
]
M = \left[ \begin{matrix} m_{11} & m_{21} & m_{31} & m_{41} \\ m_{12} & m_{22} & m_{32} & m_{42} \\ m_{13} & m_{23} & m_{33} & m_{43} \\ m_{14} & m_{24} & m_{34} & m_{44} \\ \end{matrix} \right]
M=⎣⎢⎢⎡m11m12m13m14m21m22m23m24m31m32m33m34m41m42m43m44⎦⎥⎥⎤
M ∗ V = [ m 11 m 21 m 31 m 41 m 12 m 22 m 32 m 42 m 13 m 23 m 33 m 43 m 14 m 24 m 34 m 44 ] ∗ [ x y z w ] \begin{aligned} M * V &= \left[ \begin{matrix} m_{11} & m_{21} & m_{31} & m_{41} \\ m_{12} & m_{22} & m_{32} & m_{42} \\ m_{13} & m_{23} & m_{33} & m_{43} \\ m_{14} & m_{24} & m_{34} & m_{44} \\ \end{matrix} \right] * \left[ \begin{matrix} x \\ y \\ z \\ w \\ \end{matrix} \right] \\ \end{aligned} M∗V=⎣⎢⎢⎡m11m12m13m14m21m22m23m24m31m32m33m34m41m42m43m44⎦⎥⎥⎤∗⎣⎢⎢⎡xyzw⎦⎥⎥⎤
M ∗ V = [ m 11 x m 21 y m 31 z m 41 w m 12 x m 22 y m 32 z m 42 w m 13 x m 23 y m 33 z m 43 w m 14 x m 24 y m 34 z m 44 w ] M*V = \left[ \begin{matrix} m_{11}x & m_{21}y & m_{31}z & m_{41}w \\ m_{12}x & m_{22}y & m_{32}z & m_{42}w \\ m_{13}x & m_{23}y & m_{33}z & m_{43}w \\ m_{14}x & m_{24}y & m_{34}z & m_{44}w \\ \end{matrix} \right] M∗V=⎣⎢⎢⎡m11xm12xm13xm14xm21ym22ym23ym24ym31zm32zm33zm34zm41wm42wm43wm44w⎦⎥⎥⎤
M ∗ V = [ V r o w 1 V r o w 2 V r o w 3 V r o w 4 ] = [ x ′ y ′ z ′ w ′ ] M*V = \left[ \begin{matrix} V row_1 \\ V row_2 \\ V row_3 \\ V row_4 \\ \end{matrix} \right] = \left[ \begin{matrix} x' \\ y' \\ z' \\ w' \\ \end{matrix} \right] M∗V=⎣⎢⎢⎡Vrow1Vrow2Vrow3Vrow4⎦⎥⎥⎤=⎣⎢⎢⎡x′y′z′w′⎦⎥⎥⎤
满足这个关系,则说明转换后的顶点位于视椎体内:
−
w
′
<
x
′
<
w
′
−
w
′
<
y
′
<
w
′
−
w
′
<
z
′
<
w
′
-w' < x' < w' \\ -w' < y' < w' \\ -w' < z' < w' \\
−w′<x′<w′−w′<y′<w′−w′<z′<w′
如果顶点位于剪裁空间的左侧:
−
w
′
<
x
′
-w' < x'
−w′<x′
那么:
−
V
r
o
w
4
<
V
r
o
w
1
-V row_4 < V row_1
−Vrow4<Vrow1
等价于:
V
r
o
w
1
+
V
r
o
w
4
>
0
V
(
r
o
w
1
+
r
o
w
4
)
>
0
V row_1 + V row_4 > 0 \\ V (row_1 + row_4) > 0
Vrow1+Vrow4>0V(row1+row4)>0
因此该平面方程:
x
(
m
11
+
m
14
)
+
y
(
m
21
+
m
24
)
+
z
(
m
31
+
m
34
)
+
w
(
m
41
+
m
44
)
=
0
x(m_{11}+m_{14}) + y(m_{21}+m_{24}) + z(m_{31}+m_{34}) + w(m_{41}+m_{44}) = 0
x(m11+m14)+y(m21+m24)+z(m31+m34)+w(m41+m44)=0
其他方法
https://www.zhihu.com/question/46377273
视锥的6个平面在world space里的表达?那其实就是project space里的(-1, 0, 0, 1), (+1, 0, 0, 1), (0, -1, 0, 1), (0, +1, 0, 1), (0, 0, -1, 1), (0, 0, +1, 1)这六个平面,乘上(view * project)的逆矩阵(下面简称inv(vp)),就得到了。