Selasa, 30 November 2010

Rubik 3D dengan menggunakan Pelles C

Karena menggunakan software Pelles C, maka obyek yang dibuat murni dibuat dengan coding program. Semua pengaturan yang berhubungan dengan obyek baik itu warna, ukuran serta posisi obyek berikut pergerakkan obyek tersebut diatur didalam coding program. Untuk memulai Pelles C langkahnya adalah sebagai berikut :

1. Klik start - All Programs - Pelles C for Windows - Pelles C IDE
2. Pilih File - New - Project
3. Pilih wizard yang sesuai - masukkan nama - OK
4. Kemudian next, lalu Finish
5. Double Click pada main.c
6. Maka akan muncul project area untuk menuliskan coding.
7. Coding dituliskan didalam komentar //lakukan penggambaran disini.
8. Jadi, kita mulai membuat coding di blok //lakukan penggambaran disini.
9. Selebihnya merupakan struktur yang sudah tersedia dan tidak perlu diubah - ubah.
10. Pada blok eksekusi jangan lupa untuk meletakkan kode : gluLookAt(10,10,30,0,0,0,0,1,0); supaya pada saat program dijalankan, outputnya berhasil dimunculkan. Selamat mencoba dan selamat berkreasi...


Berikut ini merupakan coding program yang dibuat :


#include
#include
#include
#include

//deklarasi variable
//===============
float put,puthor1= 90,putver,puthor2 ,puthor =0;
int kubygput;

//deklarasi prosedur
//===============
void gambarkubus();
void posisikubus();
void putar90();
void mulaiOpenGL(void);
void eksekub();

//prosedur menggmbar kubus
void gambarkubus() {
float x1= 2; //deklarasi variable untuk koordinat kubus
float x2= -2;
float y1= 2;
float y2= -2;
float z1= 2;
float z2= -2;

//penggambaran kubus
//depan
{
glBegin(GL_QUADS);
glColor3f(0.7,0,0);
glVertex3f(x1,y1,z1);
glVertex3f(x2,y1,z1);
glVertex3f(x2,y2,z1);
glVertex3f(x1,y2,z1);
glEnd();
}
//atas
{
glBegin(GL_QUADS);
glColor3f(0,0.8,0);
glVertex3f(x1,y1,z1);
glVertex3f(x2,y1,z1);
glVertex3f(x2,y1,z2);
glVertex3f(x1,y1,z2);
glEnd();
}
//kanan
{
glBegin(GL_QUADS);
glColor3f(0,0,0.8);
glVertex3f(x1,y1,z2);
glVertex3f(x1,y1,z1);
glVertex3f(x1,y2,z1);
glVertex3f(x1,y2,z2);
glEnd();
}
//belakang
{
glBegin(GL_QUADS);
glColor3f(10,10,10);
glVertex3f(x1,y1,z2);
glVertex3f(x2,y1,z2);
glVertex3f(x2,y2,z2);
glVertex3f(x1,y2,z2);
glEnd();
}
//kiri
{
glBegin(GL_QUADS);
glColor3f(0.9,0.4,0);
glVertex3f(x2,y1,z1);
glVertex3f(x2,y1,z2);
glVertex3f(x2,y2,z2);
glVertex3f(x2,y2,z1);
glEnd();
}
//bawah
{
glBegin(GL_QUADS);
glColor3f(1,1,0);
glVertex3f(x1,y2,z1);
glVertex3f(x1,y2,z2);
glVertex3f(x2,y2,z2);
glVertex3f(x2,y2,z1);
glEnd();}
}

}
//===================================
// memutar kubus separuhnya sebanyak 90'
// variable puthor1 sebagai banyaknya derajat
// puthor1 increment sampai > 90' dan berenti
//===================================
void putar90(){
if(puthor1 >=90)
puthor1+=0;
else puthor1++;
glRotatef(puthor1,0,1,0);
}

//tempat eksekusi putaran
void eksekub(){
glTranslatef(0,4.2,0);
putar90();
posisikubus();
}

void posisikubus() {
int i,j;
//(dalam sumbu z)
//tengah
//==================
gambarkubus();
glTranslatef(4.2,0,0);
gambarkubus();
glTranslatef(-8.4,0,0);
gambarkubus();
glTranslatef(0,0,4.2);
//atas
//==================
for(i=1;i<=3;i++){
gambarkubus();
glTranslatef(4.2,0,0);
}
//bawah
//==================
glTranslatef(-12.6,0,-8.4);
for(j=1;j<=3;j++){
gambarkubus();
glTranslatef(4.2,0,0);
}
glTranslatef(-8.4,0,4.2);
}

int main(void)
{
// mRunning = TRUE, aplikasi masih berjalan
// mRunning = FALSE, ???
GLuint mRunning = GL_TRUE;
//
// inisialisasi GLFW
if( glfwInit() == GL_FALSE )
{
MessageBox( NULL, "ERROR :: gagal menginisialisasi GLFW", "Error!", MB_OK);
return(0);
}
//
// buat sebuah window yang akan digunakan untuk menggambar.
if( glfwOpenWindow( 640, 480, 0, 0, 0, 0, 24, 0, GLFW_WINDOW ) == GL_FALSE )
{
MessageBox( NULL, "ERROR :: gagal membuat window", "Error!", MB_OK );
glfwTerminate();
return(0);
}
//
// Set judul yang ada di window dan Swap interval.
glfwSetWindowTitle( "Rubik Cube by  Dika Domba" );
glfwSwapInterval( 2 );
//
// mulai OpenGL (melakukan setting awal OpenGL)
mulaiOpenGL();
// mulai looping utama program
// membuat koordinat kubus
while( mRunning )
{
//
// bersihkan layar dan depth buffer
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glLoadIdentity();
//================================================== ===============
// eksekusi
//================================================== ===============
gluLookAt(10,10,30,0,0,0,0,1,0);
//untuk rotasi keseluruhan kubus
//=======================================
glRotatef(putver,1,0,0); //rotasi vertikal
glRotatef(put,0,1,0); //rotasi horizontal
//=======================================
posisikubus(); //kubus tengah
glTranslatef(0,-4.2,0);
posisikubus(); //kubus bawah
glTranslatef(0,4.2,0); //menormalkan posisi kubus
eksekub(); //eksekusi kubus
//================================================== ========
// tombol untuk menggerakan kubus kubus
//================================================== ========
if (glfwGetKey (GLFW_KEY_SPACE)) {put+= 1;
if (put> 360)put=0;}
if (glfwGetKey (GLFW_KEY_RIGHT)) {
puthor1=0;
}
if (glfwGetKey (GLFW_KEY_LEFT)) {
}
//--------------------------------------
if (glfwGetKey (GLFW_KEY_UP)) {putver += 1;
if (putver> 360)putver=0;}
if (glfwGetKey (GLFW_KEY_DOWN)) {putver += 90;
if (putver> 360)putver=0;}
//------------------------------------------------------------------------------------
//
// tampilkan ke layar (swap double buffer)
glfwSwapBuffers();
//
// check input , apakah tombol esc ditekan atau tombol "close" diclick
mRunning = !glfwGetKey( GLFW_KEY_ESC ) && glfwGetWindowParam( GLFW_OPENED );
}
glfwTerminate();
return(0);
}
void mulaiOpenGL(void)
{
//
// Set viewport ke resolusi 640x480 viewport bisa diibaratkan
// layar monitor anda
glViewport( 0, 0, 640, 480 );
//
// Set mode OpenGL ke mode pryeksi (Projection) dan set proyeksi
// menggunakan proyeksi perspective, dengan sudut pandang (Field Of
// View) 60 derajat
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
gluPerspective( 60.0f, 640.0f/480.0f, 0.1f, 1000.0f );
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
//
// Set mode gradasi warna halus (Smooth)
glShadeModel( GL_SMOOTH );
//
// warna yang digunakan untuk membersihkan layar
glClearColor( 0.9f, 0.9f, 0.8f, 0.8f );
//
// nilai untuk membersihkan depth buffer.
glClearDepth( 1.0f );
//
// Depth test digunakan untuk menghindari polygon yang
// tumpang tindih.
glEnable( GL_DEPTH_TEST );
glDepthFunc( GL_LEQUAL );
//
//beritahu OpenGL untuk menggunakan perhitungan perspective
// yang terbaik (perhitungan ini tidak bisa selalu 100% akurat)
glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST );
}

Dari semua coding diatas, maka hasilnya adalah sebagai berikut (saat rubik dijalankan ) :

Tidak ada komentar:

Posting Komentar