ImageVerifierCode 换一换
格式:DOCX , 页数:37 ,大小:600.01KB ,
资源ID:8111733      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8111733.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(OGRE的基本五教程.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

OGRE的基本五教程.docx

1、OGRE的基本五教程-2007-03-31|Ogre的基本教程(一)最近在公司弄的引擎基础教程1 SceneNode, Entity, SceneManager场景节点,实体,场景管理器一个空白的应用程序#include ExampleApplication.hclass TutorialApplication: public ExampleApplicationprotected:public: TutorialApplication()TutorialApplication() protected:void createScene(void);#if OGRE_PLATFORM = OGR

2、E_PLATFORM_WIN32#define WIN32_LEAN_AND_MEAN#include windows.hINT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT )#elseint main(int argc, char *argv)#endifTutorialApplication app;try app.go(); catch( Exception& e ) #if OGRE_PLATFORM = OGRE_PLATFORM_WIN32 MessageBox( NULL, e.getFull

3、Description().c_str(), An exception has occured!, MB_OK | MB_ICONERROR | MB_TASKMODAL);#else fprintf(stderr, An exception has occured: %sn, e.getFullDescription().c_str();#endifreturn 0;引擎是如何工作的SceneManager(场景管理器) Basics所有显示的物体都是由SceneManager来管理的。当你把一个空间物体放入scene(场景)后 SceneManager会追踪他们的位置。当你创建摄象机(Ca

4、meras)来观察场景时,SceneManager也会跟踪他们。平面,广告牌,灯光也是一样 SceneManager有多种类型,有渲染地形的管理器,也有渲染BSP的 ,管理器的列表可以看这里 在教程里,我们还可以进一步了解它Entity(实体)BasicsEntity是一种可以在场景中渲染的对象.你可以认为Entity是由3D meshs(网格)表现的任何物体。机器人是一个Entity,鱼也是一个Entity,一个角色行走的地形将是一个非常大的Entity。但象灯光,广告牌,粒子系统,摄象机就不是Entity需要注释的一点是,引擎是把renderable objects(可渲染物体)和 他们的

5、位置方向分离的,这意味着你不能直接把一个Entity放到场景里,而是必须把Entity依附到一个SceneNode(场景节点)对象上,SceneNode包含了位置和方向信息SceneNode (场景节点)Basics前面已经提到,SceneNode保存了所有附在它上面的物体的位置和方向,当你创建了一个Entity后,在你把它附在一个SceneNode前是不会被显示出来的。同样的,SceneNode并不是显示在屏幕上的对象。只有你创建一个SceneNode并附上一个Entity或者其他对象时,才会实际的显示在屏幕上。 SceneNode上可以附加多个对象,比如一个角色走在屏幕中,你希望能产生一个

6、光在他周围。你的方法是先创建一个SceneNode ,然后给角色创建一个Entity并附到SceneNode上,然后你可以再创建灯光附在SceneNode上。SceneNode也必须附在你创建的整个层次节点的SceneNode上。在随后的教程里会有进一步的讲解。SceneNodes一个要注释的主要感念就是,它的位置是和父SceneNodes相关的,每个SceneManager都包含一个root node(根节点)来让其他SceneNodes附加你的第一个应用程序回到前面创建的代码,找到TutorialApplication:createScene 成员函数,我们只需要修改函数里的内容。第一件要

7、做的是给场景设置一个环境光,好让我们看到我们所做的我们调用setAmbientLight函数来指定我们需要的颜色,ColourValue结构为01的RGB值把这行加createScene里mSceneMgr-setAmbientLight( ColourValue( 1, 1, 1 ) );接下来我们需要创建一个Entity,我们用SceneManager的创建Entity的函数Entity *ent1 = mSceneMgr-createEntity( Robot, robot.mesh );接下来的几个问题,mSceneMgr从何而来 我们调用的函数参数又是什么?mSceneMgr包含了当

8、前的SceneManager对象(这个是由ExampleApplication类来实现的)createEntity的第一个参数是我们创建的Entity的名字。所有的Entity都必须有独一无二的名字。如果你试图创建有相同名字的两个Entity会出错。robot.mesh 参数是指你创建的Entity使用的网格。我们使用的mesh都由ExampleApplication类来预载现在我们已经创建了Entity,我们需要创建一个SceneNode来让它依附。因为每个SceneManager都有一个root SceneNode,我们要给这个node创建一个子节点SceneNode *node1 = m

9、SceneMgr-getRootSceneNode()-createChildSceneNode( RobotNode );getRootSceneNode获取当前SceneManager的根节点,createChildSceneNode里的参数为创建的SceneNode的名字,SceneNode不能使用相同的名字。最后我们需要把Entity附在SceneNode上,让robot可以被渲染出来node1-attachObject( ent1 );编译和运行你的程序,你可以看到一个机器人站在屏幕上Coordinates and Vectors(坐标和向量)在深入了解前,我们要讨论一下坐标和向量对

10、象,一些图形引擎使用X和Z轴来作为水平面Y轴作为垂直轴。当你看你的显示器时,X轴会从左向右穿过显示器,右边为X的正方向Y轴是从显示器的底部到顶部,顶为Y轴的正方向,Z轴是从屏幕里面穿出来,屏幕外为Z的正方向(右手坐标系)注意我们的Robot为什么面向X正方向?这是网格自己的属性,是有意这么设计的。引擎并没有假定你模型的朝向。你装载的每个Mesh都可能有它超向的starting direction(开始方向)引擎使用Vector(向量)类来表现位置和方向(没有 点 类),向量定义为2(Vector2),3(Vector3),4(Vector4)维向量,Vector3是最常用的。Adding an

11、other Object(增加另一个对象)现在你明白坐标系统是如何工作的了,我们回到代码里,我们写的3行代码里,并没有指定机器人所想显示的位置。引擎的大部分函数都有它的默认参数比如 SceneNode:createChildSceneNode 函数有3个参数SceneNode的名字,SceneNode的位置,SceneNode朝向的旋转方向,位置你也看到了,用的是坐标coordinates (0, 0, 0).我们创建另一个SceneNode,这次我们指定一个起始位置Entity *ent2 = mSceneMgr-createEntity( Robot2, robot.mesh );Scen

12、eNode *node2 = mSceneMgr-getRootSceneNode()-createChildSceneNode( RobotNode2, Vector3( 50, 0, 0 ) );node2-attachObject( ent2 );看上去和前面的代码很相似,但有2点不同,首先SceneNode和Entity的名字有些不同其次,在开始位置上,我们指定了距离场景根节点X方向50个单位(所有的SceneNode位置都是和他父亲相关的),编译程序,我们有了两个并排的机器人进一步了解EntityEntity类是非常广泛的,我不可能在这里覆盖到它的各部分,但足够你可以起步了这里指出一

13、些常用的函数第一个是Entity:setVisible 和 Entity:isVisible. 你可以设置一个Entity是否可见通过调用这个函数。如果你需要隐藏一个Entity或者稍后再显示它,那么可以调用这函数,而不是销毁掉这个Entity然后稍后再创建它。任何实体只有一个mesh和texture的拷贝在内存中。所以不需要自己进行管理, getName 可以获得Entity的名字,getParentSceneNode 获得Entity所依附的SceneNode进一步了解SceneNodeSceneNode类是非常复杂的,SceneNode可以做的事很多,下面列出一些最常用的你可以调用get

14、Position and setPosition 来设置和获得一个SceneNode的位置,通过调用translate 让他相对于当前位置移动,SceneNode不光能设置位置,还有对象的缩放和旋转,调用 scale 来缩放,调用yaw, roll, 和 pitch 函数来旋转。使用resetOrientation来重置对象的旋转,也可以使用setOrientation, getOrientation, 和 rotate来实现更高级的旋转。四元数会在后面的教程里提出,你已经看到了attachObject函数,同样可以用来操作附加在SceneNode上节点的相关函数有numAttachedObj

15、ects, getAttachedObject (有多个版本)detachObject(也有多个版本)detachAllObjects。可以处理所有的parent SceneNode和child SceneNode。因为所有的位置和平移都是相对于父SceneNode的,所以我们可以很简单的让两个SceneNode一起移动。我们程序当前的代码Entity *ent1 = mSceneMgr-createEntity( Robot, robot.mesh );SceneNode *node1 = mSceneMgr-getRootSceneNode()-createChildSceneNode(

16、RobotNode ); node1-attachObject( ent1 );Entity *ent2 = mSceneMgr-createEntity( Robot2, robot.mesh );SceneNode *node2 = mSceneMgr-getRootSceneNode()-createChildSceneNode( RobotNode2, Vector3( 50, 0, 0 ) );node2-attachObject( ent2 );如果我们替换第6行程序SceneNode *node2 = mSceneMgr-getRootSceneNode()-createChil

17、dSceneNode( RobotNode2, Vector3( 50, 0, 0 ) );为SceneNode *node2 = node1-createChildSceneNode( RobotNode2, Vector3( 50, 0, 0 ) );然后我们让RobotNode2为RobotNode的一个子节点,移动node1时,node2也会跟着移动,但移动node2不会影响node1,例如下面的代码,我们只移动node2node2-translate( Vector3( 10, 0, 10 ) );下面的代码我们移动RobotNode,因为RobotNode2是子节点,所以也会移动n

18、ode1-translate( Vector3( 25, 0, 0 ) );然后,通过getSceneNode 和 getEntity 的方法就可以通过名字获得SceneManager里所有SceneNode和Entity,因此,你不需要保存你创建的SceneNode的所有指针。尝试去做现在,你基本掌握了Entities(实体), SceneNodes(场景节点),和SceneManager(场景管理器)。我建议从上面的代码开始,在场景里增加或去除Robots。然后清除掉createScene里的所有内容,然后运行下面各个代码段。Scale你可以通过调用SceneNodes的scale方法来缩

19、放网格,Entity *ent = mSceneMgr-createEntity( Robot, robot.mesh );SceneNode *node = mSceneMgr-getRootSceneNode()-createChildSceneNode( RobotNode );node-attachObject( ent );node-scale( .5, 1, 2 ); ent = mSceneMgr-createEntity( Robot2, robot.mesh );node = mSceneMgr-getRootSceneNode()-createChildSceneNode(

20、 RobotNode2, Vector3( 50, 0, 0 ) );node-attachObject( ent );node-scale( 1, 2, 1 );Rotations你可以旋转对象通过yaw,pitch,roll的方法来决定是按角度还是弧度来旋转,Pitch是绕X轴旋转,Yaw是绕Y轴旋转 Roll是绕Z轴旋转,使用你的右手做指引,拇指为轴,其他手指为正旋转方向。例如,Pitch(90),将你的拇指指向右,其他手指就为旋转的方向Entity *ent = mSceneMgr-createEntity( Robot, robot.mesh );SceneNode*node= mS

21、ceneMgr-getRootSceneNode()-createChildSceneNode( RobotNode, Vector3( -100, 0, 0 ) );node-attachObject( ent );node-yaw( Degree( -90 ) );ent = mSceneMgr-createEntity( Robot2, robot.mesh );node =mSceneMgr-getRootSceneNode()-createChildSceneNode( RobotNode2);node-attachObject( ent );node-pitch( Degree(

22、-90 ) );ent = mSceneMgr-createEntity( Robot3, robot.mesh );node = mSceneMgr-getRootSceneNode()-createChildSceneNode( RobotNode3, Vector3( 100, 0, 0 ) );node-attachObject( ent );node-roll( Degree( -90 ) );总结你可以基本了解SceneManager, SceneNode, Entity 类,你不必熟悉上面提供的所有函数,因为这只是最基本的对象,我们会使用很频繁,通过学习后面的教程,你可以进一步来

23、熟悉这些。2007-03-31|Ogre的基础教程(二)Beginner Tutorial 2: Cameras, Lights, and Shadows 摄象机,光和阴影介绍这个教程会向你介绍一些引擎里的结构,就好象之前学过的,这个教程主要讲解引擎里的光对象和如果使用它们来创建引擎。也包括了摄象机的基础知识通过这个教程,你可以慢慢加代码到你的工程,并看见到创建的结果开始在上一个教程,我们使用一个预先创建好的代码最起始点,我们将增加两个方法到我们的TutorialApplication类里:createViewport 和 createCamera 这两个函数已经定义在基类ExampleApp

24、lication里,在这个教程里我们来看他们怎么创建和使用Cameras and Viewports 创建工程,增加包含这个代码的的源文件: #include ExampleApplication.hclass TutorialApplication : public ExampleApplicationprotected:public: TutorialApplication() TutorialApplication() protected: virtual void createCamera(void) virtual void createViewports(void) void cr

25、eateScene(void) Entity *ent; Light *light; ;#if X3D_PLATFORM = PLATFORM_WIN32 | X3D_PLATFORM = X3D_PLATFORM_WIN32#define WIN32_LEAN_AND_MEAN#include windows.hINT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT )#elseint main(int argc, char *argv)#endif / Create application object T

26、utorialApplication app;try app.go(); catch( Exception& e ) #if X3D_PLATFORM = PLATFORM_WIN32 | X3D_PLATFORM = X3D_PLATFORM_WIN32 MessageBox( NULL, e.getFullDescription().c_str(), An exception has occured!, MB_OK | MB_ICONERROR | MB_TASKMODAL);#else fprintf(stderr, An exception has occured: %sn, e.ge

27、tFullDescription().c_str();#endif return 0;Camera引擎摄象机(Camera)Camera(摄象机)是我们创建来观察场景的,Camera的工作和SceneNode(场景节点)类似,Camera对象有setPosition,yaw,roll和pitch函数,你可以把它附加在SceneNode上。就象SceneNode一样,Camera的位置也和它的父亲相关。象移动和旋转,你都可以认为一个Camera一个SceneNode。这个引擎的Camera与你预想不同的一点是一次只能有一个Camera。就是说,我们不能为观察场景的一部分创建一个Camera,再创

28、建另一个Camera来观察场景的其他部分,然后在通过enabling或disabling Camera来显示我们想要的场景位置。但有一种替代的方法,创建一个SceneNode来作为camera holders。这个SceneNode可以简单的设置在场景的位置和指向你想看的方向。当要显示场景的一部分时,只需要Camera附加在合适的SceneNode,我们会再看到这个技术在FrameListener的教程里创建摄象机(Camera)我们将覆盖ExampleApplication里常用的创建Camera的默认方法找到 TutorialApplication:createCamera 的成员函数,我

29、们首先要做的是创建Camera因为Camera是依赖他们所在的SceneManager,我们使用SceneManager对象来创建他们增加下面这行代码来创建Camera: / create the camera mCamera = mSceneMgr-createCamera(PlayerCam);创建一个叫PlayerCam的Camera,我们可以使用SceneManger的getCamera函数,通过Camera的名字来获得Camera。下一件事将要设置Camera的位置和它的朝向,我们将空间对象放在原点附近,因此我们给Camera设置一个好的距离在+Z方向上,摄象机将朝向原点,把这个加在

30、上面代码的后面。 / set its position, direction mCamera-setPosition(Vector3(0,10,500); mCamera-lookAt(Vector3(0,0,0);lookAt函数是很灵活的,你可以将Camera朝向任何位置来代替yaw,rotate,和pitch,SceneNode也有这个函数,可以简单的设置Entity朝向任何方向在各种情况下。最后我们要设置 near clipping distance为5个单位,clipping distance指定一个Camera多近和多远以外的物体不再看到。设置near clipping distance可以让你看穿屏幕上的Entity当你非常接近它们时。当你距离一个物体很近时,它会充满整个屏幕,你只能看到它的很少一部分。你可以同样设置far clipping distance,这样引擎就不会渲染比这个值远的任何事物。它的主要作用是增加刷新率,如果你渲染远距离大数量物体到屏幕上。设置near c

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1