如何推导视景体的6各面

如何推导视景体的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,只是修正了一些无关细节,以及补述相关点。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值