D3D Project 矩阵推导

D3D中, 从模型\场景到显示在屏幕上, 一般会涉及到 3 个坐标系, 4 个矩阵. 其中: 模型坐标系(Local Matrix), 世界坐标系(World Matrix), 相机坐标系(View Matrix), 这几个坐标系与矩阵相对应. 最后要把三维的模型显示在二维的屏幕上, 还需要一次投影变换, 对应的就是 Project Matrix.

Project Matrix 与其他三个不同, 其他三个可以认为是”位置”. Local Matrix => 模型的一部分相对整个模型的位置; World Matrix => 模型相对于场景的位置; View Matrix => 相机在场景中的位置. Project Matrix 表示的是投影变换.

Project 投影是一种什么样的变换?

在线性代数和泛函分析中,投影是从向量空间映射到自身的一种线性变换,是日常生活中“平行投影”概念的形式化和一般化。同现实中阳光将事物投影到地面上一样,投影变换将整个向量空间映射到它的其中一个子空间,并且在这个子空间中是恒等变换。[维基百科]

所以, 投影可能造成维度的降低. 工程图学中, 画剖面图用的是平行投影. 素描会用到透视投影. 照相机也是用的透视投影. 三维的模型经过投影后, 会变成二维的画面.

D3D中常用的投影是透视投影(在某些情况下, 也会用到平行投影, 比如拍摄场景地图的时候). 下图是很常见的透视示意图. 可以想象为: 一个人在屋里, 透过窗户看到的景象. 人的眼睛位于原点处, 近平面(near plane)就是窗户的玻璃, 远平面(far plane)则是远处的山, 视线到这里就是尽头了. 近平面, 远平面之间的锥体就是视锥.

视锥示意图

投影会造成维度变化. 从三维到二维, 会有一个维度丢失. 相机是一个投影装置, 我们的眼睛也是. 在我们看世界时, 如果一个东西被遮挡了, 我们就看不见了. 也就是说, 在单次的投影中, ”深度”这个维度其实丢失了.

投影维度变化(直线A, B上的点在投影后是一个点)

上图表现在更直观些: 直线AB上的点, 在投影后都是用一个点表示.

Project 矩阵如何推导?

在D3D中, 点的位置一般用齐次坐标表示, 就是一个四维向量, 第四个分量一般为 1.

齐次坐标的缘由这里不赘述.

这是在相机坐标系中, 从X轴方向看过去的情况. 向上的坐标轴为 Y 轴. 相机在原点位置.

透视投影, 会把 OAB 上的点都投成一个点.

现在, 我们把坐标投影到近平面上, 并且, 投影后近平面上的点, Z值为 0.

A点坐标

B点坐标

Project Matrix 记为 P.

则:

就是A点B点, 经过投影变换后, 坐标的 x, y 分量相等.

根据三角形相似, 有:

只有Z 值与相机位置相关, 就用它做参照.

A =

B =

AP =

BP =

最后分量归一化后:

所以有:

由:

所以:

因为是投影到近平面上, 所以近平面上的点坐标不变:

所以:

所以:

综上:

这就是初步的投影矩阵.

D3D的文档里, 是用两步获得的这个矩阵, 原理是一样的.

至于为什么要调整 P[2][3]这个元素, 是因为要实现X,Y的同时缩放, 而且缩放与Z值相关, 只能调整齐次坐标的最后一个分量, 这样归一化后, 才会同时缩放 X, Y.

容易知道要X, Y 都除以Z, 但这样写是不行的:

因为 Z 是一个变量, 应该来自要变换的向量. 这样就容易找到应该修改P 的第4列, 第3个元素, 它刚好会与向量的Z相乘, 又会影响结果的第 4 个分量.

为什么说是初步的呢?

当拒这个矩阵没有考虑视口(ViewPort).

更重要的原因是Z值的原因.

仅仅看 X, Y, 这样做是没问题的. 理论上, 投影的结果Z值都是一样的就OK.

但在三维空间中, 还存在遮挡的关系. 投影中前面的物体会遮挡住后面的物体. 简单的做法就是用物体的Z值 (深度) 区分.

如果用这个矩阵投影, 近平面的Z值是0, 无穷远处的Z值才是1. 从近平面到无穷远, 中间有很长距离的Z值会相差极小(小于浮点误差), 造成难以分辨哪些在前哪些在后. 前面遮挡后面就难以实现了.

在保证X,Y正确的情况下, D3D文档中给出了另一个投影矩阵.这个矩阵对Z值的区分度要好很多.

时间: 08-05

D3D Project 矩阵推导的相关文章

斐波那契数列的矩阵推导(看不懂的可以放弃矩阵了)

一.矩阵乘法 设矩阵A,B 满足 :A的列数==B的行数 矩阵乘法的运算规则: 将A矩阵的每一行乘以B矩阵的每一列 * == == 二.斐波那契数列的矩阵推导 首先我们想 Fib[i]=Fib[i-1]+Fib[i-2]; 所以斐波那契数列的第i项之与两个数也就是Fib[i-1]+Fib[i-2]有关 那么我们可以设第一个矩阵 M1= 因为我们需要利用矩阵推出斐波那契的第n项 所以我们设M1的下一项为M3 则M3=(也就是让M1的下标整体后移一位) 那么现在我们需要一个过渡矩阵M2来实现这个从M

旋转坐标转换的矩阵推导

预备知识 矩阵乘法 介绍略,去网上查吧 两角和(差)公式 推导 旋转变换一般是按照某个圆心点,以一定半径 r 旋转一定的角度α,为了简单起见我们给出下面的情景 假定点A(x,y)想经过旋转变换到达B(x',y'),已知旋转角度α和点A坐标,计算出点B 要计算点B则分别计算他的x'和y'分量 根据矩阵乘法计算规则,可以推出 只要给出旋转角度,计算出矩阵,然后使用这个矩阵分别左乘每一个点,就能计算出这个点旋转后的点坐标 这样我们就可以通过矩阵变换坐标了  如果是三维的话还得加个Z轴,多一个分量,矩阵

绕任意轴旋转的矩阵推导总结

前言 常用的几何变换中旋转是较为复杂的一种,最近看<Physically Based Rendering, Second Edition: From Theory To Implementation>一书涉及绕任意轴旋转的实现,也给出了大体思路,但具体的推导过程及最后的旋转矩阵并未直接地给出,故根据参考Animated CGEM: Rotation About an Arbitrary Axis总结(欢迎指正). (一)基础 1.点乘与叉乘 点乘(dot)亦称作内积或数量积,如图,a·b =

统一D3D与OpenGL坐标系统

作者:游蓝海(http://blog.csdn.net/you_lan_hai) DirectX 3D与OpenGL坐标系统的差异性,给我们带来很大的麻烦,让跨平台编程的新手很困惑.最近在做一个跨平台的游戏,仔细看了下两者的矩阵,发现并没有什么大区别,将d3d左手系的矩阵传递给opengl shader完全可以正常工作. 先说一下两者一些概念上的区别:         (1)坐标系统不同 d3d左手坐标系,opengl右手坐标系         (2)矩阵行序不同 d3d行优先,opengl列优

详解MVP矩阵之ViewMatrix

矩阵推导 ViewMatrix用于直接将World坐标系下的坐标转换到Camera坐标系下.已知相机的坐标系,还有相机在世界空间下的坐标.就可以求出ViewMatrix,下面进行具体推导. 令UVN为相机坐标系下的三个基,,对于一个相机来说,它在开始的时候和世界坐标系是重合的,用户控制相机在世界空间中移动之后,相机的状态可以用两个属性来描述--朝向和位置.也就是说,有了这两个属性,一个相机模型在世界中的状态就确定了.而这两个属性,我们用变换的理论来描述,就是旋转和平移.可以想象,对于世界中的任何

具体解释MVP矩阵之ViewMatrix

矩阵推导 ViewMatrix用于直接将World坐标系下的坐标转换到Camera坐标系下.已知相机的坐标系.还有相机在世界空间下的坐标.就能够求出ViewMatrix.以下进行具体推导. 令UVN为相机坐标系下的三个基,,对于一个相机来说,它在開始的时候和世界坐标系是重合的,用户控制相机在世界空间中移动之后,相机的状态能够用两个属性来描写叙述--朝向和位置.也就是说.有了这两个属性,一个相机模型在世界中的状态就确定了. 而这两个属性,我们用变换的理论来描写叙述,就是旋转和平移. 能够想象,对于

透视投影详解【转】

概述 投影变换完成的是如何将三维模型显示到二维视口上,这是一个三维到二维的过程.你可以将投影变换看作是调整照相机的焦距,它模拟了为照相机选择镜头的过程.投影变换是所有变换中最复杂的一个. 视锥体 视锥体是一个三维体,他的位置和摄像机相关,视锥体的形状决定了模型如何从camera space投影到屏幕上.最常见的投影类型-透视投影,使得离摄像机近的物体投影后较大,而离摄像机较远的物体投影后较小.透视投影使用棱锥作为视锥体,摄像机位于棱锥的椎顶.该棱锥被前后两个平面截断,形成一个棱台,叫做View

Microsoft Interview第一轮

上来随意交谈了一小会儿,开了点小玩笑,chat了一些关于他们recruter行程的话题,缓和了一下气氛. 进入正题,问了做的research的方向,我说是DLT,然后大概给他讲解了一下具体是什么, 跟平行计算很像,举了一个例子:矩阵乘法如何划分使并行效率最高.他表示理解.然后他又问我有没有过end to end的experience, front end back end那种, 我跟他简单介绍了一个简历上的social database设计的project,简单介绍了我们front end和ba

A Linear Algebra Problem(唯一性的判定)

A Linear Algebra Problem Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status God Kufeng is the God of Math. However, Kufeng is not so skilled with linear algebra, especially when dealing with matrixes. On