博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
透视投影变换的感想
阅读量:5269 次
发布时间:2019-06-14

本文共 1072 字,大约阅读时间需要 3 分钟。

今天在网上找到这篇文章:

http://blog.csdn.net/popy007/article/details/1797121

 

里面详细的说明了如何推导出一个OpenGL的透视投影变换矩阵

 

其中推导出的第一个投影矩阵为:

[        ]

N  0  0  0

0  N  0  0

0  0  a  b

0  0    -1  0

[        ]

这是由Pproj = (-N*x/z, -N*y/z, -(a*z+b)/z)换算出的一个矩阵来的

 

那为什么这里要用z = -(a*z+b)/z来替换呢?

 

作者已经说了,这样替换的最主要的目的是为了之后的规范化计算而写成的

 

那为什么一定要将z写成 -(a*z+b)/z 这个等式呢?

 

经过一大翻的思考,总结出如下:

除以-z这个意图很明显,是为了与之前的透视除法一致,所以必须要这样写

 

那为什么是a*z + b呢?

 

一看上去感觉好暴力,但仔细思考,这里其实是一个移动的平面来的!!而且这个平面在接下来的透视投影之前做规范化处理需要用到的!

这个移动的平面是 -(a*z+b)/z 在[N, F]中的,由于-z是通过为透视除法而生成的,我们可以认为这个平面主要是由a*z + b来决定的!

 

而这个a*z + b与平面的方程 a*x + b*y + c*z + d = 0其实就是同一回事,只是a变成了c,b变成了d,而x和y都是0

 

但要注意这个平面的范围不在[N, F]的范围之内(不能忽视前面的透视除法)

 

所以我个人的愚见,将其理解成为一个移动的平面,便于自己的理解!

 

写于3月9日:

 

昨天的写的东西没有很强的理论可以解析到,只是自己的一时意会,但数学是严谨的,所以今天拼命找资料,并不断地反思,最后在这里找到了答案:

http://www.songho.ca/opengl/gl_projectionmatrix.html

 

为什么会有(-(a*z+b)/z)呢?这是因为假设透视投影后 zp =-N, 而规范会变换的zn = zp/wp,有zn = (a*x + b*y + c*z + d*w)/wp

 

而由于透视投影的关系,我们可以认为a 和 b都是等于0的,因为zn 与他们没有任何关系,所以

 

zn = (c*z + d*w) /wp,又因为w = 1,wp = -z,所以就有上面那个式子:(-(a*z + b)/z)的结果了!!!!!!

 

 

 

转载于:https://www.cnblogs.com/junjie020/archive/2012/03/08/2385956.html

你可能感兴趣的文章
Redis的安装与使用
查看>>
P1970 花匠
查看>>
java语言与java技术
查看>>
NOIP2016提高A组五校联考2总结
查看>>
RabbitMQ学习系列三:.net 环境下 C#代码订阅 RabbitMQ 消息并处理
查看>>
Python日期计算
查看>>
对其他团队的项目的意见或建议
查看>>
iOS 项目的编译速度提高
查看>>
机房收费系统——报表
查看>>
How to unshelve many shelves at same time
查看>>
table中checkbox选择多行
查看>>
动态链接库
查看>>
Magento开发文档(三):Magento控制器
查看>>
使用Docker官方的Django包【转】
查看>>
SuperSocket 学习
查看>>
给培训学校讲解ORM框架的课件
查看>>
此实现不是 Windows 平台 FIPS 验证的加密算法的一部分
查看>>
性能调优攻略
查看>>
线段树模板讲解
查看>>
ie6解决png图片透明问题
查看>>