2012-01-11 4 views
0

플레이어를 기다리지 않고 위치 나 시간을 기준으로 개체를 동적으로로드하고 해제하려고합니다.Ogre3D 프레임 워크에서 동적 객체를 추가/삭제해야합니까?

이 작은 데모는 초평면에서 하나의 신밧드 모델로 시작하여 500 프레임 후에 해변 돌의 비행기로 전환하고 신밧드를 한 개 더 추가합니다.

ExampleApplication.h을 시작으로, 나는 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 : ExampleApp.hExampleFrameListener.h

<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; 
    } 

나머지 변경되지 않는 한 ExampleAp를 허용합니다. p를 사용하여 gstate 클래스를 통해 프레임 수신기와 데이터를 공유합니다. 응용 프로그램 객체를 프레임 수신기에 표시하는 좀 더 우아한 방법이 있어야하지만 다른 날에는 좋은 질문입니다.

질문 :

  1. frameEnded() 장면에 동적 추가를 넣을 수있는 좋은 장소인가? 무엇이 더 좋을까요?

  2. 동적으로 생성 된 메쉬, 엔티티 및 노드를 삭제하는 방법은 무엇입니까?

  3. 별도의 스레드에 넣을 수있는 오우거 기능은 무엇입니까? 수동 개체/위치/textureCoord/convertToMesh? createEntity/createSceneNode는 어떻습니까?

답변

0

1)에 대한 답변 : 장면 관리자를 사용하면 엔티티와 노드를 삭제하는 방법이 있습니다.

2) 잘 모르겠다. gutfeeling은 다음 중 하나입니다.

일반적으로 장면 변경과 같은 것들에 대해서는 프레임 수신기에 대해 조언하지만 Root-> renderOneFrame()을 사용하여 렌더링 루프를 구현하십시오 (어쩌면 비슷한 것일 수도 있고, 머리 위로 정확한 이름을 알지 못할 수도 있습니다).)