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

正交投影矩阵

正交投影矩阵的视锥体是一个长方体 [ 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.mfbz.cn/a/297296.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【KD】知识蒸馏(knowledge distillation)简单介绍

最近学到了知识蒸馏的相关知识,来简单总结一下૮꒰ ˶• ༝ •˶꒱ა。 知识蒸馏 知识蒸馏,是一种模型压缩的手段。通过训练学生模仿教师的行为,将嵌入在大的教师模型中的知识迁移到小的学生模型。 例如,TinyBERT(Jiao et al.,2…

C++结合OpenCV:图像的基本表示方法

1.二值图像 二值图像是指仅仅包含黑色和白色两种颜色的图像。在计算机中,通过一个栅格状排列的数据集(矩阵)来表示和处理图像。例如,图1是一个字母A的图像,计算机在处理该图像时,会首先将其划分为一个个的小…

Mysql show Profiles详解

1.简介 show profile 和 show profiles 命令用于展示SQL语句的资源使用情况,包括CPU的使用,CPU上下文切换,IO等待,内存使用等,这个命令对于分析某个SQL的性能瓶颈非常有帮助,借助于show profile的输出信息&…

jenkins+selenium+python实现web自动化测试

jenkinsselenium可以做到对web自动化的持续集成。 Jenkins的基本操作: 一、新建视图及job 新建视图: 新建job: 可以选择构建一个自由风格的软件项目或者复制已有的item 二、准备工作: 安装Jenkins插件,SSH plugin …

快速入门Visual Studio 2022开发.Net Framework研发环境指南

IDE工具 Visual Studio 2022 Vs2022企业版 - VisualStudioSetup.exe Visual Studio Code VSCodeUserSetup-x64-1.66.2.exeVSCodeUserSetup-x64-1.67.0-insider.exe IDE环境 编程字体YaHei.Consolas YaHei.Consolas.1.12.ttf IDE插件 Visual Studio Code常用插件 Chinese…

分布式锁3: zk实现分布式锁4 使用临时顺序节点+watch监听+可重入(threadLocal)

一 zk实现分布式锁的可重入性 1.1 使用ThreadLocal属性 引入ThreadLocal线程局部变量保证zk分布式锁的可重入性。 1.2 关键代码说明 1.3 代码 1.3.1 初始化客户端 1.3.2 分布式锁代码 package com.atguigu.distributed.lock.config;import com.baomidou.mybatisplus.core…

Java:Lambda表达式、方法引用

文章目录 1、Lambda表达式1.1 Lambda表达式体验1.2 Lambda表达式的省略形式1.3 Lambda表达式练习 2、方法引用体验3、方法引用符4、引用静态方法5、引用对象的实例方法6、引用类的实例方法7、引用构造方法8、引用数组的构造方法9、方法引用练习9.1 练习19.2 练习29.3 练习3 10、…

差分电路原理以及为什么输出电压要偏移

我们在使用放大器芯片的时候,除了对放大器芯片本身应用外,通常还需要搭建一些外围电路来满足放大器芯片的使用条件,最终满足应用的功能,下面通过一个差分电路来熟悉这些应用。 差分运算放大电路,对共模信号得到有效抑…

函数——系统函数2(c++)

这次主要就只有一个系统函数: (注:a为变量名) 名称 用法 用处 sqrt sqrt(a) 算出变量a的平方根 (注:使用sqrt函数时,需要用到头文件 #i…

leetcode算法题之递归--综合练习(一)

此专题对我们之前所学的关于递归的内容进行一个整合,大家可以自行练习,提升自己的编码能力。 本章目录 1.找出所有子集的异或总和在求和2.全排列II3.电话号码的字母组合4.括号生成5.组合6.目标和7.组合总和8.字母大小写全排列9.优美的排列 1.找出所有子…

Python自动点击器

一、如何制作一个Python自动点击器? 当用户单击开始键时,代码将从键盘获取输入,并在用户单击退出键时终止自动点击器,自动点击器开始单击指针放置在屏幕上的任何位置。我们将在这里使用pynput模块。 二、什么是自动点击器&#…

FineBI实战(1):mysql实战案例简介

下面我通过案例来介绍FineBI的使用。 1 业务背景介绍 本案例围绕某个互联网小型电商的订单业务来开发。某电商公司,每天都有一些的用户会在线上采购商品,该电商公司想通过数据分析,查看每一天的电商经营情况。例如:电商公司的运…

并发(2)

目录 6.通常线程有哪几种使用方式? 7.基础线程机制有哪些? 8.线程的中断方式有哪些? 9.线程的互斥同步方式有哪些?如何比较和选择? 10.Synchronized可以作用在哪里? 6.通常线程有哪几种使用方式&#x…

Python基础知识总结3-面向对象进阶知识

面向对象三大特征介绍 继承子类扩展父类语法格式关于构造函数:类成员的继承和重写查看类的继承层次结构 object根类dir() 查看对象属性重写 __str__() 方法 多重继承MRO方法解析顺序super()获得父类定义多态特殊方法和运算符重载特殊属性 对象的浅拷贝和深拷贝组合_…

【提示学习论文五】Conditional Prompt Learning for Vision-Language Models论文原理及复现工作

Conditional Prompt Learning for Vision-Language Models 视觉语言模型的条件提示学习 文章介绍 这篇文章于2022年发表在CVPR(Conference on Computer Vision and Pattern Recognition),作者是kaiyang.zhou, jingkang001, ccloy, ziwei.li…

PostgreSQL的常见错误和解决方法

转载说明:如果您喜欢这篇文章并打算转载它,请私信作者取得授权。感谢您喜爱本文,请文明转载,谢谢。 在学习新的东西时,会犯很多的错误,会遇到很多坑。我们在填坑与犯错中不断进步成长。 以下是在学习pgsql中…

【QT】自定义代理类

目录 1 我们为什么要使用自定义代理类? 2 自定义代理类的基本设计要求 3 自定义代理的功能 4 基于QSpinBox的自定义代理类 5 自定义代理类的使用 1 我们为什么要使用自定义代理类? 传统的模型-视图框架可以让我们实现逻辑展示相分离,我们…

trino-435:dynamic catalog数据库存储代码实现

一、dynamic catalog数据库存储源码分析 dynamic catalog的实现主要涉及到两个类:CoordinatorDynamicCatalogManager、WorkerDynamicCatalogManager,这两个类的详细信息如下: 这两个类主要提供了对catalog的增删改查的方法。trino-435源码中…

C++补充内容--EasyX-UI界面

esay x 其他 地图打印(利用二维数组) 双缓冲 当我们绘制一张图 然后另一张图盖住前一张图的某个部分的时候 由于while的存在 会导致 两张图不停的闪烁 所以加入双缓冲可以解决这个问题 开启双缓冲 之后等待Flush或者End 才会进行图片的绘制 不然不会进行图片的绘制,这样就可…

docker拉取镜像提示 remote trust data does not exist for xxxxxx

1、How can I be sure that I am pulling a trusted image from docker 2、docker: you are not authorized to perform this operation: server returned 401. 以上两个问题可以试试以下解决办法 DOCKER_CONTENT_TRUSTfalse 本人是使用jenkins部署自己的项目到docker容器出现…