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

投影矩阵推导_矩阵投影变换概要投影变换是计算机图形学的基础,理解并推导投影矩阵也是很有必要的。正交投影比较简单,没有透视失真效果(近大远小)。而透视投影比较符合人类的眼睛感知,平行线在远处会相交于一点。投影是通过一个4×4的矩阵来完成的,将视锥映射成标准观察体(齐次裁剪空间)。正交投影OpenGLOpenGL采用的是右手坐标系,z轴朝屏幕向外,因此观察方向是朝着z轴负方向的,那么将x,y,z坐标从区间[l,r],

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

概要

投影变换是计算机图形学的基础,理解并推导投影矩阵也是很有必要的。正交投影比较简单,没有透视失真效果(近大远小)。而透视投影比较符合人类的眼睛感知,平行线在远处会相交于一点。
投影是通过一个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.net/185976.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Facebook 秘钥散列

    Facebook 秘钥散列先下载OpenSSL工具执行这个命令keytool-exportcert-aliasandroiddebugkey-keystoredebug.keystore>c:\openssl\bin\debug.txt其中androiddebugkey是你xxx.keystore文件的路径,debug是你.keystore文件的名字然后路径cd到openssl文件夹下的bin目录执行opensslsha1-binarydebug.txt>debug_sha.t

    2022年5月15日
    44
  • @RequestBody的使用[通俗易懂]

    @RequestBody的使用[通俗易懂]提示:建议一定要看后面的@RequestBody的核心逻辑源码以及六个重要结论!本文前半部分的内容都是一些基本知识常识,可选择性跳过。声明:本文是基于SpringBoot,进行的演示说明。基础知识介绍:@RequestBody主要用来接收前端传递给后端的json字符串中的数据的(请求体中的数据的);GET方式无请求体,所以使用@RequestBo…

    2022年4月27日
    75
  • c# splitContainer控件

    c# splitContainer控件splitContainer可以把窗口拆分为两部分可以使用多个splitContainer常用属性(1).splitContainer不能被鼠标直接点击选中,可通过右击->选择splitContainer选中。(2).属性IsSplitterFixed用于设置拆分器能否移动。(3).属性FixedPanel若设置为Panel1(或Panel2),在调整窗

    2022年7月18日
    28
  • MyBatis插件_mybatis插件实际应用

    MyBatis插件_mybatis插件实际应用2018年2月更新2017.3可用,提供一个网上比较多的一个版本V3.21版本,下载资源里面有个已整合版直接解压放入C:\Users\你的用户名\.IntelliJIdea2017.3\config\plugins这个文件夹即可CSDN下载注意:有些人就是不成功!因为你的IDEA版本太老了,不支持3.21这个…

    2022年10月7日
    4
  • github 收藏_安全小案例分享

    github 收藏_安全小案例分享小案例GitHub地址收藏说明:平时用到的小案例会收藏到此处点击标题直接进入原创者位置并会标明作者js轮播图支持移动端制作人:hishionH5页面唤起APP/移动端网页打开APP作者:ihziluoh…

    2022年4月19日
    52
  • DS18B20温度传感器的工作原理_基于ds18b20的温度报警仿真

    DS18B20温度传感器的工作原理_基于ds18b20的温度报警仿真数字温度传感器(DS18B20)传感器参数

    2025年12月14日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号