【Ogre编程入门与进阶】第三章 Ogre框架配置及概要分析 [转载]

 

分类: Orge模块

3.1 Ogre支持的系统平台

        笔者认为,Ogre几乎可以支持所有的系统平台。这并不是天方夜谭,Ogre的确拥有很强的跨平台性。

       Ogre是一个用C++语言开发的图形渲染引擎,Ogre最开始主要应用于Windows系统平台。不过随着Ogre的不断发展,Ogre的核心团队吸纳了精通Mac OS X和Linux系统的人才,来开发适用于这两种系统平台的Ogre,目前,Ogre开发团队中有专门的人员来维护Mac OS X和Linux系统下的Ogre。因此,无论是Windows系统,还是Mac OS X和Linux系统Ogre都可以在源代码级别上对其提供良好的支持。

        另外,目前版本的Ogre已经开启了本地OpenGL的支持,因此,从理论上来说,目前的Ogre几乎可以支持所有拥有OpenGL硬件加速的系统。

        读到这里,有的读者可能会问,目前大大小小的系统平台远不止上文提到的这些,Ogre又怎么能说Ogre几乎可以支持所有的系统平台呢?其实,Ogre的发展离不开网友的支持。热心的网友提供非常多版本的Ogre以支持这些其它的系统平台。例如,Ogre并不能提供那些非Linux的UNIX的支持,但是有的热心网友已经将自己编写的支持这类UNIX系统的“Ogre”分享在网络上,方便大家共同学习。事实上,目前存在很多这样的非官方的Ogre团体,他们在某种层面上不断对Ogre进行完善。

 

笔者注:

        虽然目前的Ogre几乎支持所有的系统平台,但是最主要的Ogre开发平台还是Windows平台。

 

       总结一下,Ogre的这种跨平台性,可以说是一种独具匠心的设计。这种设计将各种系统平台之间的差异降到最低。对于不同的软件、硬件系统尽量提供同一种标准,及ISO C++标准。

 

3.2 Ogre依赖的软件和功能

        对于目前大多数软件开发公司来说,开发一个软件都不可能从“0”开始,也就是说,当今大多数软件的开发都会依赖于其他已有的软件或者功能,在这些已有的软件和功能的基础上来开发自己的软件,这样可以“窃取”别人的开发成果(当然是在合法的前提下),从而避免了很多重复冗余的工作,提高了软件开发的速度和效率,而且,这样做还有一个好处,那就是开发者可以将更多的时间和精力用于开发属于自己软件的“特色之处”,而不用将时间浪费在那些类似于其它软件的“固有的功能”上。

        另外,目前很多的软件都是开源的(Ogre也是开源的),这也就意味着用户可以在网上免费得到这些软件的源代码,方便用户学习这些软件的开发思想和具体的技术实现。这样一来,用户就可以依赖这些思想、技术、甚至是源码来方便快捷的开发出属于自己的应用程序。

作为一个开源的图形渲染引擎,Ogre也有一些依赖项目,不过Ogre要依赖的项目并不多,主要有如下几种:FreeType、OpenIL、zziplib和zlib等,这些依赖项目可以到自身的官方网站下载,也可以到Ogre官网下载已经整合好了的资源的压缩包。下面我们就分别向读者简要介绍这些Ogre所依赖的项目。

 

(1)FreeType:

        FreeType库是一个开源的字体引擎,它具有可移植性,并提供一组统一的接口来访问字体格式的文件,这些字体格式的文件包括TrueType, OpenType, Type1, CID, CFF, Windows FON/FNT, X11 PCF等。FreeType是使用ANSI C开发的,但是它也采用了面向对象的思想,方便用户对其功能进行筛选。

(2)OpenIL(即DevIL):

        OpenIL(DevIL),开发者图像库(Developer's Image Library),它是一个“图片读取”的库,它也是一个开源库,功能非常强大,可以读取很多类型的图像文件,比如BMP、JPG、PNG和等等。

(3)zziplib+zlib:

        Zziplib是一个用来对zip文件进行读取和压缩的库,其中zlib用于提供一些压缩算法,这些算法都是开源的。

 

笔者注:

        当读者在Windows系统平台下开发Ogre应用程序时,除了上文中提到的这三种依赖项目,还必须得到微软DirectX渲染库的支持,也就是说,电脑必须要安装对应版本的DirectX,才能正常开发并运行Ogre应用程序,相应的DirectX,可以到微软的DirectX主页直接下载。

 

        另外,Ogre可以支持HLSL和GLSL两种GPU着色语言,及其现在越来越流行的cg语言(C forGraphics是为GPU编程设计的高级绘制语言,由NVIDIA和微软联合开发)。

 

笔者注:

        不论是Direct3D,还是OpenGL,一般都是硬件厂商的驱动程序复杂支持3D图形的加速。

        Ogre所需要的Direct3D环境,被集成在了DirectX SDK的安装程序中,也就是说,当我们安装完DirectX SDK后,也就安装好了Ogre所需要的Direct3D环境;而当我们选择OpenGL,它所需要的环境被集成在了硬件厂商开发的驱动程序中。

        另外,还有一点需要说明,只有在Windows系统平台下开发Ogre应用程序,才能通过Direct3D来实现图形加速,而通过OpenGL实现图形加速可以被使用在所有不同的平台下。

 

3.3 Ogre环境配置

        在我们使用Ogre之前,首先要将Ogre“安装”到我们的电脑上,即配置Ogre所需的软件环境。从大的角度讲,Ogre的环境配置可以有两种不同的方法:利用Ogre官方提供SDK构建环境以及利用源码构建环境。利用SDK构建环境简单、快捷,只需简单的安装Ogre官方网站上提供的Ogre SDK安装包,然后对开发工具和系统环境变量稍作设置即可,但是如果您想要深入学习Ogre源代码的话,笔者建议您选用第二种方法:从源码构建Ogre环境。从源码构建Ogre环境相对于利用SDK配置环境的方法显得更加“专业”,因为SDK的方法只是游走于表面而无法深入,而利用源码构建Ogre环境可以让你“深入”的了解Ogre的内部构造,包括Ogre中每个函数的含义、作用、函数之间的关系,变量的作用、含义等,在这种方法中,我们可以从“源码”的级别调试Ogre程序,可以通过源码学习Ogre的整体架构(包括Ogre的设计思路、生成方法等),最重要的是,我们可以找出这些源代码中的不足,并针对这些不足对源代码进行修改,这些“修改”很可能就代表着下一个Ogre版本的诞生!

 

笔者注:

        在本书中,我们使用的Ogre环境是Windows系统下的Visual Studio 2008+Ogre_src_v 1-7-2版,当然读者朋友也可以采用其它开发环境。在笔者写本书时Ogre官网已经公布了Ogre1.8的RC版(发布候选版),大家也可以下载使用,不过对于我们初学者来说,没有太大区别,而且配置方法是一样的。

 

1.利用Ogre SDK构建。

        SDK的概念我们在第一章曾简单介绍过:SDK(SoftwareDevelopers Kit)是软件开发包的简称,我们可以把它理解为开发一套完整程序所用到的资源的集合。对程序编写人员来说,SDK是一套对系统底层的服务的封装,这就意味着,程序编写人员可以“无视”复杂的系统底层API,而仅需简单的调用SDK提供的封装即可方便快捷的完成所需要的功能。

        那么,我们可以把Ogre SDK看做是对Ogre功能的封装。通过它,我们可以简单的安装Ogre所需的系统环境。下面笔者将详细向读者介绍这种Ogre环境的配置方法。

        第一步,我们需要登录Ogre官网,下载相应版本的Ogre SDK。

        我们登录到Ogre官网: http://www.ogre3d.org/

        找到网页左侧的DOWNLOAD——SDK标签:

 

 

        在接下来弹出的网页中,我们找到适用于VS2008的1.7.2版本的Ogre:OgreSDK_vc9_v1-7-2.exe,将它下载保存到本地磁盘上。

        第二步:下载并安装微软官网提供的最新的DirectX SDK。

        http://www.microsoft.com/en-us/download/details.aspx?displaylang=en&id=6812

 

笔者注:

        有一点需要读者特别注意,DirectX SDK是Ogre环境配置成功所必须的。DirectX SDK有很多的版本,笔者建议安装的版本是DirectX SDK– February 2010,这样可以简少初学者在安装配置过程中遇到的一些莫名奇妙的错误。

 

        笔者在此选用的DirectX SDK版本是DXSDK_Jun10.exe,如下图:

        双击运行,选择合适的目录(笔者选择的目录是C:\Program Files\Microsoft DirectX SDK (June 2010))并安装,安装过程非常简单,这里就不再赘述。

        第三步:安装VisualStudio 2008,并升级到SP1版本。

        通过微软官网下载VS2008,安装的过程跟类似的软件类似,这里也不再赘述。同时笔者建议读者朋友最好把软件打上SP1版本补丁。

笔者注:

        很多读者在编译程序的时候会出现一些异常错误,原因之一就是在安装完VS2008之后没有打上SP1补丁。

 

        第四步:双击运行下载好的OgreSDK_vc9_v1-7-2.exe。

        将它解压任一目录,如,D:\Ogre目录,如下图:

        解压后的OgreSDK_vc9_v1-7-2文件夹中的内容如下图所示:

 

 

        第五步:设置环境变量并将Ogre环境配置所需要的包含文件和库文件添加到VS2008中。这一步可以和第五步同时进行。

        1.设置系统环境变量。

        右键单击“我的电脑”,依次选择“高级”——“环境变量”,如下图:

 

 

        新建系统环境变量,变量名为OGRE_HOME,变量值为Ogre的安装根目录,如下图:

 

 

        2.将Ogre环境配置所需要的包含文件和库文件添加到VS2008中。

        这里我们有两种添加方法:

        第一种:一劳永逸法

        打开VS2008,依次点击菜单栏中的工具——选项,在弹出的对话框中左侧,选择项目与解决方案下的VC++目录,在右侧上方选择“包含文件”,然后将Ogre环境需要的包含文件路径添加到其中:

       (1)C:\Program Files\Microsoft DirectXSDK (June 2010)\Include 

       (默认情况下安装DirectX时已经设置好了,一般情况下不需我们设置)

       (2)$(OGRE_HOME)\include

       (3)$(OGRE_HOME)\boost_1_44

       (4)$(OGRE_HOME)\include\OGRE

笔者注:

        在如上添加的目录中,我们使用了刚刚设置的环境变量:OGRE_HOME。实际上,OGRE_HOME就代表了Ogre安装的根目录,即D:\Ogre\OgreSDK_vc9_v1-7-2(这是Ogre在笔者电脑上的安装目录),也就是说“$(OGRE_HOME)\Samples\Common\include”就等同于“D:\Ogre\OgreSDK_vc9_v1-7-2\Samples\Common\include”,这也是我们设置OGRE_HOME这个环境变量的意义所在,当然,如果你不想添加OGRE_HOME环境变量也可以,我们只需把出现$(OGRE_HOME)的地方改成D:\Ogre\OgreSDK_vc9_v1-7-2即可,不过我们不建议大家这样做,因为如果我们有了OGRE_HOME环境变量,当我们修改Ogre目录的时候,只需修改一次即可。

 

        在添加完“包含文件”之后,同理,我们还要选择“库文件”,并将如下的目录添加到“库文件”中:

      (1)C:\Program Files\Microsoft DirectXSDK (June 2010)\Lib\x86

     (默认情况下安装DirectX时已经设置好了,一般情况下不需我们设置)

     (2)$(OGRE_HOME)\lib\debug

     (如果在Release模式下,则是$(OGRE_HOME)\lib\release)

     (3)$(OGRE_HOME)\boost_1_44\lib

        这是第一种配置方法,通过这种方法我们只需这一次配置,以后在我们的电脑上每次新建立一个Ogre应用程序的时候就无需再重新配置这些路径了,但是如果我们把我们的工程移植到别的电脑上时运行,还需要再次添加这些路径,因为前面我们配置的这些路径信息只是在我们本地电脑的VS2008配置文件中保存,所以这种配置方法不太适合多人开发一个项目,如果我们想把这些配置路径信息保存到我们的工程中,也就是说,无论我们的整个工程文件拷贝到那一台电脑,这些包含文件路径、库文件路径都能保存下来,我们需要把这些信息保存到工程属性中,也就是使用我们的第二种方法。

        第二种:灵活运用法

        这种方法需要我们在建立一个Ogre应用程序之后才能设置,所以读者朋友可以先建立一个空的应用程序(如,Win32项目),然后进行下面的配置:

        在工具——选项对话框中删除我们在第一种方法中添加的那些包含文件和库文件路径,然后在菜单栏中选择:项目——属性 对话框,然后在配置属性的C/C++选项中找到附加包含目录,添加刚才在第一种方法中用到的那些包含文件路径信息,如下所示:

        然后,在配置属性的链接器选项中找到附加库目录中,添加刚才在第一种方法中用到的那些库文件路径,如下所示:

        这样我们就把路径信息配置到我们的工程文件中了,用这种方法配置之后,不管我们的这个工程放到哪台电脑,只需在那台电脑上配置一个OGRE_HOME环境变量即可,而不用像第一种方法那样,每次都需要重新设置哪些包含文件和库文件信息。但是这种方法也有一个缺点,就是当我们在做练习的时候,每次建议一个小的应用程序都需要为这个新的工程配置一下这些路径信息,也不是很方便,所以第二种方法适合用于那种多人合作,长久在一个工程下开发项目的情况,而不太适合于做一些小的练习项目的开发。

        因此,总得来说,这两种方法,读者朋友可以根据自己的情况选择,由于我们现在是初学者,所以不太可能做一些团队性质的开发,一般都只在自己电脑上运行这些程序,这样我们可以采用第一种配置方式;如果今后我们需要多人开发大的项目,那么可以采用第二种配置方法,这样在多人开发的时候使用起来比较方便。

其实到现在为止我们已经可以建立Ogre应用程序了,因为我们所需要的各个文件OgreSDK基本都已经为我们编译好了(通过源代码方式默认情况下是没有为我们编译的),这就是通过SDK方式构建的方便之处。但是如果我们想查看一下Ogre自带的一些经常的示例程序,我们还需要继续做一些工作,如下就是。

        第六步:到你的Ogre安装目录下,打开其中的OGRE.sln文件:

        分别在Debug和Release环境下对整个解决方案进行编译。

 

笔者注:

        在Debug和Release环境下对整个解决方案进行编译的过程可能会花费很长时间,时间的长短往往与您的计算机的性能相关。

 

        编译的结果会提示有一个错误,如下图所示:

        错误提示是在编译SampleBrowser时出错了。SampleBrowser,顾名思义,是一个实例浏览器,OGRE中的例子都是以插件的形式提供的,通过SampleBrowser对这些实例进行浏览。

        那么,我们要如何修正上面这个错误呢?解决方法如下: 右键单击SampleBrowse,依次选择:属性——配置属性——生成事件——预链接事件,清空“命令行”属性里的命令,如下图:

 

 

        然后重新编译并运行SampleBrowser(注意要在SampleBrowser上,点击右键,选择设为启动项目,),发现这次成功了,运行效果如下:

 

 

 

        我们可以选择一个实例,并且点击右侧的“Start Sample”可以对其进行查看,下图就是其中的一个实例,我们可以通过WASD键控制它的移动,通过空格键可以控制其跳跃;另外,点击右侧的“Exit”键可以退出这个程序:

 

 

笔者注:

       除了上文中提到的那一种解决SampleBrowser编译错误的方法,还有另一种方法。这种方法要用到一个软件Cmake。首先从网上下载Cmake,并将其安装到电脑上,笔者下载的是Cmake 2.8版本,并将其安装到了D:\Program Files\CMake 2.8目录下。然后同上面的方法一样,右键单击解决方案中的SampleBrowser,依次选择:属性——配置属性——生成事件——预链接事件,将命令行中的内容修改为:D:\Program Files\CMake 2.8\bin\cmake.exe" -E make_directory ../../lib/Debug if errorlevel 1 goto VCReportError,再次编译SampleBrowser并运行,发现错误已经解决了。

 

        好了,到目前为止,我们已经完成了第一种“SDK”法构建Ogre环境的全部步骤,可以看出,这种方法比较简单,配置过程也不是非常繁琐。不过,有得必有失,配置过程简单给读者带来的结果就是“读者只能简单的使用Ogre,而无法对Ogre的内部结构深入了解”,例如:利用“SDK”法构建Ogre环境,读者无法通过源码学习到Ogre中各个函数的具体含义、各个函数之间的关系、各个变量之间是如何协调工作的、Ogre大框架的编写思想、内部构造等等。如果读者想要深入的学习Ogre,笔者建议读者利用第二种通过“源码”构建Ogre环境的方法。

2.利用源码构建环境。

        第一步,我们还是要登录到Ogre官网,下载相应版本的Ogre源码资源包。

        同方法1“SDk”法一样,我们登录到Ogre官网: http://www.ogre3d.org/

 

        找到网页左侧的DOWNLOAD——Source标签,进行下载:

 

 

笔者注:

        这里与方法1“SDK”法有所不同,方法1中是点击了DOWNLOAD下的SDK选项,下载了对应版本的Ogre SDK(即OgreSDK_vc9_v1-7-2.exe),在方法2中,我们需要通过源码来构建Ogre环境,因此,我们要下载对应版本的Ogre源码包(即ogre_src_v1-7-2.exe)。 如果网站版本已经更新,大家可以到下面这个地址下载1.7.2版本:

https://sourceforge.net/projects/ogre/files/ogre/1.7/ogre_src_v1-7-2.exe/download

        第二步:双击我们刚下载的Ogre1.7.2 源码包:

        将其解压到D:\Ogre目录下。

        第三步:进行Ogre依赖库的添加。将解压后的文件夹“Dependencies”复制到Ogre安装的根目录:D:\Ogre\ogre_src_v1-7-2,如下图所示:

 

 

笔者注:Ogre依赖库的压缩文件也可以从Ogre官网下载得到,如果已经更新,也可以直接输入下面的地址下载:

https://sourceforge.net/projects/ogre/files/ogre-dependencies-vc%2B%2B/1.7/OgreDependencies_MSVC_20100501.zip/download

 

第四步:进入D:\Ogre\ogre_src_v1-7-2\Dependencies\src目录,我们可以看到文件夹中有4个.sln文件,分别对应VS2003、VS2005、VS2008和VS2010,如下图所示:

接下来,我们选择对应的OgreDependencies版本。在这里,因为笔者使用的是VS2008开发环境,所以我们选择“OgreDependencies.VS2008.sln”,双击将其打开。在菜单栏中选择生成——生成解决方案,或直接按快捷键F7,这里有一点需要注意,读者应该分别在debug和release两种模式下对整个解决方案进行生成,以编译出Ogre依赖库的debug和release,如下图所示:

        待所有的编译(debug和release两种模式)都结束后,VS会提示全部的14个都已经编译成功,如下图所示:

 

 

        第五步:设置系统环境变量。

        在这里,设置环境变量的方法与“SDK”法中设置环境变量的方法类似,唯一的不同点就是:应该将环境变量“OGRE_HOME”的变量值设置为Ogre“源码包”的安装根目录:D:\Ogre\ogre_src_v1-7-2,而不是“SDK”法中Ogre SDK的安装目录:D:\Ogre\OgreSDK_vc9_v1-7-2,这里读者千万要注意。

        第六步:将Ogre环境配置所需要的包含文件和库文件添加到VS2008中。

        这里和前面通过SDK方法配置一样,可以通过“一劳永逸”法和“灵活运用”法,进行配置,这里我们只介绍“一劳永逸”法,因为这两种方法和前面的配置方式基本一样,所以这里就不再重复。

        “一劳永逸”法

        打开VS2008,依次点击菜单栏中的工具——选项,在弹出的对话框中左侧,选择项目与解决方案下的VC++目录,在右侧上方选择“包含文件”,然后将Ogre环境需要的包含文件路径添加到其中:

        (1)C:\Program Files\Microsoft DirectXSDK (June 2010)\Include

        (默认情况下安装DirectX时已经设置好了,一般情况下不需我们设置)

        (2)$(OGRE_HOME)\OgreMain\include

        (3)$(OGRE_HOME)\include

        (4)$(OGRE_HOME)\Dependencies\include

        (5)$(OGRE_HOME)\Samples\Common\include

        在添加完“包含文件”之后,同理,我们还要选择“库文件”,并将如下的目录添加到“库文件”中:

       (1)C:\Program Files\Microsoft DirectXSDK (June 2010)\Lib\x86

       (默认情况下安装DirectX时已经设置好了,一般情况下不需我们设置)

        (2)$(OGRE_HOME)\lib\debug

        (3)$(OGRE_HOME)\Dependencies\lib\debug

        (4)$(OGRE_HOME)\bin\debug

         如果想编译Release版本则需要添加以下路径:

       (2)$(OGRE_HOME)\lib\ release

       (3)$(OGRE_HOME)\Dependencies\lib\ release

       (4)$(OGRE_HOME)\bin\release

 

        第七步:在第四步全部编译完成之后,在网上下载cmake,并对其进行安装。在此笔者使用的是cmake-2.8.2-win32-x86版本,如下图:

        安装完成后,将其打开,如下所示界面,在"Whereis the source code"和"Where to build thebinaries"中分别设置为Ogre的安装根目录:D:/Ogre/ogre_src_v1-7-2。

        接下来,我们要点击“configure”按钮,在弹出的对话框中选择自己使用的VS的版本,如下图所示:

        因为笔者使用的是VS 2008,所以在此笔者选择了Visual Studio 9 2008。选择好后,点击“Finish”按钮。

点击“Finish”按钮之后,如果Generate按钮为“灰色”,不能点击,就再点击一下Configure按钮,如下图所示:

        在此点击一下Configure按钮后,发现Generate按钮可以点击了,如下图所示:

 

 

        点击Generate按钮之后,当提示GenerateDone后,说明cmake已经配置成功,如下图所示:

        接下来,在Ogre安装根目录下(D:\Ogre\ogre_src_v1-7-2)会生成一个OGRE.sln文件,如下所示:

 

 

        然后,打开OGRE.sln,分别在debug和release模式下编译整个解决方案,编译成功之后,会提示成功47个,如下图所示:

 

 

        接下来,在解决方案一栏找到SampleBrowser,点击右键,选择设为启动项目,然后点击Ctrl+F5(或者点击菜单栏---调试----开始调试)运行程序,启动后界面如下,在Rendering Subsystem一栏选择OpenGL或者Directx,启动,下面的“RenderingSystem Options”中的选项读者可以自行设置(例如:Full Screen可以设置Ogre窗口是否全屏显示):

 

        点击OK,我们可以看到如下的界面,同“SDK”法一样,我们可以在debug和release模式下分别查看其中的实例,这表明我们已经完成了从“源码”构建Ogre配置环境。

        实例的运行效果如下图所示:

 

 

 

 

笔者注:

        读了上面的文章,可能有的读者会有疑问,上文中的Cmake是一个什么样的软件呢?它的作用又是什么呢?Cmake是由一个独立开源软件小组 Kitware开发 的产品,以 BSD 授权协议发布。CMake的主要作用是,根据需要的编译器平台上,生成相应平台下的源码文件。由于编译器平台有很多种,包括Windows平台下的VS编译环境,在Linux平台下的make编译环境,按照传统的方式是:要在项目主目录下分别放置VS编译环境所需的sln文件和Linux平台下编译环境所需的makefile两个目录,然后让不同需求的用户到相应的目录找到自己所需要的工程文件,这显然不是一个高效的方法。不过,Cmake可以有效的缓解这种不足,有了CMake以后,就不再需要这两个目录了,只要有一个CMakeLists.txt文件,通过它就可以自动生成适用于不同编译环境下的工程文件了。例如:如果用户是在VS2008编译环境下开发软件项目,那么通过设置,CMake就可以在源代码目录下生成适用于VS2008的sln文件。

        CMake 的工作原理是:在运行Cmake的时候,Cmake会自动寻找项目根目录下的一个名为“CMakeLists.txt”的文件:

        然后自动根据文件里面的内容和读者在Cmake中的设置生成适用于读者所需要的开发平台下的工程文件。

        在本书中,通过“源码”构建Ogre环境的方法中,就曾经对Cmake进行过设置,读者可以返回去再去阅读一遍,相信会对Cmake和Ogre的环境配置有更深层次的了解。

 

 

 

 

PS:很久以前就打算把学习Ogre中遇到的知识分享给大家(虽然只是一些皮毛),但是说来惭愧,一直很懒,直到最近才抽出点时间写一些自己的理解(Ogre入门级的东西),所以难免会有很多不足之处,分享是一种快乐,同时也希望和大家多多交流!

(由于在Word中写好的东西发布到CSDN页面需要重新排版(特别是有很多图片时),所以以后更新进度可能会比较慢,同时每章节发布的时间可能不一样(比如说我首选发布的是第二章,其实第一章就是介绍下Ogre的前世今生神马的,相信读者早就了解过~~~),但是我会尽量做到不影响大家阅读,还望大家谅解。)


 上述内容很多引用了网上现有的翻译或者内容,在此一并谢过(个人感觉自己有些地方写得或者翻译的不好),还望见谅,转载请注明此项!

 

转载于:https://www.cnblogs.com/zhidianhcuan/p/4145847.html

  • 0
    点赞
  • 0
    收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:编程工作室 设计师:CSDN官方博客 返回首页
评论
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值