在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

<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通过gstate类与Frame Listener共享数据的更改之外, ExampleApp.hExampleFrameListener.h的其余部分未经改动。 必须有一种更优雅的方式将应用程序对象公开给框架监听器,但这对另一天来说是个好问题。

问题:

  • frameEnded()是动态添加到场景的好地方吗? 什么会更好?

  • 如何删除动态创建的网格,实体和节点?

  • 什么Ogre函数可以安全地放入单独的线程中? 手动对象/位置/ textureCoord / convertToMesh? 那么createEntity / createSceneNode呢?


  • 回答1):使用场景管理器,它具有销毁实体和节点的方法。

    2)我不知道,gutfeeling是:这些都不是。

    一般情况下,对于像场景改变这样的东西,我会建议不要使用框架监听器,而是使用Root-> renderOneFrame()来实现您自己的渲染循环(也许类似的东西,不知道我头顶的确切名称)

    链接地址: http://www.djcxy.com/p/17113.html

    上一篇: Where in the Ogre3D framework should I add / delete dynamic objects?

    下一篇: Ogre3D shows exception when starting program