Thursday, November 22, 2012

Grafkom2: Orang Terbang dengan Ogre


Tujuan dari penulisan modul ini adalah untuk melengkapi sebagian syarat praktikum grafik komputer 2. Pada semester sebelumnya, telah dipersiapkan sebuah project modeling 3D dengan menggunakan blender. Sehingga, untuk project kali ini akan membuat animasi dengan menggunakan Graphic Engine Ogre. Adapun software-software yang dibutuhkan untuk mengconvert dari blender ke aplikasi Ogre yaitu:
1.      Eclipse Galileo C++
2.      OgreSDKSetup1.6.1_CBMingW
3.      MinGW_Toolbox_Setup_wr1
4.      MSYS-1.0.10
5.      blender-2.49b-windows
6.      CeguiMeshViewer_Setup
7.      python-2.6.5
8.      BlenderExport



/*
* BelajarOgre.cpp
* Developed by: Hedi Oktavia
*/


#include "ExampleApplication.h"

//--awalan untuk animasi pindah tempat----
#include <deque>
using namespace std;
//-----------------------------------------

class MoveDemoListener : public ExampleFrameListener
{
public:
MoveDemoListener(RenderWindow* win, Camera* cam, SceneNode *sn, SceneNode *sn2, Entity *ent, Entity *ent2, deque<Vector3> &walk)
: ExampleFrameListener(win, cam, false, false), mNode(sn), mNode2(sn2), mEntity(ent), mEntity2(ent2), mWalkList(walk)
{

//---tempat pemberian nilai awal untuk variabel-variabel yg digunakan
mWalkSpeed = 100.0f;
mDirection = Vector3::ZERO;
//-----------------------------------------------------------------------

}

//--Fungsi ini dipanggil untuk memulai perpindahan objek ke posisi selanjutnya dalam mWalkList.
bool nextLocation()
{
if (mWalkList.empty()) return true;

mDestination = mWalkList.front(); // ini untuk mendapatkan posisi depan deque
mWalkList.pop_front(); // ini untuk menghapus posisi depan deque

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

Vector3 src = mNode->getOrientation() * Vector3::UNIT_Z;
if ((1.0f + src.dotProduct(mDirection)) < 0.0001f)
{
mNode->yaw(Degree(180));

}
else
{
Ogre::Quaternion quat = src.getRotationTo(mDirection);
mNode->rotate(quat);
mWalkSpeed = 4000.0f;

}
return true;
}


bool frameStarted(const FrameEvent &evt)
{
if (mDirection == Vector3::ZERO)
{
//--gerakan animasi awal atau masih ada titik lokasi yang belum dikunjungi
if (nextLocation())
{
mWalkSpeed = 20000.0f;
mCamera->setPosition(Vector3(-1500,2000,4500));
mCamera->lookAt(Vector3(300,1000,1000));
}
}
else
{
Real move = mWalkSpeed * evt.timeSinceLastFrame;
mDistance -= move;

if (mDistance <= 0.0f)
{
mNode->setPosition(mDestination);
mDirection = Vector3::ZERO;

//--jika sudah tidak ada lagi titik lokasi yang belum dikunjungi
if (! nextLocation())
{
}
}

else
{
//--pindah objek
mNode->translate(mDirection * move);
}
}

return ExampleFrameListener::frameStarted(evt);
}
protected:

Real mDistance; // Jarak objek yang tersisa untuk berjalan
Vector3 mDirection; // Arah objek saat bergerak
Vector3 mDestination; // Tujuan objek saat bergerak ke depan

Entity *mEntity;
Entity *mEntity2;


SceneNode *mNode;
SceneNode *mNode2;

SceneNode *nodePar;
SceneNode *nodePar2;


ParticleSystem *ps;
ParticleSystem *ps2;

std::deque<Vector3> mWalkList; // daftar dari titik yang akan kita kunjungi
Real mWalkSpeed; // kecepatan objek bergerak

};


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

~Alien()
{
}
protected:
Entity *mEntity;
Entity *mEntity2;

SceneNode *mNode;
SceneNode *mNode2;

SceneNode *nodePar;
SceneNode *nodePar2;

ParticleSystem *ps;
ParticleSystem *ps2;

std::deque<Vector3> mWalkList;

void chooseSceneManager(void)
{
mSceneMgr=mRoot->createSceneManager(ST_EXTERIOR_CLOSE);
}

virtual void createViewports(void)
{
Viewport*vp = mWindow->addViewport(mCamera);
vp->setBackgroundColour(ColourValue(0,0,0));
mCamera->setAspectRatio(Real(vp->getActualWidth())/Real(vp->getActualHeight()));
}

void createScene(void)
{
mSceneMgr->setAmbientLight(ColourValue(0, 0,0 ) );
mSceneMgr->setShadowTechnique(SHADOWTYPE_STENCIL_ADDITIVE);

// entitas pertama
mEntity = mSceneMgr->createEntity("RZR-002a", "toi.mesh");
mNode = mSceneMgr->getRootSceneNode()->
createChildSceneNode("RZRNode", Vector3(1100,900,-2000));
mNode->attachObject(mEntity);
mEntity->setCastShadows(true);


//entitas kedua
mEntity2 = mSceneMgr->createEntity("RZR-002b", "toi.mesh");
mNode2 = mNode->createChildSceneNode();
mNode2->attachObject(mEntity2);
mEntity2->setCastShadows(true);
mNode2->setScale(5,5,5);
mNode2->translate(-10,40,-20);

//partikel cahaya hijau
ps = mSceneMgr->createParticleSystem("particle","Examples/GreenyNimbus");
nodePar = mNode->createChildSceneNode();
nodePar->attachObject(ps);
nodePar->pitch(Degree(90));

ps2 = mSceneMgr->createParticleSystem("particle2","Examples/GreenyNimbus");
nodePar2 = mNode->createChildSceneNode();
nodePar2->attachObject(ps2);
nodePar2->translate(5,0,-15);
nodePar2->pitch(Degree(90));

//daftar jalan
mWalkList.push_back(Vector3(50000.0f, 700.0f, 500.0f));
mWalkList.push_back(Vector3(1300.0f, 12000.0f, 5000.0f));
mWalkList.push_back(Vector3(1300.0f, 7000.0f, 30000.0f));
mWalkList.push_back(Vector3(8000.0f,1000.0f,-2000.0f));
mWalkList.push_back(Vector3(-8000.0f,-100.0f,-200.0f));

//latar alas dasar
Plane plane;
plane.normal = Vector3::UNIT_Y;
plane.d = 0;
MeshManager::getSingleton().createPlane("Myplane",ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, plane,
14500,14500,10,10,true,1,50,50,Vector3::UNIT_Z);
Entity* pPlaneEnt = mSceneMgr->createEntity( "plane", "Myplane" );
pPlaneEnt->setMaterialName("Examples/EveningSkyBox");
pPlaneEnt->setCastShadows(true);
mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(pPlaneEnt);

//cahaya
Light *light;
light = mSceneMgr->createLight("Light1");
light->setType(Light::LT_POINT);
light->setPosition(Vector3(0,1000,1000));
//set warna
light->setDiffuseColour(1.0,1.0,1.0);
light->setSpecularColour(1.0,1.0,1.0);

Light *light2;
light2 = mSceneMgr->createLight("Light2");
light2->setType(Light::LT_POINT);
light2->setPosition(Vector3(1100,900,0));
//set warna
light2->setDiffuseColour(1.0,1.0,1.0);
light2->setSpecularColour(1.0,1.0,1.0);

//CloudySky
mSceneMgr->setSkyDome(true,"Examples/EveningSkyBox",5,8);
}

void createFrameListener(void)
{
mFrameListener= new MoveDemoListener(mWindow, mCamera, mNode, mNode2, mEntity, mEntity2, 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
{
// membuat objek aplikasi
Alien app;

try {
app.go();
} catch(Exception& e){
#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
MessageBoxA(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;
}

0 comments:

Post a Comment