Presentasi sedang didownload. Silahkan tunggu

Presentasi sedang didownload. Silahkan tunggu

Agung Toto Wibowo Materi tutorial diambil dari wiki Ogre :

Presentasi serupa


Presentasi berjudul: "Agung Toto Wibowo Materi tutorial diambil dari wiki Ogre :"— Transcript presentasi:

1 Agung Toto Wibowo http://gameprogramming.blog.ittelkom.ac.id/blog/ Materi tutorial diambil dari wiki Ogre : http://www.ogre3d.org/wiki/index.php/Ogre_Tutorials http://www.ogre3d.org/wiki/index.php/Ogre_Tutorials

2 Persiapan Frame Listener dan Unbuffered Input Buat aplikasi dengan nama “TutorialApplication” melalui Ogre SDK Wizzard Kita akan berkonsentrasi pada kode berikut : class TutorialFrameListener : public ExampleFrameListener { public: TutorialFrameListener(RenderWindow* win, Camera* cam, SceneManager *sceneMgr) : ExampleFrameListener(win, cam, false, false) { } bool processUnbufferedKeyInput(const FrameEvent& evt) { return true; } bool processUnbufferedMouseInput(const FrameEvent& evt) { return true; } bool frameStarted(const FrameEvent &evt) { return ExampleFrameListener::frameStarted(evt); } protected: bool mMouseDown; // Whether or not the left mouse button was Real mToggle; // The time left until next toggle Real mRotate; // The rotate constant Real mMove; // The movement constant SceneManager *mSceneMgr; // The current SceneManager SceneNode *mCamNode; // The SceneNode the camera is currently // attached to }; Extend ExampleFrameListener False mean Unbuffered Input : Keyboard dan Mouse

3 Persiapan Frame Listener dan Input Buat aplikasi dengan nama “TutorialApplication” melalui Ogre SDK Wizzard Kita akan berkonsentrasi pada kode berikut : class TutorialApplication : public ExampleApplication { public: TutorialApplication() { } ~TutorialApplication() { } protected: void createCamera(void) { } void createScene(void) { } void createFrameListener(void) { } };

4 Skenario Kita letakkan sebuah objek, sebuah light, dan dua buah kamera. Kita akan coba penggunaan input keyboard dan mouse untuk interaksi dengan Ogre. Jika ditekan tombol kiri, maka light akan menyala / mati secara bergantian Jika ditekan tombol 1 atau 2, maka kamera akan berbanti ke kamera 1 atau 2 tergantung dengan tombol yang ditekan. Menggerakkan kamera jika ditekan tombol ASDWQE

5 Meletakkan Objek Tambahkan kode berikut pada TutorialApplication::createScene() mSceneMgr->setAmbientLight(ColourValue(0.25, 0.25, 0.25)); Entity *ent = mSceneMgr->createEntity("Ninja", "ninja.mesh"); SceneNode *node = mSceneMgr->getRootSceneNode()-> createChildSceneNode("NinjaNode"); node->attachObject(ent); Buat pencahayaan environtment menjadi redup

6 Meletakkan Light Tambahkan kode berikut pada TutorialApplication::createScene() Light *light = mSceneMgr->createLight("Light1"); light->setType(Light::LT_POINT); light->setPosition(Vector3(250, 150, 250)); light->setDiffuseColour(ColourValue::White); light->setSpecularColour(ColourValue::White); Lokasi light Ada tiga type light pada Ogre (slide sebelumnya): Point (LT_POINT) Spotlight (LT_SPOTLIGHT) Directional (LT_DIRECTIONAL)

7 // Create the scene node node = mSceneMgr->getRootSceneNode()->createChildSceneNode("CamNode1", Vector3(-400, 200, 400)); node->yaw(Degree(-45)); node->attachObject(mCamera); // create the second camera node node = mSceneMgr->getRootSceneNode()->createChildSceneNode("CamNode2", Vector3(0, 200, 400)); Meletakkan Kamera Tambahkan kode berikut pada TutorialApplication:: createCamera() // create camera, but leave at default position mCamera = mSceneMgr->createCamera("PlayerCam"); mCamera->setNearClipDistance(5); Membuat mCamera berada pada sceneNode pertama Tambahkan kode berikut pada akhir TutorialApplication:: createScene() Lokasi Scene Node kedua (lokasi kamera yang lain) Kompile dan jalankan aplikasi. Note : remark terlebih dahulu TutorialApplication::createFrameListener()

8 Ogre Main Loop Proses loop rendering yang terjadi pada Ogre. Proses main loop ini terdiri : Object Root memanggil method frameStarted pada semua FrameListener yang terregister, Object Root merender satu frame, Object Root memanggil method frameEnded pada semua FrameListener yang terregister. Proses ini menentukan apakah Ogre akan merender frame berikutnya atau tidak. Akan dihentikan jika frameStarted atau frameEnded mengembalikan nilai false.

9 Ogre Frame Listener FrameListener adalah class yang menerima notifikasi sebelum dan sesudah sebuah frame di render FrameListener mendefinisikan dua fungsi : bool frameStarted(const FrameEvent& evt) bool frameEnded(const FrameEvent& evt) Untuk meregister FrameListener, tambahkan kode berikut pada TutorialApplication::createFrameListener() // Create the FrameListener mFrameListener = new TutorialFrameListener(mWindow, mCamera, mSceneMgr); mRoot->addFrameListener(mFrameListener); // Show the frame stats overlay mFrameListener->showDebugOverlay(true); Informasi Debug Frame Rate Buat TutorialFrameListener extend dari ExampleFrameListener

10 Class TutorialFrameListener Extend dari ExampleFrameListener. Variabel pada class TutorialFrameListener protected: bool mMouseDown; // status mouse down pada frame terakhir Real mToggle; // The time left until next toggle Real mRotate; // konstanta rotasi Real mMove; // konstanta translasi SceneManager *mSceneMgr; // SceneManager yang aktif SceneNode *mCamNode; // berisi SceneNode camera yang sedang dipakai

11 Class TutorialFrameListener Kita extend : ExampleFrameListener(win, cam, false, false) Tambahkan kode berikut pada constructor TutorialFrameListener // key and mouse state tracking mMouseDown = false; mToggle = 0.0; // Populate the camera and scene manager containers mCamNode = cam->getParentSceneNode(); mSceneMgr = sceneMgr; // set the rotation and move speed mRotate = 0.13; mMove = 250;

12 Impelementasi On/Off Light Tambahkan kode berikut pada TutorialFrameListener::frameStarted(); mMouse->capture(); mKeyboard->capture(); if(mKeyboard->isKeyDown(OIS::KC_ESCAPE)) return false; bool currMouse = mMouse->getMouseState().buttonDown(OIS::MB_Left); if (currMouse && ! mMouseDown) { Light *light = mSceneMgr->getLight("Light1"); light->setVisible(! light->isVisible()); } // if mMouseDown = currMouse; Mengubah status light on/off Mengecek kondisi mouse Menset kondisi mouse dengan kondisi sekarang, untuk dipergunakan di frame berikutnya (unbuffered)

13 Mengubah Kamera yang Aktif Tambahkan kode berikut pada kode selanjutnya di TutorialFrameListener::frameStarted(); mToggle -= evt.timeSinceLastFrame; if ((mToggle isKeyDown(OIS::KC_1)) { mToggle = 0.5f; mCamera->getParentSceneNode()->detachObject(mCamera); mCamNode = mSceneMgr->getSceneNode("CamNode1"); mCamNode->attachObject(mCamera); } else if ((mToggle isKeyDown(OIS::KC_2)) { mToggle = 0.5f; mCamera->getParentSceneNode()->detachObject(mCamera); mCamNode = mSceneMgr->getSceneNode("CamNode2"); mCamNode->attachObject(mCamera); } Mengubah ke kamera 2 Mengubah ke kamera 1

14 Menggerakkan Kamera yang Aktif Tambahkan kode berikut pada kode selanjutnya di TutorialFrameListener::frameStarted(); Vector3 transVector = Vector3::ZERO; if (mKeyboard->isKeyDown(OIS::KC_UP) || mKeyboard->isKeyDown(OIS::KC_W)) transVector.z -= mMove; if (mKeyboard->isKeyDown(OIS::KC_DOWN) || mKeyboard->isKeyDown(OIS::KC_S)) transVector.z += mMove; if (mKeyboard->isKeyDown(OIS::KC_LEFT) || mKeyboard->isKeyDown(OIS::KC_A)) transVector.x -= mMove; if (mKeyboard->isKeyDown(OIS::KC_RIGHT) || mKeyboard->isKeyDown(OIS::KC_D)) transVector.x += mMove; if (mKeyboard->isKeyDown(OIS::KC_PGUP) || mKeyboard->isKeyDown(OIS::KC_Q)) transVector.y += mMove; if (mKeyboard->isKeyDown(OIS::KC_PGDOWN) || mKeyboard->isKeyDown(OIS::KC_E)) transVector.y -= mMove; mCamNode->translate(transVector * evt.timeSinceLastFrame, Node::TS_LOCAL);

15 Agung Toto Wibowo http://gameprogramming.blog.ittelkom.ac.id/blog/ Materi tutorial diambil dari wiki Ogre : http://www.ogre3d.org/wiki/index.php/Ogre_Tutorials http://www.ogre3d.org/wiki/index.php/Ogre_Tutorials

16 Buffered Input Kali ini kita akan mencoba skenario yang sama, tapi dengan buffered input. Perbedaan unbuffered input dengan buffered input : Unbuffered disetiap frame kita meminta state dari instance OIS::Keyboard dan OIS::Mouse untuk mengetahui apakah tombol keyboard dan mouse di tekan. Buffered menggunakan interface listener untuk menginformasikan program bahwa sebuah event terjadi. Contoh : ketika key ditekan, sebuah event KeyListener::keyPressed diumumkan ketika button dilepas(tidak lagi ditekan) sebuah KeyListener::keyRelease dijalankan

17 Persiapan Buffered Input [1] Buat class TutorialFrameListener yang mengextend ExampleFrameListener, OIS::MouseListener, OIS::KeyListener class TutorialFrameListener : public ExampleFrameListener, public OIS::MouseListener, public OIS::KeyListener { public: TutorialFrameListener(RenderWindow* win, Camera* cam, SceneManager *sceneMgr) : ExampleFrameListener(win, cam, true, true) { } bool frameStarted(const FrameEvent &evt) { if(mMouse) mMouse->capture(); if(mKeyboard) mKeyboard->capture(); return mContinue; } // MouseListener bool mouseMoved(const OIS::MouseEvent &e) { return true; } bool mousePressed(const OIS::MouseEvent &e, OIS::MouseButtonID id) { return true; } bool mouseReleased(const OIS::MouseEvent &e, OIS::MouseButtonID id) { return true; } True mean Buffered Input : Keyboard dan Mouse Mouse listener mengimplementasikan tiga : move, pressed, dan release

18 Persiapan Buffered Input [2] Lanjutan class TutorialFrameListener // KeyListener bool keyPressed(const OIS::KeyEvent &e) { return true; } bool keyReleased(const OIS::KeyEvent &e) { return true; } protected: Real mRotate; // The rotate constant Real mMove; // The movement constant SceneManager *mSceneMgr; // The current SceneManager SceneNode *mCamNode; // The SceneNode the camera is currently attached to bool mContinue; // Whether to continue rendering or not Vector3 mDirection; // Value to move in the correct direction }; Key listener mengimplementasikan : pressed, dan release

19 Persiapan Buffered Input [3] Buat aplikasi dengan nama “TutorialApplication” melalui Ogre SDK Wizzard Tambahakan pula class TutorialApplication sebagai berikut. class TutorialApplication : public ExampleApplication { public: TutorialApplication() { } ~TutorialApplication() { } protected: void createCamera(void) { /* isikan hal yang sama pada unbuffered Input */ } void createScene(void) { /* isikan hal yang sama pada unbuffered Input */ } void createFrameListener(void) { /* isikan hal yang sama pada unbuffered Input */ } };

20 Konstruktor FrameListener Pada konstuktor, kita akan inisialisasi beberapa variabel. Kita set mContinu menjadi true, yang berarti akan kita render sampai mContinue bernilai false. // Populate the camera and scene manager containers mCamNode = cam->getParentSceneNode(); mSceneMgr = sceneMgr; // set the rotation and move speed mRotate = 0.13; mMove = 250; // continue rendering mContinue = true; mMouse->setEventCallback(this); mKeyboard->setEventCallback(this); mDirection = Vector3::ZERO; Meregister event callback ke dirinya sendiri (class FrameListener). mMouse dan mKeyboard didefiniskan di ExampleFrameListener

21 KeyBinding [1] Pada method keyPressed, kita akan deteksi penekanan tombol escape, dan akan kita hentikan aplikasi dengan menset mContinue = false. // Populate the camera and scene manager containers bool keyPressed(const OIS::KeyEvent &e) { switch (e.key) { case OIS::KC_ESCAPE: mContinue = false; break; default: break; } return mContinue; }

22 KeyBinding [2] Untuk penekanan tombol 1 dan 2 agar kamera berubah-ubah kita tambahkan kode berikut pada statemen switch di TutorialFrameListener::keyPressed case OIS::KC_1: mCamera->getParentSceneNode()->detachObject(mCamera); mCamNode = mSceneMgr->getSceneNode("CamNode1"); mCamNode->attachObject(mCamera); break; case OIS::KC_2: mCamera->getParentSceneNode()->detachObject(mCamera); mCamNode = mSceneMgr->getSceneNode("CamNode2"); mCamNode->attachObject(mCamera); break; Penjelasan kode sama seperti di Unbuffered Input. Kompile dan jalankan aplikasi

23 KeyBinding [3] Hal yang sama untuk pernekanan tombol ASDWQE kita tambahkan kode berikut pada statemen switch di TutorialFrameListener::keyPressed case OIS::KC_W: mDirection.z = -mMove; break; case OIS::KC_S: mDirection.z = mMove; break; case OIS::KC_A: mDirection.x = -mMove; break; Penjelasan kode sama seperti di Unbuffered Input. Tambahkan perintah berikut pada frameStarted() case OIS::KC_D: mDirection.x = mMove; break; case OIS::KC_E: mDirection.y = -mMove; break; case OIS::KC_Q: mDirection.y = mMove; break; mCamNode->translate(mDirection * evt.timeSinceLastFrame, Node::TS_LOCAL); Jalankan aplikasi.

24 KeyBinding [4] Muncul masalah kamera tetap berjalan. Perlu kita undo perubahan pada saat key release. Tambahkan kode berikut pada keyRelease switch (e.key) { case OIS::KC_W: mDirection.z = 0; break; case OIS::KC_S: mDirection.z = 0; break; case OIS::KC_A: mDirection.x = 0; break; Jalankan aplikasi. case OIS::KC_D: mDirection.x = 0; break; case OIS::KC_E: mDirection.y = 0; break; case OIS::KC_Q: mDirection.y = 0; break; default: break; } // switch return true;

25 MouseBinding Sekarang kita implementasikan untuk menghidupkan dan menyalakan light Tambahkan kode berikut pada mousePressed Light *light = mSceneMgr->getLight("Light1"); switch (id) { case OIS::MB_Left: light->setVisible(! light->isVisible()); break; default: break; } return true; Jalankan aplikasi.

26 Selamat bersenang-senang


Download ppt "Agung Toto Wibowo Materi tutorial diambil dari wiki Ogre :"

Presentasi serupa


Iklan oleh Google