Agung Toto Wibowo Materi tutorial diambil dari wiki Ogre :

Slides:



Advertisements
Presentasi serupa
Menggambarkan Data: Tabel Frekuensi, Distribusi Frekuensi, dan Presentasi Grafis Chapter 2.
Advertisements

Kapasitor dan Dielektrik
Dasar dasar GUI programming di Java
MS. POWER POINT 2007 Kelas XII Semester 2
Array.
3D Game Engine Agung Toto Wibowo
This document is for informational purposes only. MICROSOFT MAKES NO WARRANTIES, EXPRESS OR IMPLIED, IN THIS DOCUMENT. © 2006 Microsoft Corporation. All.
Mata Kuliah : ALGORITMA dan STRUKTUR DATA 1.
PEMOGRAMAN BERBASIS JARINGAN
MELAKUKAN INSTALASI SISTEM OPERASI WINDOWS XP
© 2007 Cisco Systems, Inc. All rights reserved.Cisco Public 1 Version 4.0 Static Routing Routing Protocols and Concepts.
Memulai Drive Test menggunakan TEMS Investigation 6.1.4
PART 5 TRAINING INPUT Dosen : Dwisnanto Putro, ST, M.Eng.
Pemrograman Visual. Pernyataan IF…THEN…ELSE Pernyataan ini hanya memeriksa apakah suatu blok kode program dapat dieksekusi atau tidak. Jika kondisi pernyataan.
Pemrograman Berorientasi Objek
Quick Start Secure M-401.
PERULANGANPERULANGAN. 2 Flow of Control Flow of Control refers to the order that the computer processes the statements in a program. –Sequentially; baris.
Slide 3-1 Elmasri and Navathe, Fundamentals of Database Systems, Fourth Edition Revised by IB & SAM, Fasilkom UI, 2005 Exercises Apa saja komponen utama.
ModulXII (dua belas) TopikKonkurensi Sub TopikAlgoritma Penyelesaian Mutual Eksklusion Materi  Algoritma Peterson  Semaphore TujuanMahasiswa mengenal.
Database Create-Retrieve-Update-Delete (CRUD)
PENGENALAN PL/SQL.
Ilmu Komputer, FMIPA UGM
PROSES PADA WINDOWS Pratikum SO. Introduksi Proses 1.Program yang sedang dalam keadaan dieksekusi. 2.Unit kerja terkecil yang secara individu memiliki.
Review Operasi Matriks
1 IKI10230 Pengantar Organisasi Komputer Kuliah no. A4: Bahasa Rakitan AVR Conditional & Branch Instructions 21 Maret 2003 Bobby Nazief
Internal dan Eksternal Sorting
DEPARTEMEN ILMU KOMPUTER FMIPA IPB 2011 Praktikum Bahasa Pemrograman.
Could not load an object because it is not avaliable on this machine. Tidak dapat memuat sebuah benda karena tidak tersedia pada mesin ini.
Interface Nur Hayatin, S.ST Jurusan Teknik Informatika Universitas Muhammadiyah Malang Sem Genap 2010.
Lily Puspa Dewi1 PPA Pertemuan ke – 2 Site Management Chapter 3 & 4.
Agung Toto Wibowo Materi tutorial diambil dari wiki Ogre :
JAVA CLASS Bahasa Pemrogramam BAHASA PEMROGRAMAN PERTEMUAN #9.
Menggunakan OLE Drag-Drop
Menggunakan Drag-Drop
Implementing an REA Model in a Relational Database
FreeRTOS Tutorial.
NoObjekPropertiNilai 1FrmsegitigaNameFrmsegiitiga 2FrmsegitigaCaptionLuas Segi Tiga MDI ( Multiple Document Interface ) Pendahuluan MDI singkatan dari.
Kinematics in One Dimension - Kinematika dalam Satu Dimensi -
Array
Function, Procedure, Unit
Slide 1 QUIS Langkah pertama caranya Buat di slide pertama judul Slide kedua soal Slide ketiga waktu habis Slide keempat jawaban yang benar Slide kelima.
Selamat Datang Peserta Workshop
TRAVERSING BINARY TREE
Pembuatan menu: dengan perintah INPUT, MENU & melalui FORM PERTEMUAN 12.
PENGAMBILAN KEPUTUSAN. 3. Operator Logika TandaKeterangan && Logika DAN  AND I I Logika ATAU  OR ! Negasi (lawan) Logika AND  True AND True = True.
Lecture 1 Introduction to C# Erick Pranata © Sekolah Tinggi Teknik Surabaya 1.
PEMROGRAMAN PPBD (UAS) SEBELUM MELANGKAH KE TAHAP SELANJUTNYA BERDOA DULU BIAR LANCAR DAN GA EROR
Sprite Setiap objek dalam game yang memiliki gambar dan karakteristik.
ACCURATE MINI KASUS.
Metering Nol memerintahkan kamera utk melihat, sedekat mungkin dengan seperti mata kita melihatnya Eny Erawati, S.Sn.
Amortization & Depresiasi
Aplikasi Manipulasi Data
Operator dan Assignment Pertemuan 3 Pemrograman Berbasis Obyek Oleh Tita Karlita.
Paging datagridview VB.Net
Kelas Dasar HTML Dasar SMK Al-Muhajirin Sabtu, 29 November 2014.
Lazarus? Lazarus is a free cross-platform visual integrated development environment (IDE) for rapid application development (RAD) using the Free Pascal.
Double Linked List. © 2005 Pearson Education, Inc., Upper Saddle River, NJ. All rights reserved. Double Linked List Sama seperti single linked list, double.
Web Teknologi 3 (MKB721C) Minggu 11 Page 1 MINGGU 11 Web Teknologi 3 (MKB721C) Pokok Bahasan: –Canvas lanjutan Tujuan Instruksional Khusus: –Siswa memahami.
The intensive state of a PVT system containing N chemical species and  phases in equilibrium is characterized by the intensive variables, temperature.
TCP, THREE-WAY HANDSHAKE, WINDOW
Web Teknologi I (MKB511C) Minggu 12 Page 1 MINGGU 12 Web Teknologi I (MKB511C) Pokok Bahasan: – Text processing perl-compatible regular expression/PCRE.
Person 19 || Marty Rori 1. Apa yang Buruk Tentang Menggunakan? Vairables global? 2 tidak aman!  Jika dua atau lebih programmer bekerja sama dalam program,
Interaksi dengan Objek HTML A’ud Solehuddin::Februari2012.
FISIKA DASAR By: Mohammad Faizun, S.T., M.Eng. Head of Manufacture System Laboratory Mechanical Engineering Department Universitas Islam Indonesia.
MEMBUAT DATABASE LEWAT KODE PROGRAM
AUSTRALIA INDONESIA PARTNERSHIP FOR EMERGING INFECTIOUS DISEASES PELATIHAN EXCEL DASAR.
Slide 1 Chapter 1: Introduction to Systems Analysis and Design Alan Dennis, Barbara Wixom, and David Tegarden John Wiley & Sons, Inc.
Pengenalan PHP Operator Aritmatika:
Pengenalan PHP Operator Aritmatika:
MATA PRAKTIKUM GRAFKOMP2
Transcript presentasi:

Agung Toto Wibowo Materi tutorial diambil dari wiki Ogre :

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

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) { } };

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

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

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)

// 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()

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.

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

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

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;

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)

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

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);

Agung Toto Wibowo Materi tutorial diambil dari wiki Ogre :

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

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

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

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 */ } };

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

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; }

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

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.

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;

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.

Selamat bersenang-senang