投影矩阵网上推导一大堆,怎么构建矩阵,怎么运用透视除法等都有说,但说清楚为什么这样做的貌似不多。我现在尝试用矩阵乘法的本质去说明投影矩阵是怎么推导的。

以下向量统一用列向量表示法。

1.坐标转换

坐标的表达形式(Fundamentals of Computer Graphics, 4th page 135)

看上图,p在世界坐标系下的坐标值有两种表示法:

其中:

u,v是e坐标系下的标准正交基。

从图中可以看到,p在o坐标系下的坐标是(2.5,0.9),在e坐标系下是(0.5,-0.7)。

但按上面两个公式,算出来的值都是(2.5,0.9)。

我们把  的方程化为矩阵:

从矩阵可以看出(x,y)->(u,v)的转换关系。如下式:

那么,e坐标系下的坐标可由下式求的:

由于[u v]是正交矩阵,所以有:

说了这么多,目的是为了引出下面的推导,世界坐标转到摄像机空间坐标

上式可写为:

2.摄像机矩阵推导

先明确一点:这里说的摄像机矩阵是指世界空间到摄像机的矩阵。

摄像机空间的三个基分别是向量right,up,look,世界空间中的位置是P。以R表示摄像机right向量,U表示up向量,V表示look向量,我们的目的是把R,U,V三个向量分别转换到x,y,z向量。

由于这个向量比较难转换,我们换种思路,把x,y,z轴转到RUV的矩阵是:

由于该矩阵是正交矩阵,那么有

回想一下,在空间中绕一点P旋转,是不是,可以看成先把P移到原点,然后旋转,再移动回P点上。

而摄像机空间,是把摄像机的坐标移动到原点,再把各个轴旋转到xyz轴上。

假设摄像机世界坐标是P,矩阵如下:

把两个矩阵相乘得到最后的lookup矩阵C:

这里解释了为何LookUp矩阵的平移项是-P·R而不是-P,因为是矩阵相乘的结果。

摄像机空间转换矩阵推导完毕后,下一步是从摄像机空间转到投影空间。

3.正交投影矩阵的推导

我一直在想一个问题,能否用线性代数的投影矩阵来推导出正交投投影矩阵?

根据线性代数的投影矩阵推导公式,假设向量v在平面A[a1 a2]上的投影向量是p,则p可表示为下式:

其中a1,a2是平面的线性组合向量。这里有个限制:A必须是列空间,即A所在的空间一定包含零点

假设向量v投影到A空间后得到p,我们要求的矩阵是:Pv = p中的P

再有向量r = v - p,则向量r垂直平面A,即向量r与a1和a2都垂直。得到如下式子:

以上两式组合得:

把r = v - p,p=Ax代入上式得

简写成

Ax=p,两边乘以A得

即得投影矩阵

更详细的性质与推导可以看线性代数投影矩阵的相关参考。

下面详细说出相机正交投影推导:

A是XOY平面,v是空间中一点。

然后要把投影坐标映射到NDC空间。NDC是一个归一化的盒子,z范围0-1,x,y都是-1到1,我手动画图来说明。

屏幕x轴的映射关系是

  其中w是屏幕映射区域的宽

同理屏幕y轴的映射关系是

  其中h是屏幕映射区域的高

现在我们把w换成r-l,把h换成t-b,r是投影区域的右X坐标,l是左X坐标,t和b同理。

z轴的映射关系如下:

求得映射方程如下:

最后得到投影矩阵O:

我们看到,P怎么变换也不能变换到O,这是为什么呢?

个人理解:P的行列式是0,没有逆矩阵,意味着你无法知道原来的Z的位置。因为线性代数中的投影矩阵是降维操作,而图形学中的投影是一个线性方程变换。

===============================

看了闫令琪的图形学中的推导,是我看过最好最直观的。

简单来说,正交投影就是把长方体的盒子,转换到中心为0的标准正方体[-1, 1]³。

这里是把z的n和f变换到-1到1中,和上面的[0,1]不一样

上图来源于闫令琪的教程,注意,我这里是左手坐标系,把图修正了。

长方体的平移距离是,矩阵表示为:

Scale就更简单了,l到r缩放到-1到1,缩放因子就是2 / (r - l),其他同理。

正交投影矩阵是:

4.透视投影的推导

参考闫令琪的教程,透视投影就是先把Frustum变换到一个box,然后再进行正交投影的过程。

先看这个连接,https://sites.cs.ucsb.edu/~lingqi/teaching/resources/GAMES101_Lecture_04.pdf

后面我再在这里写过程,并把闫令琪留给我们的问题写出来。

首先,齐次坐标的表示:

(x, y, z, 1),(wx, wy, wz, w != 0),(xz, yz, z², z != 0)均表示同一个点。

下一步,如何把frustum变换到正交投影的box?

侧视图:

y和y'的转换可写成:

那么我们要找到一个矩阵,可以把(x, y, z, 1)变换到坐标(x', y', ?, 1) = (yn/z, xn/z, ? 1) = (yn, xn, ? z)

一矩阵乘法的形式表示:

根据矩阵乘法,,row1 = (n, 0, 0, 0),row2和row4也是如此

关键第三行如何求?

但z = n时,经过该矩阵的转换后仍然是n

点乘法则:

当z = f时,仍然按上面的法则推导

解方程组求A,B得:

A = n + f

B = -nf

最后投影矩阵:

另一种方式的投影矩阵

假设摄像机坐标本来就已经在原点,l + r = 0,t + b=0。

并且r - l = width,t - b = height

投影矩阵可以写成:

摄像机垂直方向的视角是fov,如下图:

再看下面的式子:

投影矩阵可以最后写成:

如果正交投影中,变换到一个在z是0-1的box,只需要修改Ot和Os矩阵:

这种情况下的投影矩阵可写成:

看一下z的变化:

函数图大概是这样:

横轴是z,纵轴是z'(0,1)。

5.NDC坐标到屏幕坐标的转换

NDC中x是-1到1,y也是-1到1,而窗口大小分别是width和height。

下面是NDC的坐标与屏幕坐标的映射关系:

        

对应方程分别是:

屏幕空间的z是0-1之间,我假设这里的NDC的z也是0-1,(opengl是-1,1),z对应的变换如下:

因此得到NDC到屏幕坐标的矩阵S。

做后屏幕坐标就是:

所以,世界坐标到屏幕坐标的最后映射关系是:

详细的世界坐标转屏幕坐标及投影矩阵的推导相关推荐

  1. 【转】投影矩阵的推导

    [转]投影矩阵的推导 原文:https://www.cnblogs.com/wonderKK/p/5695116.html 博主: 这篇文章写得非常好,对投影矩阵的推导清晰明了,但有个错误:推导的全程 ...

  2. opoengl 投影矩阵的推导

    原文:http://blog.csdn.net/wangdingqiaoit/article/details/39010077 OpenGL学习脚印: 投影矩阵的推导 写在前面 本节内容翻译和整理自h ...

  3. 投影矩阵的推导(Deriving Projection Matrices)

    本文乃<投影矩阵的推导>译文,原文地址为: http://www.codeguru.com/cpp/misc/misc/math/article.php/c10123__1/Derivin ...

  4. 投影矩阵的推导(Deriving Projection Matrices)(转)

    本文乃<投影矩阵的推导>译文,原文地址为: http://www.codeguru.com/cpp/misc/misc/math/article.php/c10123__1/Derivin ...

  5. (转)投影矩阵的推导(Deriving Projection Matrices)

    转自:http://blog.csdn.net/gggg_ggg/article/details/45969499 本文乃<投影矩阵的推导>译文,原文地址为: http://www.cod ...

  6. 向任意平面的投影矩阵的推导

    概述 方法来自于<3D数学基础,图形与游戏开发>这本书. 基本原理 这个方法其实有点思维跳跃,原理是首先推导出一个任意方向n缩放比例为k的缩放矩阵,然后将k变成0,这就变成了向垂直于n的投 ...

  7. 深入理解OpenGL之投影矩阵推导

    深入理解OpenGL之投影矩阵推导 OpenGL流水线中的投影矩阵以及坐标变换 OpenGL中,投影矩阵在Vertex shader中使用,用于变换顶点.一般和Model, View矩阵结合成MVP矩 ...

  8. 投影矩阵(投影变换)解惑

    背景 投影矩阵的推导曾经让我困惑了很久,反思可能是自己数学知识的浅薄,所以很多大神写的关于投影矩阵的推导很明晰还是看不懂,好在经过两周的努力学习和思考,终于弄明白了这个问题,特此做一个总结和大家分享一 ...

  9. 3D游戏之投影矩阵算法技术实现

    笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人,已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社 和<Unity3 ...

  10. 投影矩阵之z坐标推导

    看了好几篇关于投影矩阵的文章,在z坐标的推导上,没有提到为什么z'和1/z成线性关系,而是通过结论中的投影矩阵,即已知z'= (zA + B)/w,并且x和x',y和y'关系式中分母都有-z,所以w为 ...

最新文章

  1. C++学习笔记-----不要在构造函数和析构函数中调用虚函数
  2. 天天生鲜的用户登录机制和redis的作用
  3. 电子书下载:Programming Microsoft LINQ in Microsoft .NET Framework 4
  4. springboot + ApplicationListener
  5. 01_MySQL基础课堂笔记
  6. 互联网日报 | 苹果首款自研芯片M1亮相;酷派主动终止与小米专利侵权诉讼;橙心优选日订单破700万...
  7. Windows live messenger (WLM)邀请大放送--MSN8.0版(有条件)
  8. 如何让地面不起灰_水泥地面起灰怎么办?
  9. 每日算法系列【LeetCode 1031】两个非重叠子数组的最大和
  10. 【Struts2】〖登录功能〗Struts2框架实现登录功能
  11. 基于马科维茨与蒙特卡洛模型的资产最优配置模型(Matlab代码实现)
  12. 世嘉MD游戏开发【十一】:背景卷轴滚动(视差滚动)Parallax Scroll和摄像机
  13. 软件项目管理考试指南—By XJTUSE【YJQ】
  14. 毛笔书法艺术作品,能不能写简化字?
  15. Bootstrap第一章初识
  16. 人脸、指纹、虹膜、行为,你需要的人工智能生物识别AI数据集全在这里
  17. 【数值分析】用matlab解决插值问题、常微分方程初值问题
  18. CAN通信详解(全)
  19. Android 自定义数字角标
  20. 什么是BFC机制,如何触发BFC(消除浮动带来的父元素塌陷、垂直方向margin重叠、嵌套块级元素父元素margin塌陷)

热门文章

  1. axure 调整中继器列宽_Axure RP 8教程 - 中继器功能改进
  2. javascript 代码转换为 typescript 代码
  3. UML图:用例图详细介绍
  4. Oracle中国区管理层变更史
  5. 上传本地文件到服务器:not a regular file
  6. 自然辩证法概论-雨课堂
  7. 沪深股票的复权计算(复权因子的应用)
  8. 奥克兰大学计算机专业好找工作吗,留学选择奥克兰大学的计算机专业肯定不会后悔...
  9. 基于Java的旅游门票管理系统JAVA MYSQL
  10. 【Mysql 错误定位】语法错误