【Ogre编程入门与进阶】第二章 Ogre相关知识回顾 【转载】

转载请说明出处!程序员

http://blog.csdn.net/zhanghua1816/article/details/8067669

算法

 

第一章,咱们简单介绍了什么是Ogre,它能用来作什么。OGRE(Object-Oriented Graphics RenderingEngine是一个面向对象图形渲染引擎,它用C++开发而成,并且,它隐藏了底层系统库(如:Direct3D和OpenGL)的全部细节。旨在让开发人员更容易、更直接地开发应用。在开始学习Ogre以前,咱们须要具有一些相应的基础知识,例如计算机高级语言C++、计算机图形学以及数学等方面的知识。若是读者已经具有了这些基础知识,能够跳过本章,开始第3章的学习,若是读者对这些基础知识还不甚了解,那么就立刻跟我一块儿来学习吧。编程

2.1 计算机图形学框架

计算机图形学(Computer Graphics,简称CG)是一种使用特定的算法将二维或三维图形转化为计算机可识别形式的科学。也就是说,计算机图形学主要研究如何在计算机中存储图形、表示图形、以及如何利用计算机对图形进行处理。计算机图形学的主要目的就是要利用计算机产生使人赏心悦目的真实感图形。ide

 

笔者注:函数

读者应该区分图形和图像这两个概念。图形和图像虽然仅一字之差,不过区别仍是很大的。图像一般是指那些经由输入设备输入到计算机中,以数字化形式在计算机中存储和显示的信息。图像是由一些排列的像素组成的,在计算机中以矩阵的形式存储。图像常见的存储格式有BMP、JPG、GIF等。而图形通常指利用计算机软件绘制的画面,如直线、圆、矩形等,总得来讲,图形是计算机利用某些特定点以及特定的图形生成算法自动生成的。工具

 

计算机图形学的研究内容很是普遍,包括曲线曲面造型、图形交互技术、光栅图形生成算法、实体造型、计算机动画、真实感图形计算与显示算法、非真实感绘制,以及科学计算可视化、天然景物仿真、虚拟现实等。在计算机三维游戏和动画中,计算机图形学的知识可谓无处不在。利用它,能够在影视做品中实现真人与动画的完美结合,还能够将特效应用于各类游戏和动画中等等。学习

2.2 计算机辅助几何设计动画

在前面的2.1小节中,咱们大体了解了计算机图形学这门学科。其实,计算机图形学是研究如何在计算机内存储和显示图形,这些图形最终构成一个完整的、逼真的、跟现实世界中极为类似的场景。并且,这个场景要尽最大可能与现实中的真实场景保持一致,也就是说,尽最大限度地模拟显示中的场景,并让其在计算机屏幕上显示出来。为了达到这个效果,必须将场景分解为不一样的几何体、图形、点、线等,再利用计算机模拟某种光照、以及几何体上的材质、纹理等效果,最终达到一个较高的仿真水平。所以,咱们在有了计算机图形学的基础之后,还须要掌握另外一门与计算机图形学密切相关的学科:计算机辅助几何设计。spa

计算机辅助几何设计(Computer Aided Geometric Design: CAGD)是涉及计算机科学与数学的一门新兴学科,也是一门边缘学科, 它研究的主要内容是"在计算机图像系统的环境中曲面的表示和逼近", 它主要侧重于计算机内如何对几何体进行构造。

计算机辅助几何设计(CAGD)虽然是一门新兴学科,可是学习它所用到的理论工具相信你们都很熟悉,例如交换代数、逼近论、微分几何、计算数学、代数几何等等。随着计算机技术的不断发展,以及计算机愈来愈强大的图形功能,计算机辅助几何设计这门新兴学科也在不断发展,并被普遍应用到诸如飞机, 船舶, 汽车的设计以及工程器件模具的设计中,另外,它还被普遍应用到了医学图像处理等领域。

2.3 OpenGL

OpenGL(Open Graphics Library)是一个底层的图形库,它的功能很是强大且调用方便。做为一个图形开发库,OpenGL是彻底独立的,它不依赖于任何的平台,能够在任何平台下进行开发,若是再利用一些计算机高级语言开发主框架,而后结合OpenGL就能够开发出三维游戏等应用程序。也就是说,OpenGL是个与硬件无关的软件接口,能够在不一样的平台如Windows 9五、Windows NT、Unix、Linux、MacOS、OS/2之间进行移植。所以,若是一个软件支持OpenGL,那么它必然拥有很是好的移植性,从另外一个角度说,移植性强也是OpenGL普遍应用的一个重要缘由。

 

笔者注:

OpenGL与Ogre的区别:

OpenGL是系统底层的API,跟它同级的还有Direct X。

Ogre能够说就是对OpenGL和Directx的二次封装。通俗的说,Ogre把底层的东西封装起来,以一种更贴近现实的方式,供咱们使用,即绝大多数的细节对程序员来讲是透明的,即系统底层的细节都被封装起来,程序员无需知道具体的细节是什么,只须要简单的调用Ogre提供给咱们的函数接口就能够实现咱们想要实现的功能。对于OpenGL或者DirectX这种底层API来讲,是不具有这种封装性的,要实现任何功能,都须要程序员经过代码对系统底层直接操做,过程可谓十分繁琐。

 

2.4 C++知识

接触太高级语言编程的读者,对C++确定都不陌生。Ogre是一个用C++开发完成的图形库,在Ogre中编写的代码,都遵循了C++语法的原则。所以,在咱们开始使用Ogre以前,必须得学会C++的基本概念、函数、语法和运行原理等相关知识。

C++语言是从C语言的基础上发展而来的。C语言是一种面向过程的计算机高级语言,若是要处理的程序规模较小,C语言使用起来可谓驾轻就熟,可是,若是程序的规模太大,使用C语言进行设计就必须细致的处理程序中的每一处小细节,例如,程序员必须知道每一个时刻,程序中各个变量的状态,各个变量接下来如何变化等。这无疑大大增长的程序设计的难度,纵使高水平的程序员也显得力不从心。在这种状况下,C++语言就应用而生了。

C++语言继承了C语言的几乎全部优势,在此基础上,增长了面向对象的机制,也就是说,C++语言是一种面向对象的高级程序语言,在C语言的基础上引入了类的概念。并且,C++语言还引入了继承机制,使得代码能够被重复利用。所以,学习Ogre3D前,咱们要掌握C++中最基本的类的概念、重载、多态、继承等一些重要的概念。

2.5 变换中的数学

在3D图形学中,须要咱们具有至关的数学知识才能更好的理解各个方面的知识,这一节咱们就详细讨论一下咱们常常会涉及到的一些变换知识,不过,咱们不可能面面俱到的讲到每一个方面,若是读者朋友想更好的理解这些知识,还需参考相关书籍。

2.5.1 点和距离

点表示一个位置,是在坐标系中以坐标值指定的位置。一点p(x,y,z)在坐标系中的坐标,就是该点在坐标轴上的垂直投影 (以下图所示为二维平面上的点p(x,y)在x,y轴上的投影).

 

 

设三维空间中的两个点p1(x1,y1,z1)和p2(x2,y2,z2)则两点之间的距离为:

 

 

2.5.2 矢量

矢量是一个n元组,在坐标系中它对应于n维空间的一个点,这个点 能够表明物体在空间的位置,也能够表明其运动状态等。下面经过三维矢量来讲明有关矢量的概念及运算。

设有任意两个三维矢量:

             

1.矢量和

矢量能够进行求和运算,遵循平行四边形规则,以下图所示:

        

2.矢量的数乘

设存在一个实常数k,矢量的数乘是经过对矢量的各份量同时乘以k来实现。矢量的数乘能够实现对矢量的放缩。若k>0,则所得的新矢量与原矢量方向相同,不然方向相反。

 

 


3.矢量的模

任何三个线性无关的矢量都构成三维空间的一组基。以下三个特殊的矢量是三维空间的一组基:

 

也就是说,任何三维矢量均可以表示成这三个矢量的线性组合,矢量U可表示为:

 

 


这三个主矢量一般也分别被称为 , , 。矢量的模指的是矢量的长度,定义为:

 

 

4.单位矢量

对于给定矢量,若是只对它的方向感兴趣而不在意它的长度,为了方便计算,可使用与其方向相同的单位矢量。设U的单位矢量为 ,则

 

5.矢量的点乘

矢量U和V的点乘表示为 ,定义以下:

 

 

U和V夹角 的余弦定义以下:

 

 

点乘的几何意义如图所示:

 

U·VUV上的投影乘以V的模

由以上定义能够获得点乘的以下性质:

 

 

该性质的含义是两个互相垂直的矢量(通常称为矢量正交)的点乘为0。

6.矢量的叉乘

矢量的叉乘表示为 ,它构成了一个新矢量。

          


其中 , , 分别为 , , 轴的单位矢量。

 

 

叉乘有以下性质:

(1).

(2).矢量 U×V垂直于矢量U 和V,即U×V是U和V构成的平面法向。U、V和U×V三矢量的方向听从右手系。

 

 

2.5.3 矩阵

m×n阶矩阵A定义为:

 

 

其中 为A的第 行第 列元素,矩阵A也记为 或 。若是m=n,则称A为n阶矩阵或n阶方阵。下面以4×4阶矩阵为例讨论矩阵性质。

设有两个4×4阶矩阵:A= ,B= 。

1.矩阵的加法

把两个矩阵对应位置的元素相加获得的矩阵称为矩阵的和,记为A+B。

 

 

注意:只有两个矩阵的阶数(行数和列数)相同时才能进行加法运算。矩阵的加法运算归为它们元素的加法,也就是数的加法。

2.矩阵的数乘

对于任意实数k,k与矩阵A的数乘定义为k与A的每一个元素相乘,即:

 

 

3.矩阵的乘法

当矩阵A的列数和矩阵B的行数相同时,可对它们进行乘法运算。例如:若A为m×n阶矩阵,B为n×p阶矩阵,设C为它们的乘积,则C为m×p阶矩阵。

 

 

4.单位矩阵

若一个n阶矩阵的主对角线元素均为1,其他各元素均为0,则称该矩阵为n阶单位矩阵,记为 。一个4阶单位矩阵为:

 

 

5.矩阵的转置

把矩阵A=的行、列互换而获得的n×m阶矩阵叫作A的转置矩阵,记为AT。例如,将上面的4×4阶矩阵B进行转置获得BT

 

 

 

矩阵的转置知足:

(AB)T=BTAT

6.矩阵的逆

对于n阶矩阵A,若存在一个n阶矩阵B,使得AB=BA=In,则B为A的逆矩阵,记做B=A-1。同时A也称为B的逆矩阵,即A和B互为逆矩阵。矩阵A可逆的充分必要条件是其行列式不为0。例如:

 

                

          


2.6几何变换

观察一个物体,因为观察角度或位置的改变,会看到不一样的画面。观察角度和物体位置的改变能够经过在世界坐标系中对物体进行各类变换来实现。

2.6.1 基本变换

1.平移变换

设点P(x,y,z)沿x、y和z轴方向分别移动距离Δx, Δy和Δz获得点P′(x′,y′,z′),则这两点坐标之间的关系是:

x′=x+Δx      y′=y+Δy       z′=z+Δz

用矩阵表示为:

                                       1

2.放大和缩小变换

设点P(x,y,z)沿x、y和z轴方向分别放缩sx、sy和sz倍后获得点P′(x′,y′,z′),则有:

 

                                                                               2

写成矩阵形式为:

                                   3

比例因子sx、sy和sz相等时,上式是以原点为类似中心的类似变换,以下图所示,是对一三角形作类似比为2的类似变换的情形:

 

原图形距离坐标原点越远,图形变换后的位置改变越明显,为了使放缩变换后的图形仍在原来位置附近,可另外定义一个类似中心(如可取图形的中心)(xp,yp,zp),而后再进行放缩变换。要对图形造成以(xp,yp,zp)为类似中心、以(sx,sy,sz)为放缩比例的变换,可先对图形进行平移变换,把整个图形沿x、y和z方向分别平移-xp、-yp和-zp,类似中心就移到了坐标原点,而后对每一点按照上面的公式进行放缩变换,最后再沿x、y和z方向分别平移xp、yp和zp,把变换后的图形移回到原处,就完成了以(xp,yp,zp)为中心的放缩变换。其变换公式为:

 

 

 

 

以(xp,yp,zp)为中心的缩放变换

 

3.旋转变换

设点P(x,y, z)= (rcos , rsin , z),绕z轴旋转 角度后获得点P′(x′,y′,z′)。这里规定绕一轴旋转 角度是按右手法则,即若 >0,大拇指指向轴的方向,其它手指指向旋转方向。这样可获得P和P′两点坐标之间的关系为:

 

 

用矩阵形式表示为:

                           4

同理可获得绕y和x轴做旋转变换的矩阵表示分别为:

 

      和        

 

下面讨论空间任一经过坐标原点的轴的旋转变换,设旋转轴方向为(Ax,Ay,Az)。由上述讨论知,沿z轴的旋转变换很容易实现,所以可把绕任意轴的旋转变换归结为z轴的变换实现。为此,创建一个新的坐标系 ,坐标轴的指向和旋转轴方向一致,以下图所示。

 

把要进行旋转变换的对象从原坐标系 变换到新坐标系 ,而后在新坐标系中绕Ow轴对其进行旋转变换,最后把旋转的对象由新坐标系 变换到原坐标系中 ,这样实现了绕空间任一经过坐标原点的轴旋转的变换。

如今创建两个坐标系 和 之间的变换关系。Ow轴方向的单位矢量 的坐标为:

 

因为Ou轴方向的矢量和矢量和点乘为零,因此,当 时,Ou轴的方向可取矢量(-Ay,Ax,,0)的方向,当 ,此时Ow轴和z轴重合,Ou轴的方向取(Az,0,0)的方向,即x轴方向。Ou轴方向的单位矢量 的坐标为:

  若 

    若 

因为Ouvw为右手坐标系,因此Ov轴方向的单位矢量 为 ,即

 

设P=(x,y,z)是坐标系Oxyz中的任意一点,则P在Ouvw下的坐标就是矢量 在Ouvw三个轴的投影长度。因为矢量 在Ou轴上的投影u等于 和Ou轴上的单位矢量 的点乘,因此 ,同理可知,矢量 在Ov和Ow轴上的投影v和w为:

             

因此从坐标系Oxyz至Ouvw的变换为:

                        5

因为矢量 、 和 相互正交,因此矩阵A的逆矩阵就是A的转置矩阵。这样,从坐标系Ouvw至Oxyz的变换公式为:

                                                                  6

按照上述绕任意经过原点的轴进行旋转变换的实现方法和式(4)、式(5)和式(6)可得变换公式:

 

                     7

若是旋转轴经过点(xp,yp,zp),而不经过坐标原点,则可先进行平移变换把对象沿x、y和z方向分别平移-xp、-yp和-zp,而后按照式(4)进行旋转变换,最后再把图形沿x、y和z方向分别平移、和,这样就能够获得图形绕任意轴和旋转变换。

 

4.错切变换

在下图中,OA'B'C'是矩形OABC沿x轴正向切变后的形状,x轴称为方向轴,y轴称为依赖轴。

 

切变的程度由s=tan 决定,已知

 

由此可知s的几何意义是y=1的点在切变时沿x轴正向平移的距离。设点(x,y,z)经错切变换后称为(x',y',z'),则该变换用矩阵表示为:

 

                        8

若是依赖轴和方向轴改为其它的坐标轴,上式中的矩阵要进行相应的变更。

 

 

2.6齐次坐标与变换的矩阵表示

对图形进行操做时,常常须要对图形连续进行几回变换,例如平移、旋转以及放缩等,这样对没一点的坐标要依次用咱们前面介绍的公式进行计算,计算量较大。若是只有旋转和放缩,则可把前面的式(7)和式(3)合并成一个矩阵。旋转和放缩变换可写成以下形式:

 

                   9

其中T1是4个矩阵的乘积。对一图形进行上述变换时,只要用乘以各点的坐标就能够了,但若是再加上平移变换,因为式(1)右边比其它变换多了一项,变换矩阵就没法合并。为了是平移变换也能像式(5)、式(6)、式(7)和式(8)那样容易合并,引进矢量的齐次坐标表示。所谓齐次坐标表示法就是用n+1维矢量表示n维矢量。例如,使用齐次坐标(xh,yh,zh,h)来表示每一个三维空间坐标位置(x,y,z),其中参数h可取为任意非零值,最简单的选择是取h=1,所以每一个三维位置均可用齐次坐标(x,y,z,1)进行表示。这样式(1)的齐次坐标表示式能够写为:

 

                     10

式(10)和式(1)是等价的。引进齐次坐标表示的优势是全部上述变换矩阵可写成统一形式,使变换合并容易。例如式(4)的变换可写成齐次坐标形式:

 

 

另外,利用齐次坐标还能够表示无穷远点。例如,n+1维中,h=0的齐次坐标实际上表示了一个n维的无穷远点。在三维状况下,利用齐次坐标表示视点在原点时的投影变换,其几何意义会更加清晰,因此在计算机图形软件包中通常都用齐次坐标来表示变换。

 

 

 

 PS:好久之前就打算把学习Ogre中遇到的知识分享给你们(虽然只是一些皮毛),可是说来惭愧,一直很懒,直到最近才抽出点时间写一些本身的理解(Ogre入门级的东西),因此不免会有不少不足之处,分享是一种快乐,同时也但愿和你们多多交流!

(因为在Word中写好的东西发布到CSDN页面须要从新排版(特别是有不少图片时),因此之后更新进度可能会比较慢,同时每章节发布的时间可能不同(好比说我首选发布的是第二章,其实第一章就是介绍下Ogre的前世此生神马的,相信读者早就了解过~~~),可是我会尽可能作到不影响你们阅读,还望你们谅解。)

相关文章
相关标签/搜索