美文网首页
Tutorial1: Animation

Tutorial1: Animation

作者: 吸霾少年 | 来源:发表于2018-07-26 20:49 被阅读0次
    #include <Ogre.h>
    #include <OgreApplicationContext.h>
    using namespace Ogre;
    class MyTestApp : public OgreBites::ApplicationContext, public OgreBites::InputListener
    {
    public:
        MyTestApp();
        void setup();
        bool keyPressed(const OgreBites::KeyboardEvent& evt);
    private:
        bool frameRenderingQueued(const Ogre::FrameEvent& evt);
        Ogre::AnimationState* mAnimationState;
    };
    
    //! [constructor]
    MyTestApp::MyTestApp() : OgreBites::ApplicationContext("OgreTutorialApp")
    {
    }
    //! [constructor]
    
    //! [key_handler]
    bool MyTestApp::keyPressed(const OgreBites::KeyboardEvent& evt)
    {
        if (evt.keysym.sym == OgreBites::SDLK_ESCAPE)
        {
            getRoot()->queueEndRendering();
        }
        return true;
    }
    //! [key_handler]
    
    //! [setup]
    void MyTestApp::setup(void)
    {
        // do not forget to call the base first
        OgreBites::ApplicationContext::setup();
        
        // register for input events
        addInputListener(this);
    
        // get a pointer to the already created root
        Ogre::Root* root = getRoot();
        Ogre::SceneManager* scnMgr = root->createSceneManager();
    
        // register our scene with the RTSS
        Ogre::RTShader::ShaderGenerator* shadergen = Ogre::RTShader::ShaderGenerator::getSingletonPtr();
        shadergen->addSceneManager(scnMgr);
    
        // set shadow properties
        // scnMgr->setShadowTechnique(SHADOWTYPE_TEXTURE_MODULATIVE);
        // scnMgr->setShadowColour(ColourValue(0.5, 0.5, 0.5));
        // scnMgr->setShadowTextureSize(1024);
        // scnMgr->setShadowTextureCount(1);
    
        //! [lightingsset]
        scnMgr->setAmbientLight(ColourValue(0, 0, 0));
        scnMgr->setShadowTechnique(ShadowTechnique::SHADOWTYPE_STENCIL_MODULATIVE);
    
        // without light we would just get a black screen    
        Ogre::Light* light = scnMgr->createLight("MainLight");
        Ogre::SceneNode* lightNode = scnMgr->getRootSceneNode()->createChildSceneNode();
        lightNode->setPosition(10, 20, 15);
        lightNode->attachObject(light);
    
        // also need to tell where we are
        Ogre::SceneNode* camNode = scnMgr->getRootSceneNode()->createChildSceneNode();
        //camNode->setPosition(0, 0, 15);
        //camNode->lookAt(Ogre::Vector3(0, 0, -1), Ogre::Node::TS_PARENT);
        camNode->setPosition(0, 8, 30);
        camNode->lookAt(Vector3(0, 0, 0), Node::TransformSpace::TS_WORLD);
    
        // create the camera
        Ogre::Camera* cam = scnMgr->createCamera("myCam");
        cam->setNearClipDistance(5); // specific to this sample
        //cam->setAutoAspectRatio(true);
        camNode->attachObject(cam);
    
        // and tell it to render into the main window
        //getRenderWindow()->addViewport(cam);
    
          //! [addviewport]
        Viewport* vp = getRenderWindow()->addViewport(cam);
        //! [addviewport]
    
        //! [viewportback]
        vp->setBackgroundColour(ColourValue(0, 0, 0));
        //! [viewportback]
    
        //! [cameraratio]
        cam->setAspectRatio(Real(vp->getActualWidth()) / Real(vp->getActualHeight()));
    
        // finally something to render
        Ogre::Entity* ent = scnMgr->createEntity("Sinbad.mesh");
        Ogre::SceneNode* node = scnMgr->getRootSceneNode()->createChildSceneNode(Vector3::UNIT_Y * 5);
        node->attachObject(ent);
    
        // create a floor mesh resource
        Ogre::MeshManager::getSingleton().createPlane("floor", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
                Plane(Vector3::UNIT_Y, 0), 100, 100, 20, 20, true, 1, 5, 5, Vector3::UNIT_Z);
        
        // create a floor entity, give it a material, and place it at the origin
        Entity* floor = scnMgr->createEntity("Floor", "floor");
        floor->setMaterialName("Examples/Rockwall");
        floor->setCastShadows(false);
        scnMgr->getRootSceneNode()->attachObject(floor);
    
        mAnimationState = ent->getAnimationState("Dance");
        mAnimationState->setEnabled(true);
        mAnimationState->setLoop(true);
    }
    //! [setup]
    
    bool MyTestApp::frameRenderingQueued(const Ogre::FrameEvent& evt) {
        mAnimationState->addTime(evt.timeSinceLastFrame);
        return true;
    }
    
    //! [main]
    int main(int argc, char *argv[])
    {
        MyTestApp app;
        app.initApp();
        app.getRoot()->startRendering();
        app.closeApp();
        return 0;
    }
    //! [main]
    
    

    相关文章

      网友评论

          本文标题:Tutorial1: Animation

          本文链接:https://www.haomeiwen.com/subject/xarimftx.html