当前位置:文档之家› 摄像机矩阵和投影矩阵推导

摄像机矩阵和投影矩阵推导


向量 C
x
(位移)向量
虽然多数时候向量纯粹表达方向,但事实上它还带有
长度的信息,向量{x,y,x}在3D空间的长度 是 。故,可以把向量理解为在一个方向 上长度为 的位移。 例如两点之间的距离向量,就是一个典型的位移向量。
我们通常结合上下文,来判断向量是纯粹方向的还是
位移的向量。
向量的基本运算:加法
坐标系的转换和矩阵
后续的内容主要记录World坐标系转换之后的Camera
坐标系,Projection坐标系的转换。
接下来记录的转换矩阵推导,是用DirectX来举例。事
实上,这些推导过程在OpenGL上也是一样的,如果 有差别,也是一些数值上的细微差别,例如DirectX的 远近裁剪面定为[0~1],而OpenGL的定为[-1~1]。
太少了,列举不出来呀。
坐标系的转换
抄录自MSDN,Transform pipeline
Wiki
Transform pipeline,/en-
us/library/windows/desktop/ee418867(v=vs.85).aspx
达两者,但它们在数值层面是一致的。 因方向向量的核心是方向,故两个方向向量的x,y,z数 值可能不同,但方向却是一样的,我们认为这两个方 向向量等价。
点和(方向)向量
方向向量C和B
等价,因它们表达 的方向是相同的。 数值上点A和向量 B相等,但物理意义 不同
y
z
点A{5,2,6} 向量B {5,2,6}
注意到上式左边是叉乘结果向量的模的平方,所以对
等式两边开平方,即得:
上式便是关于叉乘的模的等式。至此,我们知道叉乘
会得到一个垂直于原来两个向量(以及它们所在平面) 的向量,且这个向量的长度满足上述等式。但仍有一 个问题:这个垂直向量朝向那个方向呢?
叉乘
y z
向量C
向量A 向量B x
叉乘向量的方向
DirectX View Matrix推导
运算过程:
注意运算时采用的是齐次坐标,
各个分量取值 是基于Camera坐标系的,它们相对的原点是Camera 坐标系的原点,也即是观察者眼睛的位置。 下面我们推导View 矩阵。
DirectX View Matrix推导
推导View矩阵分两步,首先确立Camera坐标系,也即
x
向量的基本运算:减法
向量的减法法则定义为:
减法结果还是一个向量,从数值上看,结果向量的每
一个分量均“变小”了(严格来说这取决于b的符 号)。
减法
向量A减向量B,先把A
y z
或者B平移(在A和B所确 定的平面上平移),使得 A和B成首首相接
向量B
向量A
x
减法
• 平移向量A到 y 向量A’,由于是 A-B,所以连接B 向量A’ 的尾部到A’的尾部, 向量B 使得结果向量指向 被减数,所得的向量 即是A-B • 平移向量B也能得到同样的结果
可以用xyzzy方法记忆叉乘公式:其中xyz表示3个轴的
坐标值, 简单起见设左边第一个向量为A,第二个为B, 右边的结果向量为C,依照xyzzy:
接着求
,需要按照x->y->z->x的规则变换xyzzy成 yzxxz,得: 同样可以求得
叉乘
和点乘比较,点乘得到的结果是一个标量,但叉乘得
顶点P
Camera坐标系
Camera坐标系是人眼观察World坐标系时,以人眼为
原点,视线方向为Z轴建立的新坐标系,这个坐标系 以观察者(眼睛)为中心,为视野裁剪和投影等做好 铺垫。随着观察者眼睛位置的变化,或者视线方向的 变化,Camera坐标系也同时变换。
Projection坐标系
Projection即投影坐标系基于Camera坐标系变换而来
向量的加法法则定义为:
加法结果还是一个向量,从数值上看,结果向量的每
一个分量均“变大”了(严格来说这取决于b的符 号)。
加法
向量A加向量B,先把A
y z
或者B平移(在A和B所确 定的平面上平移),使得 A和B成首尾相接
向量A 向量B x
加法
平移向量A得到
y
z 向量C 向量A’
向量A’,这样向量B 向量A 和向量A’首尾相接, 向量B 连接向量B的起点 和向量A’的终点, 即可得到结果: 向量C。 平移向量B也会得到同样 的结果。
z
向量C 向量A
x
向量的基本运算:点乘
Dot Product,又叫点乘或点积,定义为:
如上式所示,点乘的结果是一个标量。后面我们将要
证明该标量和 相关,其中 是这两个向量的夹角, 也即是说,从两个向量点乘的结果能得出它们之间的 夹角。这就是点乘的价值所在。
点乘的证明
y z 向量A 向量B x 向量C
左手和右手坐标系
坐标系和坐标系转换
3D模型从建模到渲染最后阶段——输出到屏幕需要经
历多个坐标系,从一个坐标系到另一个坐标系则需要 一个转换过程。这个过程是由一个转换矩阵来实施的。
本节简要记录一些关键坐标系(坐标空间),和相应
的转换说明,然后以DirectX为例,记录和推导几个重 要的转换矩阵。
向量和矩阵变换
Linguohua 2012/7/11
说明
主要是为了备忘,本文记录了我学习向量和矩阵过程
中遇到的一些基础知识以及数学证明。
数学证明大多是我自己的想法,所以一些过程并不是
最简的,原因之一是我在空间和微分几何方面的知识 积累甚少。如果你有更简单的方法,请让我知道。
说明
先记录向量和向量的运算,以及点乘和叉乘的证明。 然后简要记录若干个重要的坐标空间。 接着详细推导View矩阵和Projection矩阵。 最后是记录DirectX的一个旋转立方体的Tutorial。
别求三个向量的模并代入余弦定理得:
等式的|A|和|B|表示向量的模。 化简等式即可得到直观的结果,见下页
点乘的证明
化简前面等式得到:
上式左边即是点乘的定义。至此,我们看出点乘和
成正比, 可用下式表示:
其中
是向量A和向量B的点乘,而 量的模的乘积。
是两个向
点乘的证明
因此,如果两个向量的点乘结果是零,可知它们相互
左手和右手坐标系
在3D空间中存在这样的两种坐标系,不管怎么翻转,
都不能从一种坐标系变换到另一种坐标系。这两种坐 标系我们用左手坐标系和右手坐标系来称呼和区分它 们。 DirectX常用左手坐标系,OpenGL则惯用右手坐标系。 不要担心,事实上他们的x,y坐标轴完全一样,只是z 轴一个向里,一个向外。如下图所示:
坐标系的转换和矩阵
任意两个坐标系的转换都经由一个转换矩阵完成。例
如从Model坐标系到World坐标系,需要经过World转 换矩阵进行变换。 World矩阵主要用于伸缩,平移,和旋转。伸缩/平移 较为直观,而旋转会有几种方式,例如构造矩阵旋转, 或欧拉角旋转,或四元数旋转。限于篇幅就不详细记 录了。将来如有需要,再单独记录。
DirectX View Matrix推导
从World坐标系转换到Camera坐标系需要一个转换矩
阵帮忙,这个矩阵叫View矩阵。
DirectX View Matrix推导
View矩阵是一个4X4的矩阵,作用是将顶点从World
坐标系转换到Camera坐标系。 Camera坐标系是一个这样的坐标系:以眼睛的位置为 原点,视线方向为Z轴的一个坐标系。新坐标系的X轴 朝向观察者的右手方向,Y轴朝向观察者头顶方向。 在World坐标系的顶点 经过View矩阵转换后, 得到一个位于Camera坐标系的新坐标。
由上面两式和点乘的性质,得知叉乘的结果向量和原
来的两个向量都垂直。我们知道原来的两个向量确定 了一个平面,也即是说叉乘的结果向量垂直于这个平 面。这就是叉乘的重要几何意义。 下面我们分析叉乘结果向量的模。
叉乘结果向量的模
由点乘公式: 等式两边平方,然后用三角等式
代换后
并整理得到:
叉乘结果向量的模
一起组成一张场景,场景的坐标系就是World坐标系, 这就像我们现实世界一样。一个模型放置到World坐 标系之后,它的顶点坐标值就需要从Model坐标系转 换为World坐标系中的值。如下页图示:
World坐标系
Model坐标系和World坐标系 顶点P在Model坐标系
中的值和在World坐标系 中的值是不同的
DirectX View Matrix推导
我们知道叉乘得到一个垂直于原来两个向量的新向量,
3D图形学中常用这种方式求垂直于平面/三角面/多边 形等的向量。例如法线(凹凸)贴图时,需要求出垂 直于顶点的法线。
Wiki
叉乘和点乘都是由Josiah Willard Gibbs在1881年提出
的。 Dot product: Scalar product, /wiki/Dot_product Cross product: Vector product, /wiki/Cross_product
如上图所示,向量C方向朝上还是朝下(注意:不管
朝向如何,它终归都会垂直于原来的两个向量)?
一个简单的判断方法,见下页的图示。注意如果是左
手坐标系,就用左手,如果是右手坐标系,那么需要 用右手。
叉乘向量的方向
点乘和叉乘用途
至此,我们知道点乘得到一个标量,这个标量跟原来
两个向量的夹角相关。所以,在3D图形学中常通过两 个向量的点乘得到它们之间的夹角。
说明
写记录最艰难莫过于公式编辑了,每一个数学式子,
都是从Word里面用公式编辑器编辑好,再复制过来, 更悲剧的事情是PPT貌似不支持公式,它把复制过来 的公式直接变成图片了。 可见我是多用心。
相关主题