`
kennyluo
  • 浏览: 81027 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

相机变换矩阵

 
阅读更多

一些网友写信给我希望能够了解固定流水线中世界空间到相机空间变换矩阵的具体推导过程。其实之前我在《向量几何在游戏编程中的使用6》中已经简单的把相机变换作为一个使用基理论的例子进行了说明,但可能仍然不够具体。这篇文章中,我会尽力阐述相机变换的整个来龙去脉。希望能够对正在学习固定流水线的朋友们有所帮助。这里我们仍然会在推导相机变换之前介绍几个理论知识,目的是为了更好的理解推导过程。我们马上开始!

什么是相机变换?

在流水线中,当物体从模型坐标通过世界矩阵变换到世界空间之后,它将通过相机变换从世界空间变换到相机空间。下图的固定流水线中,蓝色框中的部分就是这个过程。

 

 

 

 

 

 

其实,所谓的相机空间,就是以相机作为坐标原点的一个参考系,所以,从世界空间变换到相机空间,就是把物体从世界坐标系,变换到相机为原点的相机坐标系,如下图所示。

 

 

 

 

左半部分是小人在世界空间中的位置,右半部分是小人变换到相机空间后的位置。这样的一个变换可以有很多种方式来实现:欧拉相机系统、UVN系统、Two Points & A Twist等等。这里我们讨论最为广泛的UVN系统构建相机矩阵,如果读者对其他方法感兴趣,可以查找相关的资料。我们仍然讨论OpenGL的相机矩阵的推导,其他API可以类似的推导。

坐标转换公式

我们在《向量几何在游戏编程中的使用6》中提到了正交矩阵,这是在基理论基础上的一个概念(如果对基理论不是很熟悉,请参考《向量几何在游戏编程中的使用6》)。正交矩阵所有列(行)向量构成了一个标准正交基(它的列向量都是互相正交,并且长度为1),因此,可以把正交矩阵看成是对一个坐标系的描述。同时,我们知道:同一个向量,在不同的基下面的坐标是不同的。因此,可以用正交矩阵来代表坐标系(也可以看作基)从而写出在统一的参考系(全局坐标系)下同一个向量在不同基中的坐标。

 

 

 

上面的式子表示,参考系中向量v在基Q中的坐标是v’,在基R中的坐标是v’’(注意这里的环境下基矩阵是用列向量表示的,这样相乘之后的结果表示的是基向量的线性组合)。如下图,黑色基表示的是参考系,红色是基Q,蓝色是基Rv是参考系中的一个向量。

 

 

为了让大家更清楚,我举一个例子:

 

 

上式的意思是:参考系中的向量v,在基Q( 1 0 0 ), ( 0 1 0 ), ( 0 0 1)下的坐标是( 1 2 6 ),在基R( 0 1 0 ), ( 0 0 1 ), ( 1 0 0 )下的坐标是( 2 6 1 )。注意,我们所讨论的所有基和向量的关系都只是线性表示的关系,没有位移关系,因此我们用3D向量表示,而不是4D的齐次表示(如果对齐次坐标不是很熟悉,请参考《深入探索透视投影变换》中的齐次坐标部分)。

这样,已知一个基Q和向量v在它之中的坐标v’,以及另外一个基R,我们可以通过v=Qv’=Rv’’公式来计算v’’

 

 

 

上面就是求v’’的公式,注意到右边需要计算基R的逆矩阵R^-1,因为基R是正交矩阵,而正交矩阵的一个重要性质就是逆等于转置。因此,我们可以把它写成

 

这个公式就是坐标转换公式。特别地,如果Q是和参考系相同的坐标系(3D编程中大多数情况下如此),比如世界坐标系,则Q是一个单位矩阵I,则我们可以把它写成

 

 

这个坐标转换公式可以解释为:对于世界坐标系中的向量v’,它在坐标系R中的坐标是v’’。我们在后面会用到这个公式。

    除了用正交矩阵来阐述坐标转换,我们还可以使用点积所代表的共线程度colinear amount)来描述坐标转换(André LaMothe的《Tricks Of The 3D Game Programming Gurus》)。这个理论基于点积的几何意义:一个向量在另一个向量上的共线程度。比如两个向量vs点积

 

 

几何意义就是vs方向上的投影长和s的长的乘积,或者是sv方向上的投影长和v的长的乘积(积的符号为:若vs的角度小于90度,积为正,如果是直角,积为零,否则为负)。

 

进一步地,如果v是一个单位向量,则这个点积可以解释为sv方向上的投影长;如果s是一个单位向量,则可以解释为vs方向上的投影长。现在,我们把点积推广到基的层次上,把一个向量v’和一个基R的三个单位轴向量进行点积,点积得到的三个值则表示这个向量在这个基下的坐标v’’

 

 

数学表达为

 

 

请注意,为了让v’能够和基的每一个轴向量进行点积,我们必须把基写成转置形式,即行向量乘法,否则就变成了线性组合的形式。这个公式的意义就是世界空间中的向量v’和基R的轴向量进行点积从而得到v’R下的共线程度——坐标v’’。这个公式和上面我们得到的坐标转换公式一模一样。实际上我们是从两个不同的方向解释同一个公式,希望你能够把两个方向都理解。

UVN系统

UVN系统本身是一个基。如下图所示,三个基向量UVN分别指向相机的右方、上方和后方从而构成右手坐标系,相机则处于坐标原点。

 

 

使用UVN系统可以非常方便的设置相机朝向。它的构建过程如下如所示

 

在参考系下(这里是世界坐标系),我们给定相机的位置——eye,被观察的小人的位置——lookat,以及一个辅助向量——参考系中表示“上方”的向量up,这个向量会影响UV的生成,因为以后求出的V向量会在upN向量所决定的平面上(有兴趣可以自己证明一下),所以可以通过这个向量让相机产生不同的偏转。

 

 

首先我们求出向量N

 

 

很简单,用目标位置减去相机的位置,就是图中的步骤2。第3步,我们求出向量U。这一步需要使用辅助向量up,如果不希望相机产生偏转,一般取(0, 1, 0)

 

 

U使用向量的叉乘实现,就是图中的步骤3。最后,使用NU计算出向量V

 

 

最后将计算出的UVN进行单位化,就得到了相机的UVN系统。结合上面我们谈到的坐标转换理论,我们可以把UVN系统看作是相机的基,从而可以方便的把一个向量在世界坐标和相机坐标进行转换。

OpenGLgluLookAt(eyex, eyey, eyez, lookatx, lookaty, lookatz, upx, upy, upz)方法就是使用的上面的步骤进行相机矩阵的设置。它的前三个参数就是相机的位置向量,中间三个参数是所观察的目标位置向量,最后三个参数就是辅助向量up

相机矩阵的推导

上面我们已经说明了UVN系统,标准流水线中就是使用了UVN系统来描述相机。U, V, N分别对应相机坐标系的三个基向量。

此外,对于一个相机来说,它在开始的时候和世界坐标系是重合的,用户控制相机在世界空间中移动之后,相机的状态可以用两个属性来描述——朝向和位置。也就是说,有了这两个属性,一个相机模型在世界中的状态就确定了。而这两个属性,我们用变换的理论来描述,就是旋转和平移。可以想象,对于世界中的任何一个相机状态,我们都可以把它看成是:相机先围绕自身基原点旋转一定的角度,然后平移到世界空间的某个地方。下图展示了这个过程

 

 

 

图中,红色是相机的基,而黑色是世界的基,也就是参考系。小人是世界中的一个物体。相机在移动之前,两个基是重合的。当相机在屏幕中定位时,它首先会进行朝向的确定——旋转,然后进行位置的确定——平移。图中的RotationTranslation两步就是相机定位时所发生的变换。可以看到相机相对于小人的运动。而当进行相机变换的时候,小人应该从世界基变换到相机的基里面。这样,他应该进行一个相机定位的逆定位,先逆平移小人和相机,然后再逆旋转小人和相机,最后相机归位,小人随相机变到了相机空间。这是由Inverse TranslationInverse Rotation两个步骤完成的,这两个步骤就是相机变换。现在我们推导这个变换。我们把关系写出来,相机本身的变换C包括两个元素

 

其中T是平移变换,R是旋转变换。而相机变换是相机本身变换的逆变换

 

 

这个C^-1就是我们要求出的相机变换。其中T^-1很容易求出,即

 

 

R^-1就没有这么容易求出来了。所以,我们不求它,我们用UVN系统。什么意思?请看上面的那张相机变换的图,当相机变换进行完Inverse Translation这一步之后,相机的原点和世界原点就重合了,也就是处理完了关于平移的变换。接下来我们要做的是逆旋转,而其实逆旋转的目的,就是要得到目前世界坐标中经过逆平移的小人在相机坐标系中的坐标。是不是似曾相识?我们的坐标变换理论就派上用场了。我们回忆上面坐标变换的公式

 

 

这个坐标转换公式可以解释为:对于世界坐标系中的向量v’,它在坐标系R中的坐标是v’’。那么,我们可以套用在这里:对于世界坐标中的已经经过逆平移的坐标v’,它在相机坐标系R中的坐标是v’’。什么是相机坐标系R?就是我们的相机UVN系统!就是

 

 

则相机变换的完整公式就是

 

 

这里,v是小人在世界空间中的坐标,v’’是小人在相机空间中的坐标。则相机变换矩阵就是

 

至此,我们就完成了相机矩阵的推导。物体经过这个矩阵就从世界空间变换到了相机空间,等待流水线对它进行投影变换。OpenGL就使用了上面推导出的最后的那个矩阵。

分享到:
评论

相关推荐

    图像变换矩阵:查找图像到相机的变换矩阵-matlab开发

    获取图像到相机的转换矩阵输入: * W,H 原始相机图像的宽度和高度*避开相机的焦距(以及相机与图像中心之间的距离) (注意:下面的所有角度都顺时针移动:NESW,向下-向前-向上,从左到右从左到右) * pan 是从北 ...

    Matlab变换矩阵应用代码案例

    这个领域的一个重要问题是如何找到从一个视角到另一个视角的转换(变换矩阵),以及如何使用这个转换来恢复三维结构。 在计算机视觉中,项目ive变换是一种将线映射到线的变换(但不一定保持平行性)。Matlab库中的...

    四元数矩阵 解算相机像面

    数变换矩阵, 并依据多体系统理论, 利用改进的四元数变换矩阵和齐次坐标变换矩阵两种方法推导出了对应于地面景物 的两种航天相机的像面位置模型, 阐述了利用四元数实时求解的算法来获得各像点的像面位置的实时解的...

    Reel拼接图片 用模板匹配方式计算透视变换矩阵,加权融合消除拼接缝

    透视变换矩阵描述了二维图像在空间中的三维变化,它可以纠正由于相机角度或物体位置导致的图像变形。在计算这个矩阵时,通常需要至少四个对应点对,这些点对分别来自原始图像和期望的目标位置。通过最小化匹配误差,...

    二维投影变换模型的单应矩阵表示

    ### 二维投影变换模型的单应矩阵表示 #### 引言 随着科技的进步与信息技术的发展,图像处理技术在诸多领域中扮演着越来越重要的角色。其中,图像配准技术(Image Registration)作为一项关键技术,在诸如目标跟踪...

    已知两个坐标系下对应点坐标求转换矩阵

    转换矩阵通常是一个4x4的矩阵,称为齐次坐标变换矩阵。在三维空间中,它可以表示旋转、平移甚至缩放等多种变换。对于没有缩放的情况,我们通常使用3x3的旋转矩阵R和3x1的平移向量t来构建转换矩阵T,即: \[ T = \...

    相机旋转矩阵外参在线标定

    描述中提到的“车道线边缘直线方程提取”是相机标定的一个步骤,通常通过霍夫变换或Canny边缘检测等算法来识别图像中的边缘,然后通过拟合直线方程找到车道线。这为后续的定位提供了基础信息。 高斯-牛顿法是一种非...

    opengl 中模型变换,投影变换,视点变换,视口变换的演示程序及源码

    每个变换都对应一个矩阵,这些矩阵被组合在一起,形成最终应用于顶点的复合矩阵。 了解和熟练掌握模型、投影、视点和视口变换对于使用OpenGL进行3D图形编程至关重要。它们不仅帮助理解图形是如何在屏幕上呈现的,也...

    unity cgshader矩阵变换图形

    在Unity中,我们可以使用内置的`UnityMatrixMult`函数来组合这些变换矩阵,形成最终的模型-观察-投影矩阵(Model-View-Projection Matrix,MVP)。这个MVP矩阵会应用于顶点坐标,从而确定它们在屏幕上的最终位置。 ...

    MATLAB.zip_matlab 矫正矩阵_matlab 透视变换_matlab透视矫正_透视变换_透视变换 matlab

    4. **创建透视变换矩阵**:使用`maketform`函数,传入四个源点和四个目标点来构建透视变换矩阵。 5. **应用变换**:使用`imtransform`函数,将创建的透视变换矩阵与图像结合,进行实际的变换操作。 6. **显示结果**...

    4-2特殊矩阵变换和运算1

    Euler 变换是矩阵变换中的一种非常直观的构造描述方位矩阵的方法,它可以用来实现相机。Euler 变换是由三个旋转矩阵构成的,即 head、pitch 和 roll,通过这三个矩阵的组合可以描述任意的方位。 Euler 变换的公式...

    Camera2Imageplane.zip_坐标变换 平面_坐标系_相机坐标_相机坐标变换_相机坐标系

    这涉及到相机的内参矩阵(包括焦距、主点坐标等)和外参矩阵(描述相机相对于世界坐标的姿态)。在Matlab中,可以使用内置函数如`projectPoints`来执行这个操作。 其次,畸变校正是为了纠正由于镜头畸变导致的图像...

    三点解算两个坐标系之间的旋转矩阵和平移向量

    根据 三点在两个坐标系下的坐标,建立两个坐标系之间的旋转矩阵R和平移向量T,适用场景:求 世界坐标系到 相机坐标系的转换关系。以其中一点建立 世界坐标系,该点在相机坐标系中的坐标是 世界坐标系到坐标系的平移...

    matlab单应矩阵

    张氏方法实现相机标定的过程中应用到的单应矩阵内容

    坐标变换过程与相机参数

    1. 世界坐标到相机坐标:这一变换涉及到旋转和平移,由外参矩阵表示,外参矩阵由一个3x3的旋转矩阵R和一个3x1的平移向量t组成,描述了世界坐标系相对于相机坐标系的旋转和位移。 2. 相机坐标到图像坐标:这个变换...

    open-gl-es

    setLookAtM ( float [] rm, //接收相机变换矩阵 int rmOffset, //变换矩阵的起始位置(偏移量) float eyeX, float eyeY, float eyeZ, //相机位置 float centerX, float centerY, float centerZ, //观测点位置 ...

    人脸识别欧拉角及位移矩阵计算及求解

    坐标系变换矩阵是指世界坐标系到相机坐标系、像面坐标系和像素坐标系的变换矩阵。 具体来说,坐标系变换矩阵可以通过以下公式计算: [xc, yc, zc] = R * [Xw, Yw, Zw] + T 其中,R 是旋转矩阵,T 是位移矩阵。 ...

    d3d编写的射击游戏

    D3D提供了相机变换矩阵,允许开发者控制玩家的视角,实现第一人称或第三人称视角的自由移动和旋转。 4. **碰撞检测**:射击游戏中,子弹与目标之间的碰撞检测至关重要。虽然D3D本身不提供碰撞检测功能,但开发者...

    MATLAB计算两个图片的单应性矩阵

    主要是计算两个图形平面间的点对应关系,即单应性矩阵。通过MATLAB实现。SelectPoint.m主要实现两个图片中各选取四个点,然后保存在H.mat文件中,运行玩这个程序后直接运行testH.m文件即可

Global site tag (gtag.js) - Google Analytics