摄像机矩阵和投影矩阵推导
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
太少了,列举不出来呀。
坐标系的转换
抄录自MSDN,Transform pipeline
Wiki
Transform pipeline,http://msdn.microsoft.com/en-
us/library/windows/desktop/ee418867(v=vs.85).aspx
Model坐标系
模型坐标系,也叫Local坐标系。例如我们在
3DMax,MAYA等建模工具中建立我们的人物模型时, 模型中的顶点坐标值就是Model坐标系的值。设想我 们有多个人物模型,那么每一个模型都有属于自己的 Model坐标系。
World坐标系
World坐标系也是很直观的,我们把若干个模型放在
可以用xyzzy方法记忆叉乘公式:其中xyz表示3个轴的
坐标值, 简单起见设左边第一个向量为A,第二个为B, 右边的结果向量为C,依照xyzzy:
接着求
,需要按照x->y->z->x的规则变换xyzzy成 yzxxz,得: 同样可以求得
叉乘
和点乘比较,点乘得到的结果是一个标量,但叉乘得
由上面两式和点乘的性质,得知叉乘的结果向量和原
来的两个向量都垂直。我们知道原来的两个向量确定 了一个平面,也即是说叉乘的结果向量垂直于这个平 面。这就是叉乘的重要几何意义。 下面我们分析叉乘结果向量的模。
叉乘结果向量的模
由点乘公式: 等式两边平方,然后用三角等式
代换后
并整理得到:
叉乘结果向量的模
说明
写记录最艰难莫过于公式编辑了,每一个数学式子,
都是从Word里面用公式编辑器编辑好,再复制过来, 更悲剧的事情是PPT貌似不支持公式,它把复制过来 的公式直接变成图片了。 可见我是多用心。
点和(方向)向量
数值上,都是用{x,y,z}表示。 前者表示位置,后者表示方向。 因表征意义不同,图形库一般以Point类和Vector类表
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也能得到同样的结果
z
向量C 向量A
x
向量的基本运算:点乘
Dot Product,又叫点乘或点积,定义为:
如上式所示,点乘的结果是一个标量。后面我们将要
证明该标量和 相关,其中 是这两个向量的夹角, 也即是说,从两个向量点乘的结果能得出它们之间的 夹角。这就是点乘的价值所在。
点乘的证明
y z 向量A 向量B x 向量C
我们知道叉乘得到一个垂直于原来两个向量的新向量,
3D图形学中常用这种方式求垂直于平面/三角面/多边 形等的向量。例如法线(凹凸)贴图时,需要求出垂 直于顶点的法线。
Wiki
叉乘和点乘都是由Josiah Willard Gibbs在1881年提出
的。 Dot product: Scalar product, http://en.wikipedia.org/wiki/Dot_product Cross product: Vector product, http://en.wikipedia.org/wiki/Cross_product
向量和矩阵变换
Linguohua 2012/7/11
Байду номын сангаас 说明
主要是为了备忘,本文记录了我学习向量和矩阵过程
中遇到的一些基础知识以及数学证明。
数学证明大多是我自己的想法,所以一些过程并不是
最简的,原因之一是我在空间和微分几何方面的知识 积累甚少。如果你有更简单的方法,请让我知道。
说明
先记录向量和向量的运算,以及点乘和叉乘的证明。 然后简要记录若干个重要的坐标空间。 接着详细推导View矩阵和Projection矩阵。 最后是记录DirectX的一个旋转立方体的Tutorial。
到的是3个标量所构成的一个向量,这个差异很大。
既然叉乘得到一个向量,那么这个向量具有什么性质
呢?
嗯,直接观察不易,我觉得从线性代数和矩阵论的范
畴,应该能够简单地得到结论。不过,我们可以利用 点乘来得出叉乘的一些性质。
叉乘性质证明
让叉乘的两个向量分别和叉乘的结果向量进行点乘运
算,得:
叉乘性质证明
的新坐标系,这个新坐标系把视野外的东西剔除掉, 把视野内的东西投影到屏幕(近裁面)上,并且离眼 睛越远的东西看起来越小。
tangent坐标系
还有很多具有专门用途的坐标空间,例如Tangent即切
线坐标系,它适合于根据高度图(Height map)计算法 向图(Normal map)。
此处就不一一列举其他坐标空间了,事实上我知道的
别求三个向量的模并代入余弦定理得:
等式的|A|和|B|表示向量的模。 化简等式即可得到直观的结果,见下页
点乘的证明
化简前面等式得到:
上式左边即是点乘的定义。至此,我们看出点乘和
成正比, 可用下式表示:
其中
是向量A和向量B的点乘,而 量的模的乘积。
是两个向
点乘的证明
因此,如果两个向量的点乘结果是零,可知它们相互
DirectX View Matrix推导
左手和右手坐标系
在3D空间中存在这样的两种坐标系,不管怎么翻转,
都不能从一种坐标系变换到另一种坐标系。这两种坐 标系我们用左手坐标系和右手坐标系来称呼和区分它 们。 DirectX常用左手坐标系,OpenGL则惯用右手坐标系。 不要担心,事实上他们的x,y坐标轴完全一样,只是z 轴一个向里,一个向外。如下图所示:
坐标系的转换和矩阵
后续的内容主要记录World坐标系转换之后的Camera
坐标系,Projection坐标系的转换。
接下来记录的转换矩阵推导,是用DirectX来举例。事
实上,这些推导过程在OpenGL上也是一样的,如果 有差别,也是一些数值上的细微差别,例如DirectX的 远近裁剪面定为[0~1],而OpenGL的定为[-1~1]。
点乘的证明
如上图所示,向量A是
,向量B是 。 它们的夹角为 ,向量C的是多少呢?由图示以及向 量减法法则,可得向量C为:
向量A,B,C构成一个三角形,而三角形的余弦定
理 ,注意余弦定理等式中的 A,B,C是指三角形的边长,均是标量。
点乘的证明
余弦恒等式用到的边长即是向量A,B,C的模,据此,分
注意到上式左边是叉乘结果向量的模的平方,所以对
等式两边开平方,即得:
上式便是关于叉乘的模的等式。至此,我们知道叉乘
会得到一个垂直于原来两个向量(以及它们所在平面) 的向量,且这个向量的长度满足上述等式。但仍有一 个问题:这个垂直向量朝向那个方向呢?
叉乘
y z
向量C
向量A 向量B x
叉乘向量的方向
左手和右手坐标系
坐标系和坐标系转换
3D模型从建模到渲染最后阶段——输出到屏幕需要经
历多个坐标系,从一个坐标系到另一个坐标系则需要 一个转换过程。这个过程是由一个转换矩阵来实施的。
本节简要记录一些关键坐标系(坐标空间),和相应
的转换说明,然后以DirectX为例,记录和推导几个重 要的转换矩阵。
如上图所示,向量C方向朝上还是朝下(注意:不管
朝向如何,它终归都会垂直于原来的两个向量)?
一个简单的判断方法,见下页的图示。注意如果是左
手坐标系,就用左手,如果是右手坐标系,那么需要 用右手。
叉乘向量的方向
点乘和叉乘用途
至此,我们知道点乘得到一个标量,这个标量跟原来
两个向量的夹角相关。所以,在3D图形学中常通过两 个向量的点乘得到它们之间的夹角。
确立Camera坐标系的X,Y,Z轴。然后构造一个矩阵, 该矩阵能够把World坐标系的顶点映射到Camera坐标 系。
简明起见,我们需要定义若干变量:设眼睛所在的点
为ptEye,眼睛注视的点为ptAt,注意到ptEye和ptAt 都是World坐标系中的点。然后我们还需要World坐标 系的Y轴方向向量,设为Up。
向量的加法法则定义为:
加法结果还是一个向量,从数值上看,结果向量的每
一个分量均“变大”了(严格来说这取决于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也会得到同样 的结果。
DirectX View Matrix推导
从World坐标系转换到Camera坐标系需要一个转换矩
阵帮忙,这个矩阵叫View矩阵。
DirectX View Matrix推导
View矩阵是一个4X4的矩阵,作用是将顶点从World
坐标系转换到Camera坐标系。 Camera坐标系是一个这样的坐标系:以眼睛的位置为 原点,视线方向为Z轴的一个坐标系。新坐标系的X轴 朝向观察者的右手方向,Y轴朝向观察者头顶方向。 在World坐标系的顶点 经过View矩阵转换后, 得到一个位于Camera坐标系的新坐标。
DirectX View Matrix推导
运算过程:
注意运算时采用的是齐次坐标,
各个分量取值 是基于Camera坐标系的,它们相对的原点是Camera 坐标系的原点,也即是观察者眼睛的位置。 下面我们推导View 矩阵。
DirectX View Matrix推导
推导View矩阵分两步,首先确立Camera坐标系,也即
达两者,但它们在数值层面是一致的。 因方向向量的核心是方向,故两个方向向量的x,y,z数 值可能不同,但方向却是一样的,我们认为这两个方 向向量等价。
点和(方向)向量
方向向量C和B
等价,因它们表达 的方向是相同的。 数值上点A和向量 B相等,但物理意义 不同
y
z
点A{5,2,6} 向量B {5,2,6}
顶点P
Camera坐标系
Camera坐标系是人眼观察World坐标系时,以人眼为
原点,视线方向为Z轴建立的新坐标系,这个坐标系 以观察者(眼睛)为中心,为视野裁剪和投影等做好 铺垫。随着观察者眼睛位置的变化,或者视线方向的 变化,Camera坐标系也同时变换。
Projection坐标系
Projection即投影坐标系基于Camera坐标系变换而来
垂直。 由上面的夹角 的等式,可以求得两个向量的夹角。
向量的基本运算:叉乘
Cross Product,又叫叉乘或叉积,定义为:
嗯,不易看出规律,看下页
叉乘
注意下图的颜色和箭头
左边同颜色箭头所连接的元素,构成右边同颜色的元
素。这些箭头是交叉的。这可能就是叉乘名字的由来 吧。
叉乘
一起组成一张场景,场景的坐标系就是World坐标系, 这就像我们现实世界一样。一个模型放置到World坐 标系之后,它的顶点坐标值就需要从Model坐标系转 换为World坐标系中的值。如下页图示:
World坐标系
Model坐标系和World坐标系 顶点P在Model坐标系
中的值和在World坐标系 中的值是不同的
向量 C
x
(位移)向量
虽然多数时候向量纯粹表达方向,但事实上它还带有
长度的信息,向量{x,y,x}在3D空间的长度 是 。故,可以把向量理解为在一个方向 上长度为 的位移。 例如两点之间的距离向量,就是一个典型的位移向量。
我们通常结合上下文,来判断向量是纯粹方向的还是
位移的向量。
向量的基本运算:加法
坐标系的转换和矩阵
任意两个坐标系的转换都经由一个转换矩阵完成。例
如从Model坐标系到World坐标系,需要经过World转 换矩阵进行变换。 World矩阵主要用于伸缩,平移,和旋转。伸缩/平移 较为直观,而旋转会有几种方式,例如构造矩阵旋转, 或欧拉角旋转,或四元数旋转。限于篇幅就不详细记 录了。将来如有需要,再单独记录。