矩阵操作
大家好,请教一个问题。
我看到这样一种用法,如下所述:
一个场景中有很多对象需要渲染,但平台机(非PC,其它控制台游戏机)渲染能力有限,所以在把这些对象传给渲染引擎前,做了一些
剔除工作,为的是不依靠管线来达到视景体外的对象的剔除。
它是这样剔除的,用当前视图矩阵左乘投影矩阵得到一个新的矩阵 newMatrix,然后取了newMatrix中的某些特定行,特定列的值来
作为剔除平面,共有4个,近平面,远平面,左平面,右平面。
问题:
我不清楚这种用法的含义,也不清楚newMatrix中行列中的值的具体意义了,所以请教各位,多谢!
[解决办法]
这是通过viewProj矩阵快速求出世界空间中的6个裁减面的方法。
我们知道是锥体经过viewproj变换后就在一个于轴平行的6面体内。比如我们定义一个点P(x,y,z,1)经过变换mul(P,matViewProj)后得到点P'(x',y',z',w')。这个时候我们知道如果对P'的每个分量都除以w'就可以把P'归一化到一个长方体的空间,即x'/w, y'/w在[-1,1]区间,z'/w在[0,1]区间,所以我们知道如果点P'的x',y'在[-w',w']区间,z'在[0,w']区间,这个点肯定就在视锥体内。
所有就有以下的推导:
假设 float4x4 matViewProj = [v0,v1,v2,v3]。其中V0,v1,v2,v3是四个列向量,根据矩阵乘法的定义又
P' = mul( P, matViewProj) = (P.v0, p.v1, p.v2, p.v3 ) = (x',y',z',w')
这里.是点乘。
根据上面的x'的范围我们有:
-w' <= x' 就是 -p.v3 <= p.v0 就是 p.v0 + P.v3 <= 0
也就是
P.(v0+v3) <= 0
把列向量换成矩阵的元素有
(x,y,z,w).(m_11 + m_14, m12 + m24, m13 + m34, m14 + m44 ) <= 0
就是
(m_11+m_14)*x + (m_12 + m_24)*y + (m_13 + m_34)*z + (m_14 + m_44)*w <=0
简单地看这是一个 A*x + B*y + C*z + D*w <= 0 描述了一个半空间,就是平面A*x + B*y + C*z + D*w = 0右边的空间
所以我们知道是锥体的左裁减面为(m_11+m_14)*x + (m_12 + m_24)*y + (m_13 + m_34)*z + (m_14 + m_44)*w = 0.
为了方便表示,就是左裁减面Left=(A,B,C,D)=(v0 + v3).
相应地可以计算出 其他的裁减面
Right =(v3 - v0)
Bottom =(v3 + v1)
Top = (v3 - v1 )
Near = (v2)
Far = (v3 - v2)
裁减的时候把点带入公式Ax+By+Cz+Dw看大与0还是小与0就可以知道在平面的里面还是外面
希望这个说得明白
[解决办法]
对于一个最简单透视矩阵(perspective-projet Matrix),投影平面为 z = -1, 投影中心在原点的透视矩阵M定义如下:
再来看一个矩阵N
这里 alpha, beta都不为0. 那么把这个矩阵应用到一个齐次坐标系中的点上,比如P(x,y,z,1),那么可以得到一点 q(x',y',z',1)
x'=x
y'=y
z'=alpha *z + beta
w'= -z
再把这个点换成一般坐标系下的点为:
x' = -x/z
y' = -y/z
z' = -(alpha + beta/z)
w'= 1
这里 alpha, beta一般定义为
在opengl中, shear matrix为
最后,把所有的结合起来,定义了一个P
其中,left,bottom,是剪裁近平面左下角坐标,right,top是近平面右上角坐标,
near,far分别是剪裁近平面和远平面
[解决办法]
对了,上面矩阵S定义为
S(-2near/(right-left), -2(near)/(top-bottom), 1)