标签: ogre场景ogresceneogreentityit |
分类: 游戏编程 |
Ogre场景是一个3D程序的实质性的内容,如果3D物体以及各种光被混乱堆砌在场景里面,那么场景就是很垃圾的了,场景需要有序的组织,这是任何一个3D殷勤都必须解决的问题。
Ogre为了解决场景管理的问题提出了几个重要的概念并将它们实现为引擎中的类:
Entity:场景元素,Mesh(模型)在场景中的实例
Light:场景元素,现实世界的光在场景中的实例
Camera:场景元素,现实世界的观察者在场景中的实例
SceneNode:抽象的场景管理单元
Ogre的思想:将现实世界中的场景划分成抽象的不同空间,区域中还可以划分成不同的小空间,每个空间由一个SceneNode对象来管理,SceneNode将处理移动、旋转和缩放等于空间相关的行为。在每个SceneNode上可以关节各种场景元素(如:Entity、Light、Camera等),场景元素本身并不负责与空间位置相关的行为,全部交给SceneNode来做(Light和Camera类也保存自己的位置,但很多时候也都挂接到SceneNode上来处理)Ogre将大量的SceneNode按照空间的划分层次组织成树状结构,从而完成对整个场景的有序组织
1) Void setMaterialName(const String &name)
参数为材质脚本文件
2) 我们几乎不在程序中直接创建一个Entity,对场景Entity的创建和管理一般是由SceneManager来完成,所以我们都通过调用SceneManager的CreateEntity函数来创建Entity
1) SceneNode *createChild(const Vector3&translate=Vector3::ZERO,const Quaternion &rotate=Quaternion::IDENTITY)
从当前节点对象创建子节点。第一个参数是该子节点的名称,其余参数是子节点相对于当前节点的位移和旋转量
2) SceneNode *createChild(const String &name,const Vector3 &translate=Vector3::ZERO,const Quaternion&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) Void attachObject(MovableObject *obj)
在当前节点下挂接MovableObject。MovableObject是Entity、Light、Camera类的基类。
8) Void attachLight(Light *l)
在当前节点下挂接摄像机,在内部委托attachObject完成
9) Void attachCamera(camera *ent)
在当前节点下挂接摄像机,在内部委托attachObject完成
10) MovableObject *detachObject(unsigned short index)
脱钩指定索引的MovableObject
11) MovableObject *detachObject(const String &name)
场景管理类,是场景管理的核心类
SceneManager是内部保存std::map类型的CameraList、LightList、EntityList和SceneNodeList,并提供各种方法对它们进行管理和维护。SceneNode自身的设计使SceneNodeList实际上是一个树状结构。在每个SceneNode中引用CameraList、LightList、EntityList中的元素实现了场景元素在SceneNode上的挂接。SceneManager类还直接保存场景节点树的根节点指针以提供该树的访问入口。
缺省构造函数
1) SceneManager();
缺省构造函数
virtual ~SceneManager();
缺省析构函数
2) 摄像机相关函数
Virtual Camera *createCamera(const 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 *createMaterial(const 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_ZERO(no blend,replace with new colour)
-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(int handle)
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 *createEntity(const String &entityName,const String &meshName);
用Mesh创建一个实体
Enum PreFab Type{
PT_PLANE
};
Prefab Type是一个枚举,提供预制的shape,不需要模型
Virtual Entity *createEntity(const String &entityName ,PrefabType ptype);
Virtual Entity *getEntity(cosnt String &name);
Virtual void removeEntity(Entity *ent)
销毁实体,注意实体必须没有被SceneNode所attach,如果你不确定是否还有被实体被attach,使用SceneManager::clearScene()
Virtual void removeEntity(const String &name)
Virtual void removeAllEntities(void)
Virtual void clearScene(void)
7) 环境相关
a. void setAmbientLight(ColourValue colour)
设定环境光,缺省的环境光是ColourValue::Black
ColourValue getAmbientLight(void)
b. virtual void setWorldGeometry(const String &filename)
设定世界坐标系
c. virtual ViewPoint getSuggestedViewpoint(bool random=false)
从SceneManager处取得一个推荐的viewpoint,通常这个方法返回原点,除非通过SceneManager::setgeometry设定了坐标系或者世界坐标系推荐了起始点。如果有多于一个的推荐点,将返回第一个,如果参数random为真,将随机的返回一个。
d. virtual bool setOption(const String &strKey,const void* pValue){return false}
virtual bool getOption(const String &strKey ,void *pDestValue){return false};
为SceneManager设定一个特殊实现的选项
e. virtual bool hasOption(const String &strKey){return false}
确认SceneManager是否有一个特殊的实现选项
f. virtual bool getOption Values(const String &strKey,std::list<SDDataChunk>&refValueList){return false}
g. virtual bool getOpeionKeys(std::list<String>&refKeys){return false;}
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. 雾相关参数
void setFog(
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 *createBillboardSet(const String &name,unsigned int poolsize=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 addRenderueueListener(RenderQueueListener *newListener);
virtual void removeRenderQueueListener(RenderQueueListener *delListener);