参考:fast extraction viewing frustum planes from world view projection matrix
本文主要是记录下视椎体提取的主要方法
首先假设我们有一个顶点
v=(x,y,z,w=1)
和4x4矩阵
M=(mij)
,
M
是视图投影矩阵,则
变换后的顶点
v ‘=(x ‘,y ‘,z ‘,w ‘)=vM=⎛⎝⎜⎜⎜x⋅m11+y⋅m21+z⋅m31+w⋅m41x⋅m12+y⋅m22+z⋅m32+w⋅m42x⋅m13+y⋅m23+z⋅m33+w⋅m43x⋅m14+y⋅m24+z⋅m34+w⋅m44⎞⎠⎟⎟⎟T=⎛⎝⎜⎜⎜v∙col1v∙col2v∙col3v∙col4⎞⎠⎟⎟⎟T
变换后的顶点
v ′
是位于齐次坐标系中,在齐次坐标系中视椎体为一个正交盒子,若点
v ′
是位于视椎体内,则未变换前的顶点
v
也是位于视椎体内,则当以下不等式成立时,说明点位于视椎体内:
−w ′<x ′<w ′
−w ′<y ′<w ′
0<z ′<w ′
ViewProject矩阵会将视椎体变换为一个正交盒,上面的不等式描述的就是这个正交盒,盒子的左边的面是由视椎体的左平面变换而来,上平面是由视椎体的上平面变换而来
盒子的各个平面将空间分为两个部分,一个是盒子内部空间(盒子所在的半空间),一个是盒子外部空间。正如前面说的,若点在盒子内,则变换前的点位于视椎体内,则看下面的不等式
−w ′<x ′
该不等式说明该点位于左平面分割出的内空间,则
−v∙col4<v∙col1
0<v∙col4+v∙col1
0<x(m14+m11)+y(m24+m21)+z(m34+m31)+w(m44+m41)
由于
w=1
,则:
0<x(m14+m11)+y(m24+m21)+z(m34+m31)+m44+m41
平面的标准形式为:
ax+by+cz+d=0
∴a=m14+m11
b=m24+m21
c=m34+m31
d=m44+m41
意味着
0<ax+by+cz+d
时,点位于左剪裁面的内空间
所以左剪裁面就是该平面
其它剪裁平面推导类似
剪裁平面 | 推导过程 | 平面参数 |
---|---|---|
left |
−w ′<x ′
0<v∙col4+v∙col1 0<v∙(col4+col1) |
a=m14+m11
b=m24+m21 c=m34+m31 d=m44+m41 |
right |
x ′<w ′
0<v∙col4−v∙col1 0<v∙(col4−col1) |
a=m14−m11
b=m24−m21 c=m34−m31 d=m44−m41 |
bottom |
−w ′<y ′
0<v∙col4+v∙col2 0<v∙(col4+col2) |
a=m14+m12
b=m24+m22 c=m34+m32 d=m44+m42 |
top |
y ′<w ′
0<v∙col4−v∙col2 0<v∙(col4−col2) |
a=m14−m12
b=m24−m22 c=m34−m32 d=m44−m42 |
near |
0<z ′
0<v∙col3 |
a=m13
b=m23 c=m33 d=m43 |
far |
z ′<w ′
v∙col3<v∙col4 0<v∙(col4−col3) |
a=m14−m13
b=m24−m23 c=m34−m33 d=m44−m43 |