视锥体

如图,近截面与远截面之间构成的这个四棱台就是视锥体,而透视投影矩阵的任务就是把位于视锥体内的物体的顶点X,Y,Z坐标映射到[-1,1]范围。这就相当于把这个四棱台扭曲变形成一个立方体。这个立方体叫做规则观察体   (Canonical View Volume, CVV)。如下图:

变换方法或规则:

如下图,有一点P,位于视锥体内,设坐标为(x,y,z).分别对x,y坐标和z坐标的变换到[-1,1]的方式进行讨论:

1.x,y坐标的变换方式:

(1)连接视点eye与P点与近裁剪面交于P’点

(2)设近裁剪面的宽度为W,高度为H,P’点的x坐标范围是[-W/2,W/2],y坐标范围是[-H/2,H/2],然后分别线性映射至[-1,1]内即可。

2.z坐标的变换方式

z坐标的范围是N至F,需要映射到[-1,1],映射方法暂时按下,不做想法。

透视投影函数形式

void Matrix4X4::initPersProjMatrix(float FOV, const float aspect, float zNear, float zFar)

透视投影矩阵构建函数的参数:

Fov:纵向的视角大小

aspect:裁剪面的宽高比

zNear:近裁剪面离摄像机的距离,图中的n

zFar:远裁剪面离摄像机的距离,图中的f

通过这几个参数和三角函数的数学知识可以求得近裁剪面的高度,参考上图:

求得点P在近裁剪面的投影点P’的坐标

根据相似三角形对应边长度的比率相同,由图可得

其中

x’,y’的范围沿原点对称,只要将他们分别除以W/2,H/2,即可以使范围位于[-1,1]内。前面已求得W,H,因此:

假设

我们最后需要的坐标点P’’即是

推导矩阵

然后为了自动化的得到这个结果,我们使用矩阵这种数学工具,将一个矩阵乘以一个向量,得到一个新的向量,使得我们所有的运算步骤和运算数据蕴藏在矩阵和乘法中。下面的工作就是寻找到一个矩阵使得:

我们发现求解

很难找出合适的m00、m02,因为左边x和z是以加法的形式相邻,右边z确成为了x的分母。

解决方法:将右边的以四维列向量表示的坐标每一项乘以z,所以有:

所以可以求得矩阵为

最后求得投影矩阵为

将这样的矩阵乘以视锥体内的一个顶点坐标,得到一个新的向量,再将这个向量的每个分量除以第四个分量(z),这样就可以得到顶点映射到规则立方观察体后的新的坐标。

注意:z坐标的映射方式的获得,最后我们是为了方便矩阵乘法的操作反向求得了z坐标与cvv中的z坐标的映射方式:

可见两者的映射并不是线性的,当z越大时,z的变化对z’’的扰动越小

3D数学之透视投影矩阵的推导相关推荐

  1. 3D数学-裁剪空间与透视投影矩阵的推导

    3D数学-裁剪空间与透视投影矩阵的推导 透视投影矩阵的变换本质,是将视锥体变换到裁剪空间中 视锥体的具有六个面,近裁剪面,远裁剪面,左裁剪面,右裁剪面,上裁剪面,下裁剪面 所有超出视锥体的都会被舍弃, ...

  2. webgl学习之路(三)——透视投影矩阵的推导过程

    关于透视投影矩阵的讲解,网上有不少教程,但是有一点大家基本上都没有讲清楚:就是z轴坐标(这里的Z轴相当于景深)的推导过程,基本上是一笔带过. 下面先从头开始讲推导过程,再慢慢说Z轴的推导过程. 透视投 ...

  3. 3D数学读书笔记——矩阵基础番外篇之线性变换

    本系列文章由birdlove1987编写.转载请注明出处. 文章链接:http://blog.csdn.net/zhurui_idea/article/details/25102425 前面有一篇文章 ...

  4. 3D数学读书笔记——矩阵进阶

    本系列文章由birdlove1987编写,转载请注明出处. 文章链接:http://blog.csdn.net/zhurui_idea/article/details/25242725 最终要学习矩阵 ...

  5. OpenGL之3D数学的向量和矩阵

    向量 一.基本概念 既有大小又有方向的量称之为向量,与之相对应的是标量,标量是只有大小没有方向的量: 在3D笛卡尔坐标系:基本上,一个顶点就是XYZ 坐标空间上的一个位置,而在空间中给定的⼀个位置恰恰 ...

  6. 【转载+补充】“最简单的” 相机透视投影矩阵推导与解析

    原文链接 作者:大其心宏其量扩其识 链接:https://www.jianshu.com/p/09fef48e7b0f 来源:简书 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. ...

  7. 透视矩阵的推导(最直观、最深入、最还原,看完请点赞。)

    由参数l,r,b,t,n,f定义的透视投影矩阵的推导困惑了我差不多一个多礼拜,这几天几乎是天天都在思考这个问题,昨天晚上3点多钟我突然醒了,然后我又开始想这个问题,结果终于让我给想通了,于是我赶紧起床 ...

  8. Cesium 透视投影矩阵推导

    一.透视投影 透视投影是3D固定流水线的重要组成部分,是将相机空间中的点从视锥体(frustum)变换到规则观察体(Canonical View Volume)中,待裁剪完毕后进行透视除法的行为.在算 ...

  9. Unity中的3D数学—02向量与矩阵

    1.向量 1.1 向量的运算 运算 公式 矢量和标量的乘/除法 k v = ( k v x , k v y , k v z ) k\mathbf{v}=(kv_x,kv_y,kv_z) kv=(kvx ...

最新文章

  1. 打开线程 | 进程 | 协程的大门
  2. 浅谈工作流引擎的几个关键因素
  3. 【整洁之道】如何写出更整洁的代码(上)
  4. 计算机一级电子表格TF函数,tf.slice()函数详解(极详细)
  5. oracle数据库计数器,DM 达梦数据库 表的 行计数器(COUNTER)属性
  6. Java黑皮书课后题第3章:3.26(使用操作符 ||和^)编写一个程序,提示用户输入一个整数值,然后判断它能否被5和6整除、能否被5或6整除、以及能否被5或6整除但不能被同时整除
  7. SAP CRM呼叫中心和社交媒体集成的所有BC set实现列表
  8. 玩Java 8 – Lambda,路径和文件
  9. MATLAB基本二维曲线绘制
  10. android 栈溢出 检查,安卓源码编译完成后打包时出现栈溢出,求大家解决
  11. vue项目中vue-echarts讲解及常用图表方案实现
  12. sql替换字符串中的部分字符
  13. Linux学习第一周作业。
  14. 分享两款雪花特效代码
  15. 基金训练营学习笔记4-指数基金
  16. js中Array对象。concat,concat,pop,push,reserve,shift,slice,splice,toString,toLocaleString,unshift
  17. 对[我所认识的BIOS]系列 -- CPU的第一条指令 一文扩充(III):从源代码到 FFS 文件
  18. Anchor-based 与 Anchor-free
  19. Jodd-Java的瑞士军刀 demo
  20. ECIF OCRM ACRM

热门文章

  1. yanshee 机器人2
  2. 代码走查和代码审查_代码审查随时间而变化
  3. webpack打包生成的map文件_webpack-sourcemap映射关系
  4. k8s系列之:Unable to connect to the server: x509: certificate signed by unknown authority
  5. JAVA之JUC系列 - JAVA内存模型
  6. SDUT 2021 Spring Individual Contest(for 20) - 2
  7. 百度希壤与奇安信联手打造国内首个元宇宙网络安全大会
  8. 《无监督因果特征提取高速列车故障检测》论文阅读
  9. 什么是JAVA虚拟机(JVM)?
  10. 哈工大一位师兄个人简历 谨以自勉