前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >投影矩阵推导_矩阵投影变换

投影矩阵推导_矩阵投影变换

作者头像
全栈程序员站长
发布2022-11-09 09:58:43
8760
发布2022-11-09 09:58:43
举报

大家好,又见面了,我是你们的朋友全栈君。

概要

投影变换是计算机图形学的基础,理解并推导投影矩阵也是很有必要的。正交投影比较简单,没有透视失真效果(近大远小)。而透视投影比较符合人类的眼睛感知,平行线在远处会相交于一点。 投影是通过一个4×4的矩阵来完成的,将视锥映射成标准观察体(齐次裁剪空间)。

正交投影

OpenGL

OpenGL采用的是右手坐标系,z轴朝屏幕向外,因此观察方向是朝着z轴负方向的,那么将x,y,z坐标从区间[l, r], [b,t], [-n, -f]映射到[-1, 1]的函数为:

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

得到投影矩阵:

这里写图片描述
这里写图片描述

当然也可以用一个平移和缩放矩阵的级联矩阵,来达到一样的效果。

这里写图片描述
这里写图片描述

DirectX

DirectX则是采用左手坐标系,z轴和观察方向是一致的,因此只需要将z轴坐标从[n, f]映射到[0, 1],x和y轴则和OpenGL是一样的。

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

透视投影

OpenGL

设P(Px, Py, Pz, 1)是在视锥体内的一点,那么它在近平面z=-n上的投影点,利用相似三角形原则,可以得到:

这里写图片描述
这里写图片描述

类似于正交投影,将x,y轴坐标映射到[-1, 1]区间内,得到:

这里写图片描述
这里写图片描述

然而和正交投影不同,z轴的坐标并不是线性的。在光栅化过程中,必须对z坐标的倒数进行插值,因此需要建立1/z的映射函数,这样就可以对投影深度进行插值,映射函数的形式如下:

这里写图片描述
这里写图片描述

将[-n, -f]映射到[-1, 1],可以得到:

这里写图片描述
这里写图片描述

解这个简单的二元一次方程组,可以得到A,B的值

这里写图片描述
这里写图片描述

这样就得到了z轴上的映射函数:

这里写图片描述
这里写图片描述

3D点(x, y, z)等价于齐次坐标(-xPz, -yPz, -zPz, -Pz),因此x,y,z分量都乘以-Pz得到:

这里写图片描述
这里写图片描述

得到投影矩阵:

这里写图片描述
这里写图片描述

变换后的齐次坐标,w分量为-Pz,

DirectX

DirectX的区别在于近平面为z=n,并且要将[n, f]映射到[0, 1],经过类似的计算,可以得到

这里写图片描述
这里写图片描述

得到投影矩阵:

这里写图片描述
这里写图片描述

参考资料

《3D游戏与计算机图形学中的数学方法》 《实时计算机图形学2nd》

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/185976.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022年10月4日 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概要
    • 正交投影
      • OpenGL
      • DirectX
    • 透视投影
      • OpenGL
      • DirectX
    • 参考资料
    相关产品与服务
    流计算 Oceanus
    流计算 Oceanus 是大数据产品生态体系的实时化分析利器,是基于 Apache Flink 构建的企业级实时大数据分析平台,具备一站开发、无缝连接、亚秒延时、低廉成本、安全稳定等特点。流计算 Oceanus 以实现企业数据价值最大化为目标,加速企业实时化数字化的建设进程。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档