问题原来如此简单...
2010-04-15 13:36
197 查看
透视投影对我来说一直是个大麻烦,由于都是直接用的公式,所以对透视矩阵的来历也不做深究(我只是最近偶尔才用到3D),前几天需要用到鼠标拾取模型,看了一下SDK里面的例子,不懂,又看了下别人的解说,貌似中间提到过透视矩阵,于是就就找了一下资料看了一下,被打击了,直到看到第7次,我才终于弄明白了是怎么回事。谢谢http://blog.csdn.net/popy007/archive/2007/09/23/1797121.aspx 的作者,估计我是看的次数最多了了,还好最后弄明白了(我以为明白了,嘿嘿)
应该首先是根据直线公式吧远处的点映射到近平面上,可以直接根据三角形相似得到近平面上的(x,y)的坐标和3D空间中的x,y的关系,由于映射到了近平面上了,所以z的值就等于Near了,为了后面的剪裁工作,这里在Z中保存了一个其他的值,这个值是一个关于3D空间中的z值的一个变换。到这一部时,其实已经完成透视投影了,原来的视锥体已经被矩阵扭转成长方体了,为了裁剪的需要,要把这个长方体标准化(我是这么认为的,嘿嘿),也就是x,y的值在[-1,1]之间,z的值在[0,1]之间,其中xy是通过线性插值来完成这一标准化的,而Z貌似就是上面提到的关于Z的那个变换z‘ =( Az + B )/ z,是单调递增的,但是不是线性的,z = Near时,z'为0,z等于Far时,z'为1,也能求出AB的值(因为Near和Far是知道的,解方程嘛),最终的点是标准视体里的点了。至于后来貌似先裁剪,然后再透视除法,也就是除以W值((x,y,z,w)中的W)。说的比较粗,还不知道对不对,嘿嘿,别打击我。鼠标拾取的话,和这个的逆过程差不多.现根据鼠标坐标和近平面大小(用的是backbuffer的宽高),透视矩阵中控制宽高缩放的2项,11和22算出在标准视体中的x,y,在用世界矩阵和视角矩阵的乘积的逆矩阵来变换下就可以了。
应该首先是根据直线公式吧远处的点映射到近平面上,可以直接根据三角形相似得到近平面上的(x,y)的坐标和3D空间中的x,y的关系,由于映射到了近平面上了,所以z的值就等于Near了,为了后面的剪裁工作,这里在Z中保存了一个其他的值,这个值是一个关于3D空间中的z值的一个变换。到这一部时,其实已经完成透视投影了,原来的视锥体已经被矩阵扭转成长方体了,为了裁剪的需要,要把这个长方体标准化(我是这么认为的,嘿嘿),也就是x,y的值在[-1,1]之间,z的值在[0,1]之间,其中xy是通过线性插值来完成这一标准化的,而Z貌似就是上面提到的关于Z的那个变换z‘ =( Az + B )/ z,是单调递增的,但是不是线性的,z = Near时,z'为0,z等于Far时,z'为1,也能求出AB的值(因为Near和Far是知道的,解方程嘛),最终的点是标准视体里的点了。至于后来貌似先裁剪,然后再透视除法,也就是除以W值((x,y,z,w)中的W)。说的比较粗,还不知道对不对,嘿嘿,别打击我。鼠标拾取的话,和这个的逆过程差不多.现根据鼠标坐标和近平面大小(用的是backbuffer的宽高),透视矩阵中控制宽高缩放的2项,11和22算出在标准视体中的x,y,在用世界矩阵和视角矩阵的乘积的逆矩阵来变换下就可以了。
相关文章推荐
- 我被Excel 玩死了,身份证问题原来如此简单!
- 终于解决了在c#里面用鼠标查找窗口的问题,原来如此简单
- zoj1494 暴力模拟 简单数学问题
- 第七周简单计算问题(2)
- 第七周 简单分支问题(3)
- DP之简单的求最大字段和问题
- 第7周 项目2-2 简单计算问题体验
- 使用Redis模拟简单分布式锁,解决单点故障的问题
- 对于简单问题的理解概述
- 各种小问题,各种简单的问题..持续更新.....
- 今天在国外论坛上为别人解决一个简单问题
- 简单实现AJAX: ASP.NET2.0 中回调的实现及常见问题的解决
- 邮票 问题 简单易懂
- jstack简单使用,定位死循环、线程阻塞、死锁等问题
- 简单的解决js跨域问题
- Qt程序聊天弹屏问题简单解决方法(类似QQ聊天聊天窗口弹屏)
- Node解决简单重复问题系列之Excel内容的获取
- 简单的线性回归问题(python实现)
- php环境的搭建问题(简单记录)
- 简单描述下运用echarts地图时遇到的几个问题