质疑有关透视投影矩阵的推导

hunterzone 2015-07-20 04:52:27
对参数为(l,r,b,t,n,f)的透视投影矩阵的推导,我有几点疑问,我认为它转换的话应该是先进行(-(r+l)/2, -(t+b)/2, 0)平移,然后再做透视投影。这样得到的透视投影矩阵是:

但是<real time rendering.pdf>上的推导式是:

我在网上也找了几篇透视投影矩阵的推导,感觉比较牵强或者是我还不能接受这种推导方式,Twinsen的深入探索透视投影变换Deriving Projection Matrices
我想知道我的推导思路有什么问题?请各位有经验的指点一下,感激不尽。
...全文
1007 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
hunterzone 2015-07-23
  • 打赏
  • 举报
回复
这个问题我终于解决了,有兴趣的可以看我的博客:透视矩阵的推导(最直观、最深度、最还原,看完请点赞。)
hunterzone 2015-07-22
  • 打赏
  • 举报
回复
引用 33 楼 prfans1 的回复:
以前推导过一次,感觉最终结果符号有差异。
书《3D Graphics for Game Programming》中由fovy,aspect,n,f参数定义的透视投影矩阵的推导,讲得非常详细,不过可惜的是它没讲由l,r,b,t,n,f参数定义的透视投影矩阵的推导,这个推导很不常规,《real time rendering》也没给出这个的推导,还得好好研究。。。
prfans1 2015-07-22
  • 打赏
  • 举报
回复
以前推导过一次,感觉最终结果符号有差异。
彩阳 2015-07-21
  • 打赏
  • 举报
回复
我也不清楚你为什么做平移。我以前也推导过这个公式,并且写了博客。 深度缓存(Z缓存)的研究 你可以参考看看。
zxx43 2015-07-21
  • 打赏
  • 举报
回复
问题是从视图空间到投影空间根本就没有平移操作啊,平移是在视口变换的时候做的.
hunterzone 2015-07-21
  • 打赏
  • 举报
回复
这个问题只理论推导估计没有效果,我最近在实现大场景模型的漫游器,等我把这个应用上去了再验证一下我的推导是不是有问题,暂时保留疑问。
zxx43 2015-07-21
  • 打赏
  • 举报
回复
引用 30 楼 hunter_wwq 的回复:
[quote=引用 28 楼 zxx43 的回复:] [quote=引用 26 楼 hunter_wwq 的回复:] [quote=引用 25 楼 hunter_wwq 的回复:] [quote=引用 23 楼 zxx43 的回复:] 这个里的 l r t b 都可以取不同的值,但是中心是和z轴重合的,不用做上下左右的平移,你给的情况是对正交矩阵的操作,不相干.
l,r,t,b都是对应的x轴和y轴上的坐标,假如l≠-r,t≠b,那么它的中心位置怎么会与z轴重合呢?[/quote] 写错了,假如l≠-r,t≠-b,那么它的中心位置怎么会与z轴重合呢?[/quote] 想象一下近裁剪面是这样,只要把 l r t b 分别对应到-1和1 就变成了cvv[/quote] 那么问题来了,我先把近裁剪平面的中心位置平移到z轴上,再将lrtb对应到-1和1,这样不也可以变成cvv了吗。[/quote] 这样是可以,问题是opengl不这么做,glFrustum用的是我给的那张图上的坐标系,你写的矩阵是用的你自定义的坐标系,你用你的东西去质疑opengl就像拿opengl和directx矩阵比较一样
hunterzone 2015-07-21
  • 打赏
  • 举报
回复
引用 28 楼 zxx43 的回复:
[quote=引用 26 楼 hunter_wwq 的回复:] [quote=引用 25 楼 hunter_wwq 的回复:] [quote=引用 23 楼 zxx43 的回复:] 这个里的 l r t b 都可以取不同的值,但是中心是和z轴重合的,不用做上下左右的平移,你给的情况是对正交矩阵的操作,不相干.
l,r,t,b都是对应的x轴和y轴上的坐标,假如l≠-r,t≠b,那么它的中心位置怎么会与z轴重合呢?[/quote] 写错了,假如l≠-r,t≠-b,那么它的中心位置怎么会与z轴重合呢?[/quote] 想象一下近裁剪面是这样,只要把 l r t b 分别对应到-1和1 就变成了cvv[/quote] 那么问题来了,我先把近裁剪平面的中心位置平移到z轴上,再将lrtb对应到-1和1,这样不也可以变成cvv了吗。
zxx43 2015-07-21
  • 打赏
  • 举报
回复
还有这边是坐标系中心,坐标系中心不是裁剪面中心
zxx43 2015-07-21
  • 打赏
  • 举报
回复
引用 26 楼 hunter_wwq 的回复:
[quote=引用 25 楼 hunter_wwq 的回复:]
[quote=引用 23 楼 zxx43 的回复:]

这个里的 l r t b 都可以取不同的值,但是中心是和z轴重合的,不用做上下左右的平移,你给的情况是对正交矩阵的操作,不相干.

l,r,t,b都是对应的x轴和y轴上的坐标,假如l≠-r,t≠b,那么它的中心位置怎么会与z轴重合呢?[/quote]
写错了,假如l≠-r,t≠-b,那么它的中心位置怎么会与z轴重合呢?[/quote]

想象一下近裁剪面是这样,只要把 l r t b 分别对应到-1和1 就变成了cvv
zxx43 2015-07-21
  • 打赏
  • 举报
回复
opengl的透视投影矩阵不用做上下左右平移,因为做完视景变换以后的坐标系中心就是和z轴重合的,估计是设计者图个方便,api就这么定,觉得不爽可以自己改.
hunterzone 2015-07-21
  • 打赏
  • 举报
回复
引用 25 楼 hunter_wwq 的回复:
[quote=引用 23 楼 zxx43 的回复:] 这个里的 l r t b 都可以取不同的值,但是中心是和z轴重合的,不用做上下左右的平移,你给的情况是对正交矩阵的操作,不相干.
l,r,t,b都是对应的x轴和y轴上的坐标,假如l≠-r,t≠b,那么它的中心位置怎么会与z轴重合呢?[/quote] 写错了,假如l≠-r,t≠-b,那么它的中心位置怎么会与z轴重合呢?
hunterzone 2015-07-21
  • 打赏
  • 举报
回复
引用 23 楼 zxx43 的回复:
这个里的 l r t b 都可以取不同的值,但是中心是和z轴重合的,不用做上下左右的平移,你给的情况是对正交矩阵的操作,不相干.
l,r,t,b都是对应的x轴和y轴上的坐标,假如l≠-r,t≠b,那么它的中心位置怎么会与z轴重合呢?
zxx43 2015-07-21
  • 打赏
  • 举报
回复

这个里的 l r t b 都可以取不同的值,但是中心是和z轴重合的,不用做上下左右的平移,你给的情况是对正交矩阵的操作,不相干.
hunterzone 2015-07-21
  • 打赏
  • 举报
回复
正交投影用的是缩放,透视投影运用的时相似三角形原理做的,但是在这之前的一步我认为是需要将定义的视锥体的中心平移到z轴上。
hunterzone 2015-07-21
  • 打赏
  • 举报
回复
引用 21 楼 zxx43 的回复:
但是正交矩阵推导和透视矩阵推导不一样啊
我知道不完全一样,我把那一页贴出来是jiangcaiyang123说“权威OpenGL文档上也没有这个步骤啊。有这个步骤的给我一个链接,我看看。”
zxx43 2015-07-21
  • 打赏
  • 举报
回复
但是正交矩阵推导和透视矩阵推导不一样啊
zxx43 2015-07-21
  • 打赏
  • 举报
回复
这再次说明你弄混了.
hunterzone 2015-07-21
  • 打赏
  • 举报
回复
引用 18 楼 zxx43 的回复:
rtr的这页说的是正交投影
这个是正交矩阵没问题,这一页讲的是正交矩阵的推导,先平移再进行缩放。
zxx43 2015-07-21
  • 打赏
  • 举报
回复
rtr的这页说的是正交投影
加载更多回复(15)

8,324

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧