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