`
kennyluo
  • 浏览: 78061 次
  • 性别: 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库中的...

    四元数矩阵 解算相机像面

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

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

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

    matlab单应矩阵

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

    open-gl-es

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

    使用相机模型将 3D 投影到 2D 图像坐标:使用具有镜头失真参数的相机模型投影 3D 点-matlab开发

    用于在相机的图像坐标中查找 3D 点位置的代码。 考虑了相机变换矩阵、相机矩阵和畸变系数。

    数码相机定位(全国大学生数学建模竞赛A题)

    问题四中,通过每个相机旋转变换矩阵R和平移向量T,可以得到两相机的 变换关系: 1 1 1 2 1 2 2 1 R = R R -、T = R R - T +T ,即相对位置关系,并理论推导了从两相 机中像在光心坐标系中的参数得到物在世界坐标中...

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

    介绍如何从一个矩阵提取一系列的基本变换。最后,我们导出围绕任意轴旋转实体的方法。Euler变换是一个非常直观的构造描述方位矩阵的方法 (可以用它来实现相机)。它

    【camera-radar】相机-毫米波雷达联合标定方案介绍+实现

    【camera-radar】相机-毫米波雷达联合标定方案介绍+实现

    基于RGB-D相机数据的SLAM算法

    首先在RGB图中提取均匀化的ORB特征,采用暴力匹配的方式,并使用随机采样一致性(RANSAC)算法得到优化后的匹配结果,然后用PnP解算连续帧的相机位姿变换关系,并用非线性优化方法优化该位姿变换矩阵,同时,通过...

    相机成像模型及相机标定原理整理1

    1.1 常用坐标系 1.2 单目相机成像模型 1.3 相机位姿变换 2.1 内参约束条件 2.2 求取内参矩阵 2.3 求解外参矩阵

    坐标变换过程与相机参数

    1、概念介绍 1.1 针孔模型​​​​​​​ 2、四种坐标的介绍 3、坐标转换关系图  4、世界坐标->相机坐标  4.1 外参 5、相机坐标->图像坐标  6、图像坐标->像素坐标 7、内参 8、投影矩阵M

    齐次坐标概念&&透视投影变换推导

    透视投影是3D固定流水线的重要组成部分,是将相机空间中的点从视锥体(frustum)变换到规则观察体(Canonical View Volume)中,待裁剪完毕后进行透视除法的行为。在算法中它是通过透视矩阵乘法和透视除法两步完成的。 ...

    Python 在OpenCV里实现仿射变换—坐标变换效果

    在现实的图像操作软件中,经常碰到的不是给出放大多少倍,而是由用户在软件的界面上选择多大的区域,或者选择几个点,那么这样情况下,怎么样来计算出变换矩阵呢?从前面知道变换矩阵是2X3的矩阵,说明有六个未知数...

    图像矩阵matlab代码-Camera-to-Arm-Calibration:Matlab工具箱,用于查找从相机到机械臂底座的转换

    图像矩阵matlab代码相机到手臂校准 该方法通过找到使投影到照相机坐标系中的照相机和手臂给定的棋盘位置的差异最小化的参数来进行操作。 Haitham El-Hussieny对此工具箱进行了ROS扩展,无需手动提取数据,可以在以下...

    实时渲染翻译第四章

    变换矩阵一种以某种方式转换点、向量或颜色等实体的操作。对于计算机图形专业人员来说,掌握变换矩阵是非常重要的。使用它们,可以进行定位、重塑和动画对象、灯光和相机。您还可以确保所有计算都在相同的坐标系中...

    showPnP(pnpmatrix,fx,fy,cx,cy,screen_z):此功能显示摄像机在世界空间中的位置,从OpenCV从solvePNP获取变换矩阵。-matlab开发

    这个函数显示世界空间中的相机位置,变换矩阵是从 OpenCV 或 Matlab 的 solvePNP 计算的。 pnpMatrix 是 Twc,它给出了这个方程 Pc = Twc*Pw(Pw 是世界坐标中的 3D 点,Pc 是相机坐标中的 3D 点)。 fx,fy,cx 和 cy...

    OpenGL中的三维物体的显示中使用的坐标变换

    OpenGL通过相机模拟可以实现计算机图形学中最基本的三维变换,即几何变换、投影变换、裁剪变换、视口变换等,同时,OpenGL还实现了矩阵堆栈等。 为了使被显示的三维物体数字化,要在被显示的物体所在的空间中定义一...

Global site tag (gtag.js) - Google Analytics