2012-01-11 7 views
0

プレイヤーを待たせることなく、場所や時間に基づいてオブジェクトを動的にロードしたり解放したりしたい。Ogre3Dフレームワークで動的オブジェクトを追加/削除する必要がありますか?

この小さなデモは、芝生の平面で1枚のシンバッドモデルから始まり、500フレーム後にビーチストーンの平面に切り替わり、もう1枚のシンバッドが追加されます。

ExampleApplication.h以降で、IはframeEndedで()関数に動的なコードを置く:

 
     bool frameEnded(const FrameEvent& evt) { 
      gpf->frameNUM++; //gpf is pointer to object class gstate 
      if (gpf->loadSTATE==0) 
       if (gpf->frameNUM>500) { 
        gpf->loadSTATE=1; 
        gpf->ent1->setMaterialName("Examples/BeachStones"); 
        gpf->ent2=msm->createEntity("MyEntity2","sinbad.mesh"); //msm is mSceneMgr 
        gpf->node2=msm->createSceneNode("Node2"); 
        msm->getRootSceneNode()->addChild(gpf->node2); 
        gpf->node2->setPosition(10,0,0); 
        gpf->node2->attachObject(gpf->ent2); 
        } 
      updateStats(); 
      return true; 
      }  

全体main.cpp

<pre> 
#include "Ogre.h" 
class gstate { 
    public: 
    gstate() { loadSTATE=0; frameNUM=0; ent1=NULL; ent2=NULL; node2=NULL; } 
    Ogre::Entity *ent1, *ent2; 
    Ogre::SceneNode *node2; 
    int loadSTATE,frameNUM; 
}; 
#include "ExampleApplication.h" 
class Test4 : public ExampleApplication { 
    public: 
     void createScene() { 
      gp=new gstate(); 
      Ogre::Plane plane(Vector3::UNIT_Y, -10); 
       Ogre::MeshManager::getSingleton().createPlane("plane", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,plane,1500,1500,200,200,true,1,5,5,Vector3::UNIT_Z); 
      gp->ent1=mSceneMgr->createEntity("GrassPlane","plane"); 
      mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(gp->ent1); 
      gp->ent1->setMaterialName("Examples/GrassFloor"); 
      Ogre::Entity *ent=mSceneMgr->createEntity("MyEntity","sinbad.mesh"); 
      mSceneMgr->getRootSceneNode()->attachObject(ent); 
     } 
    }; 
Test4 app; 
int main(void) { 
    app.go(); 
    return 0; 
    } 

ExampleApp.hの残りとExampleFrameListener.h変更は例外で、ExampleApを許可するpを使用してgstateクラスを介してフレームリスナとデータを共有します。アプリケーションオブジェクトをフレームリスナーに公開するには、より洗練された方法が必要ですが、それは別の日のよい質問です。

質問:

  1. frameEndedで()は、シーンに動的な追加を置くのに良い場所ですか?何が良いでしょうか?

  2. どのように動的に作成されたメッシュ、エンティティ、およびノー​​ドを削除しますか?

  3. 別のスレッドに入れても安全なオーガ機能はありますか?手動オブジェクト/位置/ textureCoord/convertToMesh? createEntity/createSceneNodeはどうですか?

答えて

0

1)への回答:シーンマネージャを使用すると、エンティティとノードを破壊する方法があります。

2)わかりませんが、gutfeelingは:これらのどれもありません。

シーン変更のようなものでは、フレームリスナーに対してアドバイスしますが、Root-> renderOneFrame()を使用して独自のレンダリングループを実装します(おそらく何か似ています。 )

関連する問題