OpenGL学习脚印: 理解坐标系及坐标变换(上)

OpenGL学习脚印: 理解坐标系及坐标变换(上)

写在前面

本文为学习计算机图形学及利用OpenGL开发图形程序做数学准备工作。有关3D math的学习不是一蹴而就的,因此这里整理总结的是图形学中的基本数学问题。参考资料列在文章末尾。如有错误请纠正我。

鉴于OpenGL中使用列向量表达向量,因此本节统一使用列向量表达向量,必要时使用转置表达行向量。

1.三大空间

在计算机图形学中,需要表示和处理像点和线段这样的几何元素,为此要用到的数学知识可以在各种类型的抽象空间的研究中找到。

这里我们认识3类这样的空间:向量空间vector space(线性空间linear space)、仿射空间affine space、欧几里得空间Euclid space 。

1.1向量空间

向量空间包含两类对象:标量(scalar)和向量(vector)。

标量是只有大小而没有方向的量。例如实数就是标量的例子。标量是对我们平时所用数字的技术称谓。使用该术语时是想强调数量值。

在两个标量之间定义了两种基本运算,即加法和乘法,这两种运算满足交换律、结合律和分配律。这就是我们熟悉的加减法中使用的规律:

[plain] view plaincopyprint?

加法交换律:a+b=b+a

乘法交换律:a*b=b*a

加法结合律:(a+b)+c=a+(b+c)

乘法结合律:a*b*c=a*(b*c)=(a*b)*c

分配律:(a+b)*c=a*c+b*c

同时通过加法和乘法的逆元(加法逆元就是相反数,乘法逆元就是倒数),隐含地定义了减法和除法。

为了能够处理方向,我们需要另一种类型,即向量。物理学家和数学家使用向量这个术语来表示任何既有方向又有大小的量。

关于向量,定义了两种运算:向量-向量加法和标量-向量乘法。

向量-向量加法是封闭的,即任意u,v∈V,则 u+v ∈V。向量加法满足交换律和结合律。

标量-向量乘法是这样定义的,对于任意的标量a和任意的向量u,则au是V中的一个向量。

标量-向量乘法满足分配律:

a(u+v)=au+av

(α+β)u = au+βu

关于向量的介绍先到这里,后面在必要时会再展开。

如果想获取向量与坐标全面的在线教案,可参考:六盘水师范学院《解析几何》教案。

1.2仿射空间

仿射空间是向量空间的拓展,除了标量和向量,还包括另外一种对象:点。

在向量空间中,没有像位置和距离这样的几何概念。如果把由有向线段构成的向量空间作为考虑几何问题的自然向量空间,就会遇到困难,因为这些向量就像物理中的向量那样,具有大小和方向,但是没有位置。我们可以通过引入坐标系来考虑问题。坐标系如下图所示:



但是在向量空间中没有办法表示原点O,因为向量空间中只有标量和向量。因此就引入了仿射空间。

仿射空间比向量空间多一类实体:点。

设P,Q,R为仿射空间中的点。在仿射空间中定义了新的运算:点-点减法,这个运算的结果就是一个向量。

对于任意两点P,Q,v = P-Q,其中v为V中的一个向量;反之对于任意v和P,我们总可以找到一个Q使该关系成立,这样就定义了一种点-向量加法:P = Q+v。点-向量加法可以看做把点Q移动到新位置P,移动的长度和方向由向量v决定。如下图所示:



1.3欧几里得空间

虽然仿射空间里包含了几何模型的必要元素,但是在仿射空间中不能度量两个点相距多远,或者说没有向量长度的概念。

欧几里得空间是向量空间的拓展,它增加了对大小或者距离的度量,可以定义线段的长度等概念。严格地说,欧几里得空间只包含向量和标量。

我们定义一种的新的运算,内积(inner product)或者叫点积(dot product),该运算由两个向量得到一个实数。

内积满足这样的性质:对于任意3个向量u,v,w和变量α,β都有:

u.v=v.u(交换律)

(αu+βv).w = αu.w+βv.w

对于v ≠0,则有v.v > 0;如果u.v = 0,则称u和v是正交的(orthogonal)

一个向量的大小(长度,也称为向量的模)通常定义为:



把仿射空间中点的概念加入到欧几里得空间后,则两点之间的距离,可以看做向量的模,例如两点P和Q,则



2.坐标系基本概念

2.1坐标系定义

使用坐标系是为了以代数的方法来研究几何,这就是解析几何的方式。通过建立一个坐标系使得空间中点用有序实数组表示,空间图形用方程表示,这样就方便研究几何图形的性质。

定义一个坐标系需要指定:

坐标系的维度 2D, 3D, 4D等等

定义坐标空间轴的向量,这些向量成为基向量,他们有名字,例如x,y,z;这些向量不一定非得互相正交(只要线性无关即可),但是每一个维度必须只有一个轴。

坐标系的原点O,原点是导出其他点的参考点。

一个表明空间中点是否合法的区域,在此区域之外的点就不再合法。这个区域根据空间不同,可以是无穷的。

这里,维度已由基向量维数确定,合法区域我们一般是无穷的,但是在图形处理中某些坐标空间是有限的,例如规范化设备空间。

基向量不一定非得正交,可以参见:《Learning Modern 3D Graphics Programming》中Spaces介绍。

2D笛卡尔坐标系如下图所示:



在2D笛卡尔坐标系中(x,y)可以定位一个点。坐标的每个分量都是到相应轴的有符号距离。例如,x分量表示改变到y轴的有符号距离,同样,y分量表示该点到x轴的有符号距离。这里,有符号距离,是指在某个方向上为正,而在相反的方向上为负,需要根据相应轴的正方向来定。

给2D笛卡尔坐标系增加第三个维度,即增加一个Z轴,则定义了3D坐标系,如下图所示:



3D中,任意一对轴都定义了一个平面并垂直于第3个轴,例如x,y轴的xy平面垂直于z轴;同样xz平面垂直于y轴,yz平面垂直于x轴。

我们可以认为这三个平面是3个2D笛卡尔空间。

3D笛卡尔空间中,定位一个点需要(x,y,z)3个数。3个分量分别代表该点到yz、xz、xy平面的有符号距离。如下图所示:



2.2左手/右手坐标系及左/右手规则

对于任意2个2D坐标系,我们通过旋转、移动翻转可以将两个坐标系xy轴的指向相同。

但是对于3D坐标系,任意两个坐标系却不能等价。实际上,存在两种完全不同的3D坐标系:左手坐标系和右手坐标系。如果同属于左手坐标系或者右手坐标系,则可以通过旋转来重合,否则不可以。

关于左右手坐标系理解可参考下图:



如上右图右手坐标系,这里拇指、食指、其余手指分别代表x,y,z轴的正方向。

高等数学教材上上使用的是右手坐标系,DirectX使用左手坐标系,OpenGL使用的是右手坐标系。

同样还存在一个左手规则和右手规则,主要用于判断当物体绕轴旋转时正方向的判定问题。

对于左手规则,确定一个旋转轴后,左手握成拳头,拇指指向旋转轴的正方向,则其余手指弯曲方向即为旋转的正方向。从旋转轴正向末端来看,正向旋转是顺时针的。对于右手规则,有同样的方法。可参见下图:



关于如何快速判定旋转正向,还有一个巧妙的方法,可以参见:判断三维坐标系旋转正方向的简单方法。

3.坐标变换

在计算机图形学中,为了更方便的描述物体,对物体进行处理,需要使用多个坐标系。

使用多个坐标系的原因就是:某些信息只能在特定的上下文环境中才能获取(参考自[2])。

怎么理解这句话呢?补充一个例子吧。比如,定义一个机器人模型,机器人模型的原点设在身体中央,成为一个坐标系C;同时为机器人构造复杂的头部模型时,需要使用一个新坐标系C1;构造机器人手部时需要一个新的坐标系C2;那么要想获取手指离鼻子的距离distance,则必须在C坐标系中获取,而在C1或者C2两个局部坐标系中却无法获取。那么需要将C1和C2中手指和机器人鼻子的局部坐标转换为C坐标系中位置,才能计算其距离distance。

这里引出一个重要问题:怎么在一个坐标系中描述另一个坐标系?

所谓坐标变换,就是知道某一点的坐标,怎么样在另一个坐标系中描述该点。这就需要坐标变换。

个人理解,坐标转换,也就是从另一个坐标系来"看"原坐标系中的点,这个点还在原来坐标系,只是用另外一组原点和基向量来解释而已,因此坐标值发生了变换。坐标变换并不神秘。

3.1二维变换引例

这里以csdn 汤永康博客 坐标旋转变换公式的推导坐标系的旋转为例,该坐标系变换如下图所示:



这里将原坐标系XOY下点P(x,y),经过旋转theta后,变换到新坐标系SOT下点(s,t)。

那么,点P经过旋转变换后,变换到坐标系SOT下的坐标与原坐标系下坐标之间的关系经推导后如下所示:



推导过程可参见原文,原文利用点在坐标系中的位置关系进行推导的。

本节稍后将使用坐标系变换的观点,直接推导出变换矩阵。

3.2坐标系变换

3.2.1 复习预备概念

向量空间:

设V为n维向量的集合,如果集合V非空,且集合V对于向量的加法和乘数运算封闭,那么就称集合V为向量空间。

这里封闭的意思是指在集合V中可以进行向量的加法和乘数运算。具体的讲即是满足:

若a∈V,b∈V则a+b∈V

若a∈V,λ∈R,则λa∈V

例如3维向量的全体构成3维空间。

一般地,由向量组u生成的向量空间记为:



线性无关:

n个向量的线性组合(linear combination)是形如下式的一个向量:



如果使得:u=0成立的唯一一组标量是:



则称这组向量是线性无关的(linear independent)。

基向量组:

设V为向量空间,如果r个向量都属于V,且满足:

1)r个向量线性无关

2)V中任意一个向量都可以由这r个向量线性表示

那么,这r个向量称为向量空间V的一个基,r称为向量空间的维数,并称V为r维向量空间。

实际上,在一个向量空间里,线性无关向量组中向量数目的最大值就是这个空间的维数,如果一个向量空间的维数是n,那么任何n个线性无关的向量都构成了一个基。

坐标:

如果在向量空间中选取一个向量组u作为基,那么任意一个向量x可以唯一地表示为:



则称数组λ为向量x在基u下的坐标。

3.2.2 坐标变换

假设n维向量空间,有两个基向量组如下:

  ,

则对于一个给定的向量w可以表示为:





我们可以把w的坐标写成:



也可以写成



这取决于使用哪个基。

现在来考虑如何从w变到w‘。

基u中每个向量都可以用基v来表示,因此存在一组标量λ使得:



利用列矩阵重新表达向量w,则有:



由上两式子可得:



矩阵A是这两个基之间变换的矩阵表示,也称为过渡矩阵。利用过渡矩阵可以再两个基下表示之间进行切换,即进行坐标转换。

下面举出一个例子,帮助熟悉。

这里使用列向量来表达单个向量。

假设向量w在基v下表示为:



则有:



设另一基u满足:


OpenGL学习脚印: 理解坐标系及坐标变换(上)

则两个基之间的过渡矩阵为:



则有:



则可以求得:







3.2.3求出变换矩阵的技巧

从上述可以看出,要进行坐标变换,关键是怎么样快速构建变换矩阵。

这里摘自【2】中的结论,导出如下:

对于基向量[1,0,0]^T、[0,1,0]^T、[0,0,1]^T(以列向量表示),任意矩阵M乘以它们时的情况:







观察发现矩阵M乘以[1 0 0]^T时得出的是M的第一列,其他两列有同样的结果。

这里得出一个重要的结论:矩阵M的每一列都能解释为转换后的基向量。

(参考书[2]中使用行向量推导,则结论为矩阵每一行为转换后的基向量)。

这个结论能帮助我们反向建立矩阵的可能。给出一个期望的变换(如旋转、缩放等),能够构造一个矩阵代表此变换。

我们要做的一切就是计算基向量的变换,然后将变换后的基向量填入矩阵。

设基向量组u,v满足如下关系,则两个基下坐标b,a满足关系如下:



由于使用列向量表达向量,因此,使用上述填充矩阵方法实际上找到的就是这个公式里的M矩阵的转置  ,注意这个细节。

3.2.4二维变换的示例

首先利用这个方法,我们推导上述二维旋转的坐标如下:



这里,基向量转换的基向量组成的矩阵为(每列构成的):



则原来的XOY坐标系下点p(x,y)在新坐标系SOT中坐标为:



3.2.5齐次坐标系下变换

上面的讨论中的变换,可以实现对一个基的旋转和缩放得到另一个基的变换。但是上面的变换中,原点是不变的。这样不能表示平移变换。而借助齐次坐标系我们可以实现标架变换,同时仍然使用矩阵来表示标架变换。

标架(frame)是图形学教材[1]引入的一个术语,原点和基向量决定一个标架。

标架的一个不太严谨的说法是:它把向量坐标系的原点固定在了某个点P0处。

在一个给定的标架下,每个向量w和点P唯一的表示为:



这样表示一个向量需要3个标量,而表示一个点需要3个标量和原点的位置。

通过使用标架,我们可以避免向量和点的混淆。

齐次坐标系:

齐次坐标(homogeneous coordinate)可以克服点和向量在表示形式上一样(3维空间中都是x,y,z,3个分量表达)而导致混淆的缺点。

齐次坐标使用四个分量来表达3维空间中的点和向量。

在由(P0,v1,v2,v3)确定的标架中,任一点P可以唯一地表示为:



通过定义点和标量0,1的乘法:

0.P = 0

1.P = P

我们可以利用矩阵乘法把点P形式地表示为:



这里严格来讲并不是点积,但是把它当做点积来计算。

在同一标架下,任意一个向量w可以写为:



至此明确了,在齐次坐标系下,向量第四个分量,称为w分量,为0;而点的w分量为1。

设有两个标架(v,P0)和(u,Q0),把第二个标架的基向量和参考点用第一个标架来表示:



把方程写为矩阵形式:



其中M是一个4x4矩阵:



假设a和b是同一点或者向量在这两个标架下的齐次坐标表示,则有:



因此可得:



根据该式可以实现两个标架下坐标之间的转换。

这里M的转置矩阵为:



注意: 上面我们讨论的通过基向量变换情况,来构造M转置的方式,在其次坐标系下需要把原点也包括进去,原点的变换写在第4列。

3.2.6齐次坐标系下变换示例

这里摘自教材[1]的一个例子很有代表性。

如下图所示,世界标架下指定相机位置:



将照相机指定在世界标架的点P(1,0,1,1)位置处,指向世界标架的原点。则照相机的这个指向可以用向量n=(-1,0,-1,0)来表示。

同时照相机的观察正向和世界标架的y轴正方向一致为v=(0,1,0,0),这样利用叉积找出第三个方向u=nxv = (1,0,-1,0)。这样照相机构成的标架则为(u,v,n,P)。

这里可以构造出把点和向量从世界标架下转换到照相机标架下表示的矩阵:



这里M矩阵的转置中,每一列即为世界标架的基向量和原点,转换后的对应向量和点。

我的感觉,我们一开始构造的就是M的转置,所以从M的转置,而不是M矩阵思考会轻松很多。

这里取世界标架的原点,这个点在照相机标架下的坐标为:



也就是说,世界标架下原点(0,0,0,1),在照相机标架下解释为(0,0,1,1)点,即在照相机标架的n轴上。

而照相机标架的原点(0,0,0,1),在世界标架下解释为点P(1,0,1,1)。

上篇,到此结束,下篇还要继续整理包括仿射变换、投影变换以及结合OpenGL具体变换的展开。

4.主要参考资料

[1]交互式计算机图形学-基于OpenGL着色器的自顶向下方法第六版电子工业出版社

[2] 3D数学基础:图形与游戏开发清华大学出版社

[3]线性代数同济大学第五版

  

爱华网本文地址 » http://www.aihuau.com/a/25101012/122164.html

更多阅读

《西门豹治邺》学习资料:原文及译文

德馨小学五年三班的同学们:《西门豹治邺》选自司马迁的《史记》。为了帮助同学们更好的理解课文,拓展知识,老师特地搜集了原版(文言文)《西门豹治邺》及其译文。大家对照看看,有利于提高大家的古文理解能力。西门豹治邺这篇讲读课文讲

交易开拓者代码学习各种买卖指令及实例TB

各种买卖指令Buy说明产生一个多头建仓操作。语法Buy(NumericShare=0,Numeric Price=0,Bool Delay=False)参数Share买入数量,为整型值,默认为使用系统设置参数;Price买入价格,为浮点数,默认=0时为使用现价(非最后Bar为Close);Delay买入动

郑板桥先生百首题兰画诗、词及跋文鉴赏上 古诗十九首 跋文

郑板桥先生百首题兰画诗、词及跋文鉴赏(上)四川会理 刘 世 渡中国兰文化能成为一项具有世界意义的文化遗产,是千百年来中华民族一代又一代优秀儿女知识的积累和心血的结晶。出于对中国兰文化的仰慕和爱戴,也出于对中国兰文化遗产的继

变换公式 坐标变换

一直想总结一下傅里叶变换、拉氏变换的公式,正好看到原来我之前总结过,还总结到word里了,正好上传上来吧。系统:单位脉冲响应:系统特征函数:所以傅里叶级数:连续周期信号

傅里叶变换的理解 傅里叶变换有什么用

傅里叶变换:数字音频播放器MP3、图片压缩JPEG和苹果智能语音助手Siri背后的数学九年前,在学校的物理数学课的课堂上,我的老师为我们讲授了一种新方法,至今仍印象深刻。毫不夸张地说,数学理论发现迄今最广泛的应用就是这一方法了,其涵盖的

声明:《OpenGL学习脚印: 理解坐标系及坐标变换(上)》为网友庸俗措辭分享!如侵犯到您的合法权益请联系我们删除