플레이어를 기다리지 않고 위치 나 시간을 기준으로 개체를 동적으로로드하고 해제하려고합니다.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.h
및 ExampleFrameListener.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 클래스를 통해 프레임 수신기와 데이터를 공유합니다. 응용 프로그램 객체를 프레임 수신기에 표시하는 좀 더 우아한 방법이 있어야하지만 다른 날에는 좋은 질문입니다.
질문 :
이 frameEnded() 장면에 동적 추가를 넣을 수있는 좋은 장소인가? 무엇이 더 좋을까요?
동적으로 생성 된 메쉬, 엔티티 및 노드를 삭제하는 방법은 무엇입니까?
별도의 스레드에 넣을 수있는 오우거 기능은 무엇입니까? 수동 개체/위치/textureCoord/convertToMesh? createEntity/createSceneNode는 어떻습니까?