Senin, 11 April 2011

Membuat animasi dari Ogre

Oke,postingan kali ini,saya akan memberikan listing untuk membuat project dalam ogre.
Mungkin agak pusing,karena saya pun sebenarnya masih "newbie" dalam ogre.
Untuk object,saya menggunakan object fish.mesh yang sudah disediakan (jadi saya tidak mengubah object lg).
Tapi,jika ingin membuat object sendiri dari blender,membuat skeleton,lalu mengconvertnya menjadi mesh,kamu bisa lihat dari sumber yang ini~http://crystalforest.wordpress.com karena dari sumber tersebutlah saya belajar :D.
oke saya mulai ya..

Setiap kita akan membuat project baru,dalam eclipse,kita harus selalu menkofigurasi(dapat dilihat pada post blog yang lalu)~lihat disini atau lihat saja disini
Nah,setelah kita mengkonfigurasinya,pastinya pada lembar kerja eclipse,kita harus memasukkan listing program (dengan bahasa C++).

#include "ExampleApplication.h"
#include < ogretexture.h >
#include < OgreHardwarePixelBuffer.h >
#include < OgreTextureManager.h >
#include < OgreLogManager.h >
#include < sstream >
TexturePtr ptex;
HardwarePixelBufferSharedPtr buffer;
Overlay* overlay;
static const int reactorExtent = 130; // must be 2^N + 2
uint32 clut[1024];
AnimationState *swim;
// Nano fixed point library
#define FROMFLOAT(X) ((int)((X)*((float)(1<<16))))
#define TOFLOAT(X) ((float)((X)/((float)(1<<16))))
#define MULT(X,Y) (((X)*(Y))>>16)
ColourValue HSVtoRGB( float h, float s, float v )
{
int i;
ColourValue rv(0.0f, 0.0f, 0.0f, 1.0f);
float f, p, q, t;
h = fmodf(h, 360.0f);
h /= 60.0f; // sector 0 to 5
i = (int)floor( h );
f = h - i; // factorial part of h
p = v * ( 1.0f - s );
q = v * ( 1.0f - s * f );
t = v * ( 1.0f - s * ( 1.0f - f ) );

switch( i ) {
case 0: rv.r = v; rv.g = t; rv.b = p; break;
case 1: rv.r = q; rv.g = v; rv.b = p; break;
case 2: rv.r = p; rv.g = v; rv.b = t; break;
case 3: rv.r = p; rv.g = q; rv.b = v; break;
case 4: rv.r = t; rv.g = p; rv.b = v; break;
default: rv.r = v; rv.g = p; rv.b = q; break;
}
return rv;
}
class DynTexFrameListener : public ExampleFrameListener
{
private:
static float fDefDim;
static float fDefVel;
float tim;

int *chemical[2];
int *delta[2];
size_t mSize;
int dt,hdiv0,hdiv1; // diffusion parameters
int F,k; // reaction parameters

bool rpressed;
public:
DynTexFrameListener(RenderWindow* win, Camera* cam) : ExampleFrameListener( win, cam )
{
tim = 0;
rpressed = false;
// Create colour lookup
for(unsigned int col=0; col<1024; col++)
{
ColourValue c;
c = HSVtoRGB((1.0f-col/1024.0f)*90.0f+225.0f, 0.9f, 0.75f+0.25f*(1.0f-col/1024.0f));
c.a = 1.0f - col/1024.0f;
PixelUtil::packColour(c, PF_A8R8G8B8, &clut[col]);
}
// Setup
LogManager::getSingleton().logMessage("Creating chemical containment");
mSize = reactorExtent*reactorExtent;
chemical[0] = new int [mSize];
chemical[1] = new int [mSize];
delta[0] = new int [mSize];
delta[1] = new int [mSize];

dt = FROMFLOAT(2.0f);
hdiv0 = FROMFLOAT(2.0E-5f/(2.0f*0.01f*0.01f)); // a / (2.0f*h*h); -- really diffusion rate
hdiv1 = FROMFLOAT(1.0E-5f/(2.0f*0.01f*0.01f)); // a / (2.0f*h*h); -- really diffusion rate
//k = FROMFLOAT(0.056f);
//F = FROMFLOAT(0.020f);
k = FROMFLOAT(0.0619f);
F = FROMFLOAT(0.0316f);

resetReactor();
fireUpReactor();
updateInfoParamF();
updateInfoParamK();
updateInfoParamA0();
updateInfoParamA1();

LogManager::getSingleton().logMessage("Cthulhu dawn");
}
void resetReactor()
{
LogManager::getSingleton().logMessage("Facilitating neutral start up conditions");
for(unsigned int x=0; x<<16)-U);
delta[1][idx] += UVV - MULT(F+k,V);
idx++;
}
idx += 2;
}
// Update concentrations
for(x=0; xlock(HardwareBuffer::HBL_DISCARD);
const PixelBox &pb = buffer->getCurrentLock();
unsigned int idx = reactorExtent+1;
for(unsigned int y=0; y<(reactorExtent-2); y++) {
uint32 *data = static_cast(pb.data) + y*pb.rowPitch;
int *chem = &chemical[0][idx];
for(unsigned int x=0; x<(reactorExtent-2); x++) {
data[x] = clut[(chem[x]>>6)&1023];
}
idx += reactorExtent;
}
buffer->unlock();
}
// GUI updaters
void updateInfoParamK()
{
OverlayManager::getSingleton().getOverlayElement("Example/DynTex/Param_K") \
->setCaption("[1/2]k: "+StringConverter::toString(TOFLOAT(k)));
}
void updateInfoParamF()
{
OverlayManager::getSingleton().getOverlayElement("Example/DynTex/Param_F") \
->setCaption("[3/4]F: "+StringConverter::toString(TOFLOAT(F)));
}
void updateInfoParamA0()
{
// Diffusion rate for chemical 1
OverlayManager::getSingleton().getOverlayElement("Example/DynTex/Param_A0") \
->setCaption("[5/6]Diffusion 1: "+StringConverter::toString(TOFLOAT(hdiv0)));
}
void updateInfoParamA1()
{
// Diffusion rate for chemical 2
OverlayManager::getSingleton().getOverlayElement("Example/DynTex/Param_A1") \
->setCaption("[7/8]Diffusion 2: "+StringConverter::toString(TOFLOAT(hdiv1)));
}

bool frameStarted( const FrameEvent& evt )
{
using namespace OIS;
if( ExampleFrameListener::frameStarted( evt ) == false )
return false;

if( mKeyboard->isKeyDown( KC_1 ) ) {
k -= FROMFLOAT(0.005f*evt.timeSinceLastFrame);
updateInfoParamK();
}
if( mKeyboard->isKeyDown( KC_2 ) ) {
k += FROMFLOAT(0.005f*evt.timeSinceLastFrame);
updateInfoParamK();
}
if( mKeyboard->isKeyDown( KC_3 ) ) {
F -= FROMFLOAT(0.005f*evt.timeSinceLastFrame);
updateInfoParamF();
}
if( mKeyboard->isKeyDown( KC_4 ) ) {
F += FROMFLOAT(0.005f*evt.timeSinceLastFrame);
updateInfoParamF();
}
if( mKeyboard->isKeyDown( KC_5 ) ) {
hdiv0 -= FROMFLOAT(0.005f*evt.timeSinceLastFrame);
updateInfoParamA0();
}
if( mKeyboard->isKeyDown( KC_6 ) ) {
hdiv0 += FROMFLOAT(0.005f*evt.timeSinceLastFrame);
updateInfoParamA0();
}
if( mKeyboard->isKeyDown( KC_7 ) ) {
hdiv1 -= FROMFLOAT(0.005f*evt.timeSinceLastFrame);
updateInfoParamA1();
}
if( mKeyboard->isKeyDown( KC_8 ) ) {
hdiv1 += FROMFLOAT(0.005f*evt.timeSinceLastFrame);
updateInfoParamA1();
}

if( mKeyboard->isKeyDown( KC_0 ) && !rpressed ) {
// Reset 0
resetReactor();
fireUpReactor();
rpressed = true;
} else {
rpressed = false;
}
for(int x=0; x<10; x++)
runStep();
buildTexture();
swim->addTime(evt.timeSinceLastFrame);

return true;
}

virtual ~DynTexFrameListener(void)
{
delete [] chemical[0];
delete [] chemical[1];
delete [] delta[0];
delete [] delta[1];
}
};

float DynTexFrameListener::fDefDim = 25.0f;
float DynTexFrameListener::fDefVel = 50.0f;

class DynTexApplication : public ExampleApplication
{
public:
DynTexApplication() {}

protected:


virtual void createFrameListener(void)
{
mFrameListener= new DynTexFrameListener(mWindow, mCamera);
mFrameListener->showDebugOverlay(true);
mRoot->addFrameListener(mFrameListener);
}


virtual void createViewports(void)
{
// Create one viewport, entire window
Viewport* vp = mWindow->addViewport(mCamera);
vp->setBackgroundColour(ColourValue(0,0,0));

// Alter the camera aspect ratio to match the viewport
mCamera->setAspectRatio(
Real(vp->getActualWidth()) / Real(vp->getActualHeight()));
}

// Just override the mandatory create scene method
void createScene(void)
{
// Create dynamic texture
ptex = TextureManager::getSingleton().createManual(
"DynaTex","General", TEX_TYPE_2D, reactorExtent-2, reactorExtent-2, 0, PF_A8R8G8B8,
TU_DYNAMIC_WRITE_ONLY);
buffer = ptex->getBuffer(0, 0);

// Set ambient light
mSceneMgr->setAmbientLight(ColourValue(0.6, 0.6, 0.6));
mSceneMgr->setSkyBox(true, "Examples/SpaceSkyBox", 50 );

//mRoot->getRenderSystem()->clearFrameBuffer(FBT_COLOUR, ColourValue(255,255,255,0));

// Create a light
Light* l = mSceneMgr->createLight("MainLight");
l->setDiffuseColour(0.75, 0.75, 0.80);
l->setSpecularColour(0.9, 0.9, 1);
l->setPosition(-100,80,50);
mSceneMgr->getRootSceneNode()->attachObject(l);


Entity *planeEnt = mSceneMgr->createEntity("TexPlane1", Ogre::SceneManager::PT_PLANE);
// Give the plane a texture
planeEnt->setMaterialName("Examples/DynaTest");

SceneNode* node = mSceneMgr->getRootSceneNode()->createChildSceneNode(Vector3(-100,-40,-100));
node->attachObject(planeEnt);
node->setScale(3.0f, 3.0f, 3.0f);

// Create objects
SceneNode *blaNode = mSceneMgr->getRootSceneNode()->createChildSceneNode(Vector3(-200,0,50));
Entity *ent2 = mSceneMgr->createEntity( "knot", "knot.mesh" );
ent2->setMaterialName("Examples/DynaTest4");
blaNode->attachObject( ent2 );

blaNode = mSceneMgr->getRootSceneNode()->createChildSceneNode(Vector3(200,-90,50));
ent2 = mSceneMgr->createEntity( "knot2", "knot.mesh" );
ent2->setMaterialName("Examples/DynaTest2");
blaNode->attachObject( ent2 );
blaNode = mSceneMgr->getRootSceneNode()->createChildSceneNode(Vector3(-110,200,50));

// Cloaked fish
ent2 = mSceneMgr->createEntity( "knot3", "fish.mesh" );
ent2->setMaterialName("Examples/DynaTest3");
swim = ent2->getAnimationState("swim");
swim->setEnabled(true);
blaNode->attachObject( ent2 );
blaNode->setScale(50.0f, 50.0f, 50.0f);


//TextureManager::getSingleton().getByName("RustySteel.jpg");


std::stringstream d;
d << "HardwarePixelBuffer " << buffer->getWidth() << " " << buffer->getHeight() << " " << buffer->getDepth();
LogManager::getSingleton().logMessage(d.str());

buffer->lock(HardwareBuffer::HBL_NORMAL);
const PixelBox &pb = buffer->getCurrentLock();
d.str("");
d << "PixelBox " << pb.getWidth() << " " << pb.getHeight() << " " << pb.getDepth() << " " << pb.rowPitch << " " << pb.slicePitch << " " << pb.data << " " << PixelUtil::getFormatName(pb.format);
LogManager::getSingleton().logMessage(d.str());
buffer->unlock();

// show GUI
overlay = OverlayManager::getSingleton().getByName("Example/DynTexOverlay");
overlay->show();
}

void destroyScene(void)
{
// Free resource pointers before shutdown
ptex.setNull();
buffer.setNull();
}

};

#ifdef __cplusplus
extern "C" {
#endif

#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
DynTexApplication app;

try {
app.go();
} catch( Ogre::Exception& e ) {
#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
MessageBox( NULL, e.getFullDescription().c_str(), "An exception has occured!", MB_OK | MB_ICONERROR | MB_TASKMODAL);
#else
std::cerr << "An exception has occured: " <<
e.getFullDescription().c_str() << std::endl;
#endif
}

return 0;
}

#ifdef __cplusplus
}
#endif


Jadi,pada listing diatas,akan menghasilkan output berbentuk texture.
Nah,jika kita memencet angka 7 atau 8 dan 4 atau 5 akan memberikan efek perubahan texture.
Hasilnya menjadi seperti ini:









View full article and comment >>>

LP Pertemuan 7 kelas 1IA12

LP pertemuan 7:
1. Jelaskan apa yang kamu ketahui tentang form!
2. Sebutkan dan jelaskan properties dan event yang dimiliki oleh form (min. 5)!
3. Jelaskan apa perbedaan antara MDI dan SDI form





View full article and comment >>>

Sabtu, 02 April 2011

OGRE game engine



Oke..sekarang saya akan membahas ttg ogre game engine.
Ogre,hmm ogre disini bukan monster rawa hijau yang ada di film SHREK.hehee
Jadi,apa sih ogre itu??
OGRE (Object-Oriented Graphics Rendering Engine) adalah engine yang object oriented & flexible 3D rendering pada game engine yang ditulis dalam bahasa C++ serta didesain untuk mampu men-developer dengan intuitif & mudah kepada aplikasi produksi dengan menggunakan utility hardware-accelerated 3D graphic. Gambaran abstraknya OGRE menggunakan sistem library seperti Direct3D & OpenGL, serta menyediakan sebuah dasar interface di dunia objek dan class object yang lebih tinggi.




Informasi Umum

OGRE hanyalah rendering engine. Seperti pada engine lainnya, hanya saja OGRE pada umumnya hanya sebagai graphic rendering. Dengan kata lain fitur OGRE hanya khusus menangani vector & matrix classes, memory handling, dan lain-lain. Ini bukanlah salah satu dari semua solusi dalam istilah game development / simulasi, OGRE tidak menyediakan audio / physics support.

Pada umumnya ini bisa dikatakan sebagai kelemahan utama dari OGRE, tetapi itu setara setelah melihat kemampuan grafis ada engine ini. Kemempuan utama OGRE adalah graphics engine yang bisa memberikan para developer sebuah kebebasan untuk menggunakan physics apapun, input, audio, & library lainnya. OGRE memberikan para tim development untuk fokus pada graphics daripada beberapa sistem-sistem yang ada dalam game development. OGRE dapat mensuport OIS, SDL, dan CEGUI libraries.

Sekarang ini OGRE adalah publish dibawah dua lisensi, yaitu LGPL & OUL. Maka sekarang ini para publish tersebut membuka OGRE sebagai free / open-source software.

Fitur-fitur dalam ogre

Fitur-Fitur yang terdapat pada OGRE yaitu:
* Desain yang berobject oriented dengan menggunakan plug-in untuk mempermudah memasukkan fitur lainnya.
* Engine berbasis scane graph dengan bantuan untuk sebuah varietas yang luas, octree, BSP, & Paging Landscape scene manager.
* Multi-platform dengan dukungan OpenGL & Direct3D. Bisa merender konten yang sama di beda platform tanpa harus mempunyai content creator. Dapat diakses pada platform Linux, Mac OS X, dan semua versi Windows.
* OGRE mendukung program Vertex dan Fragment selama ditulis dengan GLSH, HLSL, Cg, dan assembler.
* The landscape scene manager untuk Progressive LOD, yang mana bisa dibuat secara otomatis & manual.
* Engine animasi yang mensuport penuh untuk multiple hardware.
* OGRE mempunyai comositing manager dengan bahasa script dan full screen postprocessing untuk efek seperti HDR, blooming, satruation, brightness, blurring, & noise.
* Libraries mempunyai fitur memory debugging & loading resource dari archive-nya.
* Tersedia konten tools untuk 3D modeler, seperti 3D Studio Max, Maya, Blender, LightWare, Milkshape, Sketchup, dsb.

Installasi Ogre dalam Windows
Ogre atau object-oriented Graphics Rendering Engine adalah open source rendering engine grafik yang ditulis dan dimaintain oleh tim inti kecil. Ogre merupakan suatu aplikasi 3D yang bersifat open source. Berikut ini adalah file-file yg dibutuhkan untuk membuat aplikasi 3D dengan library OGRE3D (Object Oriented Graphics Rendering Engine) antara lain :

* Eclipse-CPP ganymede sebagai IDE C++

* MinGW toolbox sebagai GCC opensource compiler

* MYSYS sebagai GNU Terminal environment

* OGRE3D SDK sebagai rendering engine di OGRE SDK for Code::Blocks + MinGW C++ Toolbox , perlu diperhatikan bahwa kita menggunakan MinGW sebagai c++ compilernya


1.Pertama install MinGW Toolbox dan setelah itu lakukan setting environment variable, misalkan anda menginstalnya di D:\mingw, maka dalam environment variable kita set path dengan nilai D:\mingw\bin


2.untuk mengecheck apakah MinGW sudah terinstall dengan benar, ketik gcc –v pada command prompt

3.kemudian install MYSYS, jalankan setup MYSYS-1.0.10, kemudian setting path seperti yang dilakukan untuk menginstall MinGW seperti gambar dibawah berikut


4.untuk mengechecknya ketikan uname –a dicommand prompt

5.selanjutnya install OGRE, kemudian setting variable seperti MinGW dan MYSYS diatas, tetapi kita membuat variabel system baru yang bernama OGRE_HOME


6.Lalu extractlah file eclipse hasil download dan jalankan file eclipse.exe dalam folder eclipse

7.Setelah itu kita buat project baru dengan menekan alt+shift+n lalu pilihlah C++ Project, perhatikan gambar berikut :


8.Lalu selanjutnya kita akan membuat sebuah project aplikasi 3D yang memanfaatkan OGRE.
9.pilih empty project dengan toolchains MinGW

10.lalu klik project pada bagian project explorer lalu tekan alt+enter

11.Arahkan kebagian C/C++ Build --> Settings, Klik Manage Configurations lalu klik baris Release dan tekan Set Active dan klik OK.

12.Masuk ke bagian GCC C++ Compiler pada Tool Settings, selanjutnya ikutilah petunjuk table berikut ini untuk bagian-bagian properties pada pilihan Debug dan Release. Pastikan yang aktif adalah Release.


13.Masih pada bagian Tool Setting, masuk ke bagian MinGW C++ Linker ikutilah petunjuk table berikut ini untuk bagian-bagian properties pada pilihan Debug dan Release. Pastikan yang aktif adalah Release.


14.Masuk kebagian sourcecode, masukkan contoh sourcecode

15.Build project tersebut(dari sourcode yang kamu masukkan), dan masuk kedalam direkori OgreSDK\bin\release lalu buka file resource.cfg

16.Ganti bagian ../../../ dengan fullpath lokasi OgreSDK

17.Savelah file tersebut, lalu copy semua isi direktori OgreSDK\bin\release kedalam workspace project anda khusunya direkori nama_workspace\nama_project\Release

18.Masuk ke direktori nama_workspace\nama_project\Release, jalankan file executablenya biasanya nama_project.exe maka akan muncul dialog seperti ini,
>

19.Disini kita mengkonfigurasi output yang ditampilkan, tekan OK, maka hasilnya akan tampak


Installasi Ogre dalam Ubuntu
Sebenarnya di Ubuntu Repository sudah ada Ogre3D, namun hanya terbatas pada library (pada /usr/lib/OGRE) dan development headernya (pada folder /usr/include/OGRE). Mereka disimpan pada package libogre6 dan libogre-dev. Dan juga, yang berguna, adalah dokumentasi ogre yang disimpan pada package ogre-doc

Tapi, Ubuntu tidak menyertakan Samples yang memudahkan kamu untuk mempelajari, dan terkesan, pada Ogre. Namun, menginstall Ogre dari Source pun tidak mudah. Ada beberapa hal yang perlu dicermati :

1. Ada library yg harus kamu download, yaitu Freeimage, OIS, dan Cg_toolkit. Kamu harus mendownload sourcesnya, dan melakukan kompilasi. Siap-siap ya dengan membaca file2 spt README, INSTALL dan sebagainya. Bagi kamu yang pemula, kamu hanya tinggal menjalankan ./configure, make dan make install. Itu aja kok, mudah. Tapi untuk jelasnya silahkan baca masing-masing petunjuk instalasi. Oh ya, kalau saat instalasi OIS,kamu disuruh menginstall beberapa paket yang dibutuhkan, install saja. Misalnya nanti kamu akan disuruh menginstall Automake dan sebagainya. Bisa kan menginstall mereka dengan sudo apt-get install ? Pastikan dulu nama packagenya dengan mencari dengan apt-search ya.
Download source ogre disini--> source ogre

buat lebih jelas klik disini aja--> cara install


2.Untuk menjalankan Demo ini(yang diatas), kamu harus berada di folder Samples/Common/bin dan menjalankan semua file binary hasil perintah make dari situ. Contoh untuk menjalankan demo Robot ini, perintahnya adalah ../../Robot/src/Robot, tentu dari direktori /Samples/Common/bin.

Langkah utuk instalasi Ogre 3D di Ubuntu Gutsy (setidak2nya Gutsy sudah menyediakan paket libfreeimage, jadi kamu tidak perlu download dari sourcenya).
Paket yang yg belum ada di Gutsy (klik aja untuk download-->) : OIS dan Cg Toolkit.

Instalasi OIS
Install dulu dependency :

sudo apt-get install autoconf automake1.9 libtool libxaw6-dev build-essential

membutuhkan 63.3 MB

Kemudian mulai build

make clean # bersihkan folder objek hasil kompilasi sebelumnya
./bootstrap
./configure --disable-ogre # karena ogre yg akan memanggil ois
make
sudo make install
Instalasi Cg Toolkiet
extract Cg_toolkit, dan kopi ke /usr semuanya :
cd Cg
sudo cp usr/* /usr -R

Instalasi Ogre
Install dulu dependency :
sudo apt-get install libzzip-dev libxxf86vm-dev \
libxrandr-dev libxrandr-dev libfreeimage-dev \
libcegui-mk2-dev libfreetype6-dev libdevil-dev \
libgtk2.0-dev libcppunit-dev libglut3-dev

jalankan terlebih dahulu :
aclocal

Kemudian mulai build :
./bootstrap
./configure
make
sudo make install

sumber:
- sumber1
- sumber2
- sumber3
- sumber4

View full article and comment >>>

LP Pertemuan 6 kelas 1IA12

LP pertemuan 6:
1. Sebutkan dan jelaskan tipe data yang dimiliki oleh Visual basic
2. Sebutkan dan Jelaskan bentuk umum struktur kondisi yang dimiliki oleh VB
3. Sebut dan jelaskan bentuk umum struktur perulangan yang dimiliki oleh VB



View full article and comment >>>