如何推导视景体的6各面
2012-07-05 14:54:27| 分类: 3D游戏学习笔记 | 标签: |字号大中小 订阅
一般我们都是计算在世界坐标中的六个面,由于我们知道的是,在透视坐标中,每个坐标系都有固定的范围,而透视坐标所显示的范围正好为我们计算世界坐标中的六个面。
我们知道,在透视坐标中,x(-1.0f,1.0f),y(-1.0f,1.0f),z(0.0f,1.0f),所以我们很明白的知道,视景体的左面的x坐标在透视坐标中是-1.0f,而右面的1.0f,同理上面和下面可确定的是纵坐标分别是-1.0f,1.0f,最后是前后面,一般也是远近裁剪面,他们的z坐标分别是,1.0f,0.0f。既然我们知道视景体在透视坐标的某些固定值,那么我们以此为跳板,计算每一个面。
首先假如P(x,y,z,1.0f)是世界坐标中的某个点(注意是用齐次坐标,因为矩阵是四维的),我们知道相机变换矩阵以及透视变换矩阵分别为matView,matProj,而matVP=matView*matProj;所以P*matVP就是计算此坐标的透视坐标,假设
┏ M11 M12 M13 M14┓
┃ M21 M22 M23 M24┃
matVP= ┃ M31 M32 M33 M34┃
┗ M41 M42 M43 M44 ┛
那么P*matVP=(
x*M11+y*M21+z*M31+1.0f*M41,
x*M12+y*M22+z*M32+1.0f*M42,
x*M13+y*M23+z*M33+1.0f*M43,
x*M14+y*M24+z*M34+1.0f*M44
);
设P'(x',y',z',w')=P*matVP;
而在三维坐标中是P''=P'/w'=(x'/w',y'/w',z'/w');
一般平面方程表达式为a*x+b*y+c*z+d=0;
那么我们知道了该点的投影坐标那么,下面就特化某点了。
(1)计算左右面
当该点在左右面时,根据上面的描述,其x坐标投影下来是-1.0f和1.0f
所以当点是左面时,x'/w'=-1.0f,即x'=-w',也即x*M11+y*M21+z*M31+1.0f*M41= -(x*M14+y*M24+z*M34+1.0f*M44);
所以就有x*(M11+M14)+y*(M21+M24)+z*(M31+M34)+M41+M44=0;
所以左面的(a,b,c,d)=(M11+M14,M21+M24,M31+M34,M41+M44);
同理右面的(a,b,c,d)=(M11-M14,M21-M24,M31-M34,M41-M44),当然也可以是(M14-M11,M24-M21,M34-M31,M44-M41);
更推崇使用后者,原因是有利于检测点是否在裁剪空间中。
(2)上下面
此时y坐标处于-1.0f,和1.0f,所以y'=(+-)w'下面就不再赘述,以此类推。
(3)远近面同上推理
这里要注意的是,z等与0.0时直接是x*M13+y*M23+z*M33+1.0f*M43=0,那么(a,b,c,d)=(M13,M23,M33,M43);
注:本文主要思想来自http://hi.baidu.com/guqung6/blog/item/64431ac6b51f5938e5dd3bc7.html,只是修正了一些无关细节,以及补述相关点。