正交投影矩阵与透视投影矩阵的推导

正交投影矩阵

正交投影矩阵的视锥体是一个长方体 [ l , r ] [ b , t ] [ f , n ] [l,r][b,t][f,n] [l,r][b,t][f,n],我们要把这个长方体转换到一个正方体 [ − 1 , 1 ] [ − 1 , 1 ] [ − 1 , 1 ] [-1,1][-1,1][-1,1] [1,1][1,1][1,1]中,如下图所示

在这里插入图片描述
第一步为平移,计算出长方体的中心点为 [ ( l + r ) / 2 , ( b + t ) / 2 , ( f + n ) / 2 ] [(l+r)/2,(b+t)/2,(f+n)/2] [(l+r)/2,(b+t)/2,(f+n)/2],然后将中心点移动到原点,矩阵为
M t r a n s l a t e = [ 1 0 0 − ( l + r ) / 2 0 1 0 − ( b + t ) / 2 0 0 1 − ( f + n ) / 2 0 0 0 1 ] \mathbf M_{translate} = \begin{bmatrix} 1 & 0 & 0 & -(l+r)/2 \\ 0 & 1 & 0 & -(b+t)/2 \\ 0 & 0 & 1 & -(f+n)/2 \\ 0 & 0 & 0 & 1 \end{bmatrix} Mtranslate= 100001000010(l+r)/2(b+t)/2(f+n)/21
第二步为缩放,例如从 [ l , r ] [l,r] [l,r]缩放到 [ − 1 , 1 ] [-1,1] [1,1],缩放系数为 2 / ( r − l ) 2/(r-l) 2/(rl),所以矩阵为
M s c a l e = [ 2 / ( r − l ) 0 0 0 0 2 / ( t − b ) 0 0 0 0 2 / ( n − f ) 0 0 0 0 0 ] \mathbf M_{scale} = \begin{bmatrix} 2/(r-l) & 0 & 0 & 0 \\ 0 & 2/(t-b) & 0 & 0 \\ 0 & 0 & 2/(n-f) & 0 \\ 0 & 0 & 0 & 0 \end{bmatrix} Mscale= 2/(rl)00002/(tb)00002/(nf)00000
综上,正交投影矩阵为 M o r t h o = M s c a l e ∗ M t r a n s l a t e \mathbf M_{ortho} = \mathbf M_{scale} * \mathbf M_{translate} Mortho=MscaleMtranslate

透视投影矩阵

透视投影矩阵的视锥体是一个四棱锥的一部分,其中近平面为 z = n z=n z=n,远平面为 z = f z=f z=f,我们要把这个视锥体转换到一个正方体 [ − 1 , 1 ] [ − 1 , 1 ] [ − 1 , 1 ] [-1,1][-1,1][-1,1] [1,1][1,1][1,1]中,可以先把远平面压缩,把视锥体压缩成一个长方体,然后再通过正交投影矩阵就可以变换到正方体中,如图。
在这里插入图片描述

视锥体压缩矩阵的求解

我们定义视锥体压缩的矩阵为 M p e r s p − > o r t h o \mathbf M_{persp->ortho} Mpersp>ortho,在把视锥体压缩成长方体的过程中,我们规定三个原则

  1. 近平面的所有点坐标不变
  2. 远平面的所有点坐标 z z z值不变,都是 f f f
  3. 远平面的中心点坐标值不变,为 ( 0 , 0 , f ) (0,0,f) (0,0,f)

首先,设 M p e r s p − > o r t h o \mathbf M_{persp->ortho} Mpersp>ortho为如下式子,先将所有元素设为未知数:
M p e r s p − > o r t h o = [ A B C D E F G H I J K L M N O P ] \mathbf M_{persp->ortho} = \begin{bmatrix} A & B & C & D \\ E & F & G & H \\ I & J & K & L \\ M & N & O & P \\ \end{bmatrix} Mpersp>ortho= AEIMBFJNCGKODHLP
对于视锥体内的任意一点 ( x , y , z ) (x,y,z) (x,y,z),压缩以后的 x , y x,y x,y坐标应该与近平面上对应的点相同,如下图所示,根据三角形的相似关系,我们可以得到 x , = n x / z , y , = n y / z x^, = nx/z, y^, = ny/z x,=nx/z,y,=ny/z
在这里插入图片描述
因此对于齐次坐标表示的 ( x , y , z , 1 ) (x,y,z,1) (x,y,z,1)一点,它在视锥体压缩后的坐标为 ( n x / z , n y / z , u n k n o w , 1 ) (nx/z,ny/z,unknow,1) (nx/z,ny/z,unknow,1),这里我们新的 z , z^, z,值还不知道,暂不讨论。为了便于后续的计算,压缩后的坐标为 ( n x , n y , u n k n o w , z ) (nx,ny,unknow,z) (nx,ny,unknow,z)。我们有下面的式子:
M p e r s p − > o r t h o ⋅ [ x y z 1 ] = [ n x n y u n k n o w n z ] \mathbf M_{persp->ortho} \cdot \begin{bmatrix} x\\ y\\ z\\ 1 \end{bmatrix} = \begin{bmatrix} nx\\ ny\\ unknown\\ z \end{bmatrix} Mpersp>ortho xyz1 = nxnyunknownz
将式子展开,我们有:
A x + B y + C z + D = n x E x + F y + G z + H = n y M x + N y + O z + P = z Ax + By + Cz + D = nx\\ Ex + Fy + Gz + H = ny\\ Mx + Ny + Oz + P = z Ax+By+Cz+D=nxEx+Fy+Gz+H=nyMx+Ny+Oz+P=z
可知:
A = n , B = 0 , C = 0 , D = 0 E = 0 , F = n , G = 0 , H = 0 M = 0 , N = 0 , O = 1 , P = 0 A = n,B = 0,C = 0,D = 0\\ E = 0,F = n,G = 0,H = 0\\ M = 0,N = 0, O = 1, P = 0 A=n,B=0,C=0,D=0E=0,F=n,G=0,H=0M=0,N=0,O=1,P=0
这时,我们知晓了矩阵中12个位置数的值,此时的矩阵如下,还剩 I , J , K , L I,J,K,L I,J,K,L四个未知数。
M p e r s p − > o r t h o = [ n 0 0 0 0 n 0 0 I J K L 0 0 1 0 ] \mathbf M_{persp->ortho} = \begin{bmatrix} n & 0 & 0 & 0\\ 0 & n & 0 & 0\\ I & J & K & L\\ 0 & 0 & 1 & 0 \end{bmatrix} Mpersp>ortho= n0I00nJ000K100L0

接下来考虑三原则中第一个原则,近平面的所有点坐标不变。对于近平面上的一点 ( x , y , n , 1 ) (x,y,n,1) (x,y,n,1),有下式:
[ n 0 0 0 0 n 0 0 I J K L 0 0 1 0 ] ⋅ [ x y n 1 ] = [ n x n y n ∗ n n ] \begin{bmatrix} n & 0 & 0 & 0\\ 0 & n & 0 & 0\\ I & J & K & L\\ 0 & 0 & 1 & 0\\ \end{bmatrix} \cdot \begin{bmatrix} x\\ y\\ n\\ 1 \end{bmatrix} = \begin{bmatrix} nx\\ ny\\ n*n\\ n \end{bmatrix} n0I00nJ000K100L0 xyn1 = nxnynnn
其中后式是为了配平方程,我们将齐次坐标 ( x , y , z , 1 ) (x,y,z,1) (x,y,z,1)等价变为 ( n x , n y , n ∗ n , n ) (nx,ny,n*n,n) (nx,ny,nn,n)

根据矩阵的第三行展开计算,可以得到
I x + J y + K n + L = n ∗ n Ix + Jy + Kn+L = n*n\\ Ix+Jy+Kn+L=nn
于是有

I = 0 , J = 0 K n + L = n ∗ n \begin{align} I = 0,J = 0 \nonumber \\ Kn + L = n * n \\ \end{align} I=0,J=0Kn+L=nn

此时矩阵如下,还剩 K , L K,L K,L两个未知数。
M p e r s p − > o r t h o = [ n 0 0 0 0 n 0 0 0 0 K L 0 0 1 0 ] \mathbf M_{persp->ortho} = \begin{bmatrix} n & 0 & 0 & 0\\ 0 & n & 0 & 0\\ 0 & 0 & K & L\\ 0 & 0 & 1 & 0 \end{bmatrix} Mpersp>ortho= n0000n0000K100L0

最后考虑三原则中第三个原则,远平面的中心点坐标值不变,为 ( 0 , 0 , f , 1 ) (0,0,f,1) (0,0,f,1)。我们有下式:
[ n 0 0 0 0 n 0 0 0 0 K L 0 0 1 0 ] ⋅ [ 0 0 f 1 ] = [ 0 0 f ∗ f f ] \begin{bmatrix} n & 0 & 0 & 0\\ 0 & n & 0 & 0\\ 0 & 0 & K & L\\ 0 & 0 & 1 & 0\\ \end{bmatrix} \cdot \begin{bmatrix} 0\\ 0\\ f\\ 1 \end{bmatrix} = \begin{bmatrix} 0\\ 0\\ f*f\\ f \end{bmatrix} n0000n0000K100L0 00f1 = 00fff
后式同样是为了配平方程,我们将齐次坐标 ( 0 , 0 , f , 1 ) (0,0,f,1) (0,0,f,1)等价变为 ( 0 , 0 , f ∗ f , f ) (0,0,f*f,f) (0,0,ff,f)

根据矩阵的第三行展开计算,可以得到
K f + L = f ∗ f \begin{align} Kf + L = f*f \end{align} Kf+L=ff
联立 ( 1 ) ( 2 ) (1)(2) (1)(2)两式,我们最终能够解得
K = n + f L = − n f K = n + f\\ L = -nf K=n+fL=nf
此时,我们终于求得了 M p e r s p − > o r t h o \mathbf M_{persp->ortho} Mpersp>ortho矩阵
M p e r s p − > o r t h o = [ n 0 0 0 0 n 0 0 0 0 n + f − n f 0 0 1 0 ] \mathbf M_{persp->ortho} = \begin{bmatrix} n & 0 & 0 & 0\\ 0 & n & 0 & 0\\ 0 & 0 & n+f & -nf\\ 0 & 0 & 1 & 0 \end{bmatrix} Mpersp>ortho= n0000n0000n+f100nf0

透视投影矩阵的求解

乘上正交投影矩阵 M o r t h o \mathbf M_{ortho} Mortho,我们便可以得到透视投影矩阵 M p e r s p \mathbf M_{persp} Mpersp
M p e r s p = M o r t h o ⋅ M p e r s p − > o r t h o = [ 2 / ( r − l ) 0 0 0 0 2 / ( t − b ) 0 0 0 0 2 / ( n − f ) 0 0 0 0 0 ] ⋅ [ 1 0 0 − ( l + r ) / 2 0 1 0 − ( b + t ) / 2 0 0 1 − ( f + n ) / 2 0 0 0 1 ] ⋅ [ n 0 0 0 0 n 0 0 0 0 n + f − n f 0 0 1 0 ] \mathbf M_{persp} = \mathbf M_{ortho} \cdot \mathbf M_{persp->ortho} =\\ \begin{bmatrix} 2/(r-l) & 0 & 0 & 0 \\ 0 & 2/(t-b) & 0 & 0 \\ 0 & 0 & 2/(n-f) & 0 \\ 0 & 0 & 0 & 0 \end{bmatrix} \cdot \begin{bmatrix} 1 & 0 & 0 & -(l+r)/2 \\ 0 & 1 & 0 & -(b+t)/2 \\ 0 & 0 & 1 & -(f+n)/2 \\ 0 & 0 & 0 & 1 \end{bmatrix} \cdot \begin{bmatrix} n & 0 & 0 & 0\\ 0 & n & 0 & 0\\ 0 & 0 & n+f & -nf\\ 0 & 0 & 1 & 0 \end{bmatrix} Mpersp=MorthoMpersp>ortho= 2/(rl)00002/(tb)00002/(nf)00000 100001000010(l+r)/2(b+t)/2(f+n)/21 n0000n0000n+f100nf0

透视矩阵一般是由 f o v , a s p e c t , f a r , n e a r fov,aspect,far,near fov,aspect,far,near四个参数定义的,我们尝试用这四个参数来表示上式中的 n , f , t , b , r , l n,f,t,b,r,l n,f,t,b,r,l六个参数。其中 f o v fov fov表示视场角, a s p e c t aspect aspect表示宽高比, f a r , n e a r far,near far,near分别表示远平面和近平面。

易知, n = n e a r , f = f a r n = near,f = far n=near,f=far
在这里插入图片描述
根据上图的三角关系,我们有
t = n e a r ∗ t a n ( f o v 2 ) , b = − n e a r ∗ t a n ( f o v 2 ) r = a s p e c t ∗ n e a r ∗ t a n ( f o v 2 ) , l = − a s p e c t ∗ n e a r ∗ t a n ( f o v 2 ) t = near * tan(\frac{fov}{2}),b = -near * tan(\frac{fov}{2})\\ r = aspect * near * tan(\frac{fov}{2}), l = -aspect * near * tan(\frac{fov}{2}) t=neartan(2fov),b=neartan(2fov)r=aspectneartan(2fov),l=aspectneartan(2fov)
最终,我们得到的透视投影矩阵为
M p e r s p = [ c o t ( f o v ) 2 ∗ a s p e c t ∗ n e a r 0 0 0 0 c o t ( f o v ) 2 0 0 0 0 n e a r + f a r n e a r − f a r − 2 ∗ n e a r ∗ f a r n e a r − f a r 0 0 1 0 ] \mathbf M_{persp} = \begin{bmatrix} \frac{cot(fov)}{2*aspect*near} & 0 & 0 & 0\\ 0 & \frac{cot(fov)}{2} & 0 & 0\\ 0 & 0 & \frac{near+far}{near-far} & -\frac{2*near*far}{near-far}\\ 0 & 0 & 1 & 0 \end{bmatrix} Mpersp= 2aspectnearcot(fov)00002cot(fov)0000nearfarnear+far100nearfar2nearfar0

参考

https://zhuanlan.zhihu.com/p/122411512

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/602876.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器学习--ROC AUC

参考 机器学习-ROC曲线 - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/347470776一文看懂ROC、AUC - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/81202617 在了解之前,我们先来认识一下以下的概念 针对一个二分类问题,将实例分成正类(postive)或…

常见算法(JavaScript版)

持续更新中… 目录 排序冒泡排序选择排序插入排序希尔排序快速排序(必须掌握)优化枢纽选择 堆排序归并排序 查找算法二分查找 排序 假设以下所有排序都是升序 快速排序在大部分情况下是效率最高的,所以笔试的时候要求写排序算法&#xff0…

SSR 服务器端渲染:提升用户体验的新趋势(下)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

Java学习,一文掌握Java之SpringBoot框架学习文集(5)

🏆作者简介,普修罗双战士,一直追求不断学习和成长,在技术的道路上持续探索和实践。 🏆多年互联网行业从业经验,历任核心研发工程师,项目技术负责人。 🎉欢迎 👍点赞✍评论…

物联网的感知层、网络层与应用层分享

物联网的概念在很早以前就已经被提出,20世纪末期在美国召开的移动计算和网络国际会议就已经提出了物联网(Internet of Things)这个概念。 最先提出这个概念的是MIT Auto-ID中心的Ashton教授,他在研究RFID技术时,便提出了结合物品编码、互联网…

CMU15-445-Spring-2023-Project #1 - Buffer Pool

前置知识,参考上一篇博客:CMU15-445-Spring-2023-Project #1 - 前置知识(lec01-06) 在存储管理器中实现缓冲池。缓冲池负责将物理页从主内存来回移动到磁盘。它允许 DBMS 支持大于系统可用内存量的数据库。缓冲池的操作对系统中的…

常用的窗体控件

常用窗体控件 MenuStrip:一个标准的菜单栏控件,可以添加菜单单项和子菜单项 //双击子菜单项同样可以添加点击事件 //menu:菜单 item:菜单选项 //当点击新建选项的时候触发的事件 private void 新建ToolStripMenuItem_Click(ob…

QT+OSG/osgEarth编译之五十八:OpenEXRUtil+Qt编译(一套代码、一套框架,跨平台编译,版本:OpenEXRUtil-3.2.1)

Qt+OSG/osgEarth跨平台编译(用Qt Creator组装各个库,实现一套代码、一套框架,跨平台编译)_qt + osgearth安装-CSDN博客 目录 1、OpenEXRUtil介绍 2、文件下载 3、文件分析

【论文解读】基于神经辐射场NeRF的像素级交互式编辑(Seal-3D)

来源:投稿 作者:橡皮 编辑:学姐 论文链接:https://arxiv.org/pdf/2307.15131 项目主页:https://windingwind.github.io/seal-3d/ 摘要: 随着隐式神经表征或神经辐射场(NeRF)的普及…

ElecardStreamEye使用教程(视频质量分析工具、视频分析)

文章目录 Elecard StreamEye 使用教程安装与设置下载安装 界面导航主菜单视频窗口分析窗口 文件操作打开视频文件 视频流分析帧类型识别码率分析分析报告 高级功能视觉表示比较模式自动化脚本 下载地址1:https://www.onlinedown.net/soft/58792.htm 下载地址2&…

Typora 编辑器 讲解 包括使用方式 快捷键 附带下载地址 (免费破解)

CSDN 成就一亿技术人! 今天来讲一下很好用的编辑器 Typora CSDN 成就一亿技术人! 什么是Typora? 它是一个 Markdown 编辑器和阅读器,这意味着您可以使用简单的格式代码 (Markdown)是一种轻量级标记语言&…

muduo网络库剖析——日志Log类

muduo网络库剖析——日志Log类 前情从muduo到my_muduo 概要日志日志级别 框架与细节成员函数 源码 前情 从muduo到my_muduo 作为一个宏大的、功能健全的muduo库,考虑的肯定是众多情况是否可以高效满足;而作为学习者,我们需要抽取其中的精华…

Java的二进制数据处理

在Java中,可以使用二进制运算来处理整数类型数据。 二进制基础知识 二进制(binary)在数学和数字电路中指以2为基数,由0和1组成的数字系统。 位运算符 位运算符是对二进制数进行操作的特殊运算符。在Java中,有以下几…

NCC基础开发技能培训

YonBuilder for NCC 是一个带插件的eclipse工具,跟eclipse没什么区别 NC Cloud2021.11版本开发环境搭建改动 https://nccdev.yonyou.com/article/detail/495 不管是NC Cloud 新手还是老NC开发,在开发NC Cloud时开发环境搭建必看!&#xff…

python基础教程七(布尔类型,条件语句,断言)

1. 布尔类型 在前面,你遇到了很多真值,现在终于需要他们了。真值也称布尔值。 用做布尔表达式(如用作if语句中的条件)时,下面的值都将被解释器视为假: False None 0 "" () [] {} 换而言之&#xff0…

207课程表

题目 你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1 。 在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出,其中 prerequisites[i] [ai, bi] ,表示如果要学习课程 ai 则 必须 先学习课程 bi 。 …

Vue2商品规格选择

Vue2Element-ui Vu2仿写拼多多商家后台规则选择&#xff0c;为什么用Vue2呢&#xff0c;因为公司用的Vue2... 样式不是很好看&#xff0c;自己调一下就行。 <template><div ref"inputContainer"><div>{{ combinationsResult }}</div><…

深入浅出Nacos的原理

前言 本文来讲一讲nacos作为底层注册中心的实现原理。那么就有这几个问题&#xff1f; 临时实例和永久实例是什么&#xff1f;有什么区别&#xff1f; 服务实例是如何注册到服务端的&#xff1f; 服务实例和服务端之间是如何保活的&#xff1f; 服务订阅是如何实现的&#…

Adobe illustrator各版本安装指南

下载链接 https://pan.baidu.com/s/11sTpMUbQEXhyjpkBlixcLg?pwd0531 #2024版 1.鼠标右击【Ai2024(64bit)】压缩包&#xff08;win11及以上系统需先点击“显示更多选项”&#xff09;【解压到 Ai2024(64bit)】。 2.打开解压后的文件夹&#xff0c;鼠标右击【Setup】选择【以…

【Pytorch】学习记录分享11——GAN对抗生成网络

PyTorch GAN对抗生成网络 0. 工程实现1. GAN对抗生成网络结构2. GAN 构造损失函数&#xff08;LOSS&#xff09;3. GAN对抗生成网络核心逻辑3.1 参数加载&#xff1a;3.2 生成器&#xff1a;3.3 判别器&#xff1a; 0. 工程实现 原理解析&#xff1a; 论文解析&#xff1a;GAN…