Sharing

Tempat sharing anak IT Gunadarma angkatan 2007


    Source File Animasi Bergerak

    Share

    PittUS

    Jumlah posting : 8
    Points : 12
    Reputasi : 0
    Join date : 21.03.10
    Lokasi : Bekasi

    Source File Animasi Bergerak

    Post  PittUS on Wed Apr 07, 2010 12:24 am

    Buat teman-teman yang mau tahu cara membuat animasi bergerak bisa copast dari source file di bawah ini:
    Spoiler:

    /*
    * MoveDemo.cpp
    *
    * Created on: Mar 13, 2010
    * Author: PittUS
    */

    #include "ExampleApplication.h"

    #include <deque>
    using namespace std;

    class MoveDemoListener : public ExampleFrameListener
    {
    public:

    MoveDemoListener(RenderWindow* win, Camera* cam, SceneNode *sn,
    Entity *ent, deque<Vector3> &walk)
    : ExampleFrameListener(win, cam, false, false), mNode(sn), mEntity(ent), mWalkList(walk)
    {
    // Set default values for variables
    mWalkSpeed = 35.0f;
    mDirection = Vector3::ZERO;
    } // MoveDemoListener

    /* This function is called to start the object moving to the next position
    in mWalkList.
    */
    bool nextLocation()
    { if (mWalkList.empty())
    return false;
    mDestination = mWalkList.front(); // this gets the front of the deque
    mWalkList.pop_front(); // this removes the front of the deque

    mDirection = mDestination - mNode->getPosition();
    mDistance = mDirection.normalise();

    Vector3 src = mNode->getOrientation() * Vector3::UNIT_X;
    if ((1.0f + src.dotProduct(mDirection)) < 0.0001f)
    {
    mNode->yaw(Degree(180));
    }
    else
    {
    Ogre::Quaternion quat = src.getRotationTo(mDirection);
    mNode->rotate(quat);
    } // else

    return true;
    } // nextLocation()

    bool frameStarted(const FrameEvent &evt)
    {
    if (mDirection == Vector3::ZERO)
    {
    if (nextLocation())
    {
    // Set walking animation
    mAnimationState = mEntity->getAnimationState("Walk");
    mAnimationState->setLoop(true);
    mAnimationState->setEnabled(true);
    }
    }
    else
    {
    Real move = mWalkSpeed * evt.timeSinceLastFrame;
    mDistance -= move;

    if (mDistance <= 0.0f)
    {
    mNode->setPosition(mDestination);
    mDirection = Vector3::ZERO;
    // Set animation based on if the robot has another point to walk to.
    if (! nextLocation())
    {
    // Set Idle animation
    mAnimationState = mEntity->getAnimationState("Idle");
    mAnimationState->setLoop(true);
    mAnimationState->setEnabled(true);
    }
    else
    {
    // Rotation Code will go here later
    }
    }
    else
    {
    mNode->translate(mDirection * move);
    } // else
    } // if

    mAnimationState->addTime(evt.timeSinceLastFrame);
    return ExampleFrameListener::frameStarted(evt);
    }
    protected:
    Real mDistance; // The distance the object has left to travel
    Vector3 mDirection; // The direction the object is moving
    Vector3 mDestination; // The destination the object is moving towards

    AnimationState *mAnimationState; // The current animation state of the object

    Entity *mEntity; // The Entity we are animating
    SceneNode *mNode; // The SceneNode that the Entity is attached to
    std::deque<Vector3> mWalkList; // The list of points we are walking to

    Real mWalkSpeed; // The speed at which the object is moving
    };


    class MoveDemoApplication : public ExampleApplication
    {
    protected:
    public:
    MoveDemoApplication()
    {
    }

    ~MoveDemoApplication()
    {
    }
    protected:
    Entity *mEntity; // The entity of the object we are animating
    SceneNode *mNode; // The SceneNode of the object we are moving
    std::deque<Vector3> mWalkList; // A deque containing the waypoints

    void createScene(void)
    {
    mSceneMgr->setSkyDome(true, "Examples/CloudySky", 5, Cool;

    // Set the default lighting.
    mSceneMgr->setAmbientLight(ColourValue(1.0f, 1.0f, 1.0f));
    // Create the entity
    mEntity = mSceneMgr->createEntity("Robot", "robot.mesh");
    // Create the scene node
    mNode = mSceneMgr->getRootSceneNode()->
    createChildSceneNode("RobotNode", Vector3(0.0f, 0.0f, 25.0f));
    mNode->attachObject(mEntity);

    // Create the walking list
    mWalkList.push_back(Vector3(550.0f, 0.0f, 50.0f ));
    mWalkList.push_back(Vector3(-100.0f, 0.0f, -200.0f));
    mWalkList.push_back(Vector3(0.0f, 0.0f, 25.0f));

    // Create objects so we can see movement
    Entity *ent;
    SceneNode *node;

    ent = mSceneMgr->createEntity("Knot1", "knot.mesh");
    node = mSceneMgr->getRootSceneNode()->createChildSceneNode("Knot1Node",
    Vector3(0.0f, -10.0f, 25.0f));
    node->attachObject(ent);
    node->setScale(0.1f, 0.1f, 0.1f);

    ent = mSceneMgr->createEntity("Knot2", "knot.mesh");
    node = mSceneMgr->getRootSceneNode()->createChildSceneNode("Knot2Node",
    Vector3(550.0f, -10.0f, 50.0f));
    node->attachObject(ent);
    node->setScale(0.1f, 0.1f, 0.1f);

    ent = mSceneMgr->createEntity("Knot3", "knot.mesh");
    node = mSceneMgr->getRootSceneNode()->createChildSceneNode("Knot3Node",
    Vector3(-100.0f, -10.0f,-200.0f));
    node->attachObject(ent);
    node->setScale(0.1f, 0.1f, 0.1f);

    /*Plane plane(Vector3::UNIT_Y, 0);
    MeshManager::getSingleton().createPlane("ground",
    ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, plane,
    1500,1500,20,20,true,1,5,5,Vector3::UNIT_Z);

    Entity *ent2 = mSceneMgr->createEntity("GroundEntity", "ground");
    mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(ent2);
    ent2->setMaterialName("Examples/GrassFloor");
    ent2->setCastShadows(false);*/

    // Set the camera to look at our handiwork
    mCamera->setPosition(90.0f, 280.0f, 535.0f);
    mCamera->pitch(Degree(-30.0f));
    mCamera->yaw(Degree(-15.0f));
    }

    void createFrameListener(void)
    {
    mFrameListener= new MoveDemoListener(mWindow, mCamera, mNode, mEntity, mWalkList);
    mFrameListener->showDebugOverlay(true);
    mRoot->addFrameListener(mFrameListener);
    }

    };

    #if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
    #define WIN32_LEAN_AND_MEAN
    #include "windows.h"


    INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT)
    #else
    int main(int argc, char **argv)
    #endif
    {
    // Create application object
    MoveDemoApplication app;

    try {
    app.go();
    } catch(Exception& e) {
    #if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
    MessageBox(NULL, e.getFullDescription().c_str(), "An exception has occurred!",
    MB_OK | MB_ICONERROR | MB_TASKMODAL);
    #else
    fprintf(stderr, "An exception has occurred: %s\n",
    e.getFullDescription().c_str());
    #endif
    }


    return 0;
    }
    Cara Penggunaan:
    Source File yang dibuat menggunakan nama MoveDemo.cpp
    Pada bagian
    mSceneMgr->setSkyDome(true, "Examples/CloudySky", 5, Cool;
    adalah ..., 5, 8 ); bukan Cool

    Saya akan mencoba jelaskan sedikit tentang coding tersebut. Bagian-bagian ini bisa dirubah, it's depends with the object. Hal lain yang perlu diingat adalah animasi dari objek dalam source ini hanya dipanggil/dijalankan. Untuk membuat animasi pada objek gunakan aplikasi 3d modeling seperti blender3d, 3ds max, dll. Klo ada salah mohon dimaafkan, namanya juga belajar... Wink
    Berikut adalah sedikit penjelasannya:
    Spoiler:

    mWalkSpeed = 35.0f;
    berguna untuk mengatur cepat lambatnya objek bergerak. Apabila objeknya makhluk atau benda hidup, cepat lambatnya mWalkSpeed berpengaruh terhadap animasi dari objek itu sendiri.
    Contoh dari code di atas: Apabila nilai 35.0f diganti menjadi 100.0f maka robot akan bergerak maju dengan cepat. Hal tersebut membuat pergerakan robot menjadi tidak real. Oleh karena itu, nilai mWalkSpeed harus disesuaikan dengan animasi bergerak pada objek.

    Vector3 src = mNode->getOrientation() * Vector3::UNIT_X;
    Pada bagian UNIT_X, nilai X bisa diganti menjadi Y atau Z. Dengan mengganti hal tersebut akan merubah posisi dari objek.
    Contoh: Coba ganti objek dari robot menjadi ninja, maka posisi berjalannya ninja akan menghadap ke arah yang salah.

    mAnimationState = mEntity->getAnimationState("Walk");
    Berguna untuk memanggil animasi yang telah diberikan pada objek. Walk adalah animasi berjalan yang terdapat pada objek robot. Tidak semua objek memiliki nama dan animasi yang sama antara satu dengan yang lain.

    mWalkList.push_back(Vector3(550.0f, 0.0f, 50.0f ));
    Berguna untuk menentukan titik kemana objek akan bergerak. (550.0f, 0.0f, 50.0f ) merupakan koordinat (x,y,z).

    Buat yang mau mengetahui dan belajar langsung tentang logika program ini, bisa melihat link ini
    atau mau belajar tentang tutorial ogre lain lihat link ini

    Selamat Mencoba & Semoga Berguna

      Waktu sekarang Mon Dec 05, 2016 7:27 pm