Ogre场景结构体系中的重要函数

来源:互联网 发布:学会plc编程工资高吗 编辑:程序博客网 时间:2024/06/15 21:07

Ogre场景是一个3D程序的实质性的内容,如果3D物体以及各种光被混乱堆砌在场景里面,那么场景就是很垃圾的了,场景需要有序的组织,这是任何一个3D殷勤都必须解决的问题。

Ogre为了解决场景管理的问题提出了几个重要的概念并将它们实现为引擎中的类:

Entity:场景元素,Mesh(模型)在场景中的实例

Light:场景元素,现实世界的光在场景中的实例

Camera:场景元素,现实世界的观察者在场景中的实例

SceneNode:抽象的场景管理单元

        Ogre的思想:将现实世界中的场景划分成抽象的不同空间,区域中还可以划分成不同的小空间,每个空间由一个SceneNode对象来管理,SceneNode将处理移动、旋转和缩放等于空间相关的行为。在每个SceneNode上可以关节各种场景元素(如:EntityLightCamera),场景元素本身并不负责与空间位置相关的行为,全部交给SceneNode来做(LightCamera类也保存自己的位置,但很多时候也都挂接到SceneNode上来处理)Ogre将大量的SceneNode按照空间的划分层次组织成树状结构,从而完成对整个场景的有序组织

Entity类:

1) VoidsetMaterialNameconst String&name

参数为材质脚本文件

2) 我们几乎不在程序中直接创建一个Entity,对场景Entity的创建和管理一般是由SceneManager来完成,所以我们都通过调用SceneManagerCreateEntity函数来创建Entity

SceneNode

1) SceneNode*createChild(constVector3&translate=Vector3::ZEROconst Quaternion&rotate=Quaternion::IDENTITY)

从当前节点对象创建子节点。第一个参数是该子节点的名称,其余参数是子节点相对于当前节点的位移和旋转量

2) SceneNode*createChild(const String &name,const Vector3&translate=Vector3::ZERO,constQuaternion&rotate=Quaternion)

3) SceneNode*getChild(unsigned short index) const;

按照索引号获取子节点

4) SceneNode*getChild(const String &name) const

按照名称获取子节点

5) SceneNode*removeChild(unsigned short index);

脱钩指定索引号的节点

6) SceneNode*removeChild(const String &name)

脱钩指定名称的节点

7) VoidattachObject(MovableObject *obj)

在当前节点下挂接MovableObjectMovableObjectEntityLightCamera类的基类。

8) VoidattachLight(Light *l)

在当前节点下挂接摄像机,在内部委托attachObject完成

9) VoidattachCamera(camera *ent)

在当前节点下挂接摄像机,在内部委托attachObject完成

10)             MovableObject*detachObjectunsigned short index

脱钩指定索引的MovableObject

11)             MovableObject*detachObjectconst String&name

 

 

SceneManager类:

场景管理类,是场景管理的核心类

SceneManager是内部保存std::map类型的CameraListLightListEntityListSceneNodeList,并提供各种方法对它们进行管理和维护。SceneNode自身的设计使SceneNodeList实际上是一个树状结构。在每个SceneNode中引用CameraListLightListEntityList中的元素实现了场景元素在SceneNode上的挂接。SceneManager类还直接保存场景节点树的根节点指针以提供该树的访问入口。

缺省构造函数

1) SceneManager();

缺省构造函数

virtual ~SceneManager();

缺省析构函数

2) 摄像机相关函数

Virtual Camera *createCameraconst String&name

Virtual Camera *getCamera (const String&name)

Virtual void removeCamera(Camera *cam)

Virtual void removeCamera(const String&name)

Virtual void removeAllCamera(void)

3)  光相关函数

   Virtual Light *createLight(const String&name)

   Virtual Light *getLight(const String *name)

   Virtual void removeLight(const String *name)

   Virtual void removeLight(Light *lignt)

   Virtual void removeAllLights(void)

4) 材质相关函数

   Virtual Material *createMaterialconst String&name

返回一个指向缺省材质设定的指针,用这个指针可以改变材质的指定

缺省设定如下:

       -ambient=ColourValue::White

       -diffuse=ColourValue::White

       -specular=ColourValue::Black

       -emmissive=ColourValue::Black

       -shininess=0

       -No texture Layers(& hence no textures)

       -SourceBlendFactor=SBF_ONE

       -DestBlendFactor=SBF_ZEROno blend,replace with newcolour

       -Depth buffer checking on

       -Depth buffer writing on

       -Depth buffer comparison function=CMPF_LESS_WEQUAL

       -culling mode=CULL_CLOCKWISE

       -Ambinent Lighting=ColourValue(0.5,0.5,0.5)(mid_grey)

       -Dynamic Lighting Enabled

       -Gourad shading mode

       -Bilinear texture filering

Virtual Material*getDefaultMaterialSettings(void)

Virtual void addMaterial(const Material&mat)

Virtual Matetial *getMaterial(const String&name)

Virtual Material *getMaterial(inthandle)

5)  场景节点相关函数

   Virtual SceneNode *createSceneNode(void)

   Virtual SceneNode *createSceneNode(const String&name);

   Vritual void destorySceneNode(const String&name);

Virtual SceneNode *getRootSceneNode(void)const

取得根节点,在整个场景节点中只有一个根节点

Virtual SceneNode *getSceneNode(const String&name) const

6)  实体相关函数

   Virtual Entity *createEntityconst String &entityName,constString &meshName);

   Mesh创建一个实体

    EnumPreFab Type{

           PT_PLANE

   };

Prefab Type是一个枚举,提供预制的shape,不需要模型

Virtual Entity *createEntity(const String&entityName ,PrefabType ptype);

Virtual Entity *getEntity(cosnt String&name);

Virtual void removeEntityEntity *ent

销毁实体,注意实体必须没有被SceneNodeattach,如果你不确定是否还有被实体被attach,使用SceneManager::clearScene()

Virtual void removeEntity(const String&name)

Virtual void removeAllEntities(void)

Virtual void clearScene(void)

7)环境相关

   a.  void setAmbientLight(ColourValuecolour)

       设定环境光,缺省的环境光是ColourValue::Black

       ColourValuegetAmbientLight(void)

    b.virtual void setWorldGeometry(const String&filename)

       设定世界坐标系

    c.virtual ViewPoint getSuggestedViewpoint(boolrandom=false)

   SceneManager处取得一个推荐的viewpoint,通常这个方法返回原点,除非通过SceneManager::setgeometry设定了坐标系或者世界坐标系推荐了起始点。如果有多于一个的推荐点,将返回第一个,如果参数random为真,将随机的返回一个。

    d.virtual bool setOption(const String &strKey,constvoid* pValue){return false}

       virtual bool getOption(const String &strKey ,void*pDestValue){return false};

       SceneManager设定一个特殊实现的选项

   evirtual bool hasOption(constString &strKey){return false}

       确认SceneManager是否有一个特殊的实现选项

f. virtual bool getOption Values(const String&strKey,std::list<SDDataChunk>&refValueList){returnfalse}

g. virtual boolgetOpeionKeys(std::list<String>&refKeys){returnfalse;}

h. virtual void setSkyPlane(      一个天空面

       bool enable ,

       vonst Plane *plane,

       const String &materialName.

Real scale=1000.

       Real tiling =10,bool drawFirst=true,Real bow=0);

i.      Enables/Disables

Virtual void setSkyBox(一个天空盒

bool enable,

    cosnt String &materialNmae,

    Real distance=5000,

    Bool drawFirst=true;

    Const quaternion&orientation=Quaternion::IDENTITY);

 

j.  Enables/Disables一个天空穹顶

       virtual void setSkyDome

               bool enable,

               const String &materialName,

               Real curvanture=10,

               Real tiling=8,Real distance=4000,booldrawFirst=true,

               Const Quaternion&orientation=Quaternion::IDENTITY);

k. 雾相关参数

    voidsetFog(

               FogMode mode=FOG_NONE,

               ColourValue colour=ColourValue::White,

               Real expDensity=0.001,

               Real linearStart=0.0,

               Real linearEnd=1.0);

   Virtual FogMode getFogMode(void)const

   Virtual cosnt ColourValue&getFogColour(void)const

   Virtual Real getFogStart(void)cosnt;

       Virtual Real getFogEnd(void)const ;

       Virtual Real getFogDensity(void )const;

l. 公告板相关函数

   virtual BillboardSet *createBillboardSetconst String &name,unsigned intpoolsize=20;

   virtual BillboardSet *getBillboardSet(const String&name);

   virtual void removeBillboardset(BillboardSet *set);

   virtual void removeBillboardSet(cosnt String&name);

m.告知SceneManager是否渲染该节点

   virtual void setDisplaySceneNodes(bool display);

n.动画相关参数

   virtual Animation *createAnimation(const String&name,Real Length);

   virtual Animation *getAnimation(const String&name)cosnt;

   virtual void destroyAnimation(const String&name)

   virtual void destroyAllAnimations(void)

   virtual AnimationState *createAnimationStae(const String& animName)

   virtual AnimationState *getAnimationState(const String&animName)

       virtual void destroyAnimationState(const String&name)

       virtual void destroyAllAnimationState(void);

  要使得物体运动起来就必须在渲染过程中更改物体的位置和旋转量,因为OGRE中有FrameListener,其中的frameStarted方法会在每一帧渲染之前被调用。OGRE应用框架中的ExampleFrameListener已经实现了,只需要在frameStarted方法中扩充控制物体运动就可以了。

   o. 手动渲染方法,高级用户使用

       virtual void manualRender

               RenderOperation *rend,Material *mat,Viewport *vp,

               Cosnt Matrix4 &worldMatrix,const Matrix4*viewMatrix,const Matrix 4 &projMatrix);

 

   p.注册新的渲染队列监听器,当渲染队列被处理时将被更新

        virtual void addRenderueueListenerRenderQueueListener*newListener);

        virtual void removeRenderQueueListener(RenderQueueListener*delListener);