zoukankan      html  css  js  c++  java
  • 【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)是一种使用特定的算法将二维或三维图形转化为计算机可识别形式的科学。也就是说,计算机图形学主要研究如何在计算机中存储图形、表示图形、以及如何利用计算机对图形进行处理。计算机图形学的主要目的就是要利用计算机产生令人赏心悦目的真实感图形。

     

    笔者注:

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

     

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

    2.2 计算机辅助几何设计

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

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

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

    2.3 OpenGL

    OpenGL(Open Graphics Library)是一个底层的图形库,它的功能非常强大且调用方便。作为一个图形开发库,OpenGL是完全独立的,它不依赖于任何的平台,可以在任何平台下进行开发,如果再利用一些计算机高级语言开发主框架,然后结合OpenGL就可以开发出三维游戏等应用程序。也就是说,OpenGL是个与硬件无关的软件接口,可以在不同的平台如Windows 95、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的前世今生神马的,相信读者早就了解过~~~),但是我会尽量做到不影响大家阅读,还望大家谅解。)

  • 相关阅读:
    你是否听说过 HashMap 在多线程环境下操作可能会导致程序死循环?
    深入浅出分析 PriorityQueue
    深入浅出分析 ArrayDeque
    深入浅出的分析 Set集合
    深入浅出的分析 Properties
    深入浅出分析 HashMap
    深入浅出的分析 Hashtable
    深入浅出的分析 WeakHashMap
    深入浅出的分析IdentityHashMap
    python 执行js PyExecJS
  • 原文地址:https://www.cnblogs.com/zhidianhcuan/p/4135214.html
Copyright © 2011-2022 走看看