在场景中,通常所有物体都是被放在场景节点上的,每次渲染时都会根据物体的移动来更新维护场景树,这样是花费极大的效率的,所以,如果某些物体不必移动,那么可以不把他放在场景树上,这就是StaticObject,将你不必移动物体(如很多山、树)等做成静态物体,会大大提高效率,使用方法很简单:
首先用场景管理器创建一个静态物体
StaticGeometry* sg=smgr->createStaticGeometry("static ge");
然后在这个静态物体里放入你的entity,可以放很多
sg->addEntity(ent_l,Ogre::Vector3(0,0,0));
最后要调用
sg->build()就可以了
投影贴图
所谓投影贴图,可以想象成电影放映机或是投影仪,贴图就是胶片,头道的物体就是屏幕,投影效果会随着投射物和被投射表面的距离而变化,在ogre中的实现方式是这样的:
1先建立一个Frustum对象,代表这个投影仪,然后把它绑定在场景的一个节点上
Frustum* fru=new Frustum();
SceneNode* frunode=smgr->getRootSceneNode()->createChildSceneNode("fru node");
frunode->attachObject(fru);
frunode->setPosition(0,0,500);2、设置接受物体的材质,使他接受这个投射纹理并与其表面纹理混合
Pass* pass=mat->getTechnique(0)->createPass();//创建一个新通道
pass->setSceneBlending(SBT_TRANSPARENT_ALPHA);//设置于上个通道的alpha混合
pass->setLightingEnabled(false);
TextureUnitState *texState = pass->createTextureUnitState("decal.png");//在这个通道设置一个纹理
texState->setProjectiveTexturing(true, fru);//设置这个纹理为fru的投射纹理
texState->setTextureAddressingMode(TextureUnitState::TAM_CLAMP);
texState->setTextureFiltering(FO_POINT, FO_LINEAR, FO_NONE);//这个设置很重要