Kamis, 02 Mei 2013

MEMBUAT BONEKA DANBO MELALUI OPENGL


Gambar diatas adalah hasil outputnya,

Berikut adalah syntax yang digunakan :

#include<stdlib.h>
#include<glut.h>

int w=480, h=480, z=-20;
int x1=0, y1=0, sudut=0, z1=0, skalaX=0, skalaY=0;

void renderScene(void){
 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 glClearColor(1,1,1,1);
 glLoadIdentity();

 glTranslatef(0,0,z);
 glRotatef(sudut,x1,y1,z1);

 //kaki kanan
 glPushMatrix();
 glRotatef(-20,1,0,-1);
 glTranslatef(-1.9,-4,0);
 glColor3f(0.8,0.55,0.3);
 glScalef(1,2.5,1);
 glutSolidCube(1.3);
 glPopMatrix();

 glPushMatrix();
 glRotatef(-20,1,0,-1);
 glTranslatef(-1.901,-4.01,0.01);
 glColor3f(0,0,0);
 glScalef(1,2.5,1);
 glutWireCube(1.3);
 glPopMatrix();

 //sepatu
 glPushMatrix();
 glRotatef(-20,1,0,-1);
 glTranslatef(-1.9,-5,0);
 glColor3f(0,0.5,1);
 glScalef(1.2,1,1.5);
 glutSolidCube(1.3);
 glPopMatrix();

 //kaki kiri
 glPushMatrix();
 glRotatef(20,1,0,1);
 glTranslatef(0,-4,0);
 glColor3f(0.8,0.55,0.3);
 glScalef(1,2.5,1);
 glutSolidCube(1.3);
 glPopMatrix();

 glPushMatrix();
 glRotatef(20,1,0,1);
 glTranslatef(0.01,-4.01,0.01);
 glColor3f(0,0,0);
 glScalef(1,2.5,1);
 glutWireCube(1.3);
 glPopMatrix();


 //sepatu
 glPushMatrix();
 glRotatef(20,1,0,1);
 glTranslatef(0,-5,0);
 glColor3f(0,0.5,1);
 glScalef(1.2,1,1.5);
 glutSolidCube(1.3);
 glPopMatrix();

 //badan
 glPushMatrix();
 glTranslatef(0,0,0);
 glColor3f(0.8,0.6,0.3);
 glScalef(2,3,2);
 glutSolidCube(2);
 glPopMatrix();

 glPushMatrix();
 glTranslatef(0,0,0);
 glColor3f(0,0,0);
 glScalef(2.01,3.01,2.01);
 glutWireCube(2);
 glPopMatrix();

 //bendera
 glPushMatrix();
 glTranslatef(1,0,1.52);
 glColor3f(1,0,0);
 glScalef(1.3,0.5,1);
 glutSolidCube(1);
 glPopMatrix();

 glPushMatrix();
 glTranslatef(1,-0.5,1.53);
 glColor3f(1,1,1);
 glScalef(1.3,0.5,1);
 glutSolidCube(1);
 glPopMatrix();

 //nomor punggung
 glPushMatrix();
 glTranslatef(0,0,-1.53);
 glColor3f(1,1,1);
 glScalef(1.3,0.5,1);
 glutSolidCube(1);
 glPopMatrix();

 glPushMatrix();
 glRotatef(30,0,0,1);
 glTranslatef(-0.7,-0.73,-1.53);
 glColor3f(1,1,1);
 glScalef(0.5,2.5,1);
 glutSolidCube(1);
 glPopMatrix();

 //tangan kanan
 glPushMatrix();
 glRotatef(110,1,0,0);
 glTranslatef(-2.7,2.3,0);
 glColor3f(0.8,0.55,0.3);
 glScalef(1,3,1);
 glutSolidCube(1.3);
 glPopMatrix();

 glPushMatrix();
 glRotatef(110,1,0,0);
 glTranslatef(-2.701,2.301,0.01);
 glColor3f(0,0,0);
 glScalef(1,3,1);
 glutWireCube(1.3);
 glPopMatrix();
 
 //Sendi Kanan
 glPushMatrix();
 glTranslatef(2.6,0,0);
 glColor3f(1,0,0);
 glScalef(1,1,1);
 glutSolidSphere(1,100,100);
 glPopMatrix();

 //tangan kiri
 glPushMatrix();
 glRotatef(-120,1,0,0);
 glTranslatef(2.7,2.3,0);
 glColor3f(0.8,0.55,0.3);
 glScalef(1,3,1);
 glutSolidCube(1.3);
 glPopMatrix();

 glPushMatrix();
 glRotatef(-120,1,0,0);
 glTranslatef(2.701,2.301,0.01);
 glColor3f(0,0,0);
 glScalef(1,3,1);
 glutWireCube(1.3);
 glPopMatrix();

 //sendi kiri
 glPushMatrix();
 glTranslatef(-2.6,0,0);
 glColor3f(1,0,0);
 glScalef(1,1,1);
 glutSolidSphere(1,100,100);
 glPopMatrix();

 //Kepala
 glPushMatrix();
 glTranslatef(0,3.5,0);
 glColor3f(0.8,0.6,0.3);
 glScalef(1.5,1,1);
 glutSolidCube(5);
 glPopMatrix();

 glPushMatrix();
 glTranslatef(0,3.5,0);
 glColor3f(0,0,0);
 glScalef(1.501,1,1);
 glutWireCube(5);
 glPopMatrix();

 //mata
 glPushMatrix();
 glTranslatef(-1.5,3.5,0.55);
 glColor3f(0,0,0);
 glutSolidSphere(2,100,100);
 glPopMatrix();

 //mata
 glPushMatrix();
 glTranslatef(1.5,3.5,0.55);
 glColor3f(0,0,0);
 glutSolidSphere(2,100,100);
 glPopMatrix();

 //mulut
 glPushMatrix();
 glRotatef(-65,1,0,0);
 glTranslatef(0,-1.1,2.8);
 glScalef(0.3,0.3,0.3);
 glColor3f(0,0,0);
 glutSolidCone(3,3,3,3);
 glPopMatrix();

 //bola
 glPushMatrix();
 glTranslatef(1.3,-5,1);
 glColor3f(0.9,0.9,0);
 glutSolidSphere(1,100,100);
 glPopMatrix();

 glutSwapBuffers();
}

void resize(int w1,int h1){
 glViewport(0,0,w1,h1);
 glMatrixMode(GL_PROJECTION);
 glLoadIdentity();
 gluPerspective(45.0,(float) w1/(float) h1, 1.0,300.0);
 glMatrixMode(GL_MODELVIEW);
 glLoadIdentity();
}

void myKeyboard(unsigned char key, int x, int y){
 if (key =='a') z+=5;
 else if (key == 'd') z-=5;
 else if (key == 'x') {
  x1=1;
  y1=0;
  z1=0;
  sudut+=10;
 }
 else if (key == 'y') {
  y1=1;
  x1=0;
  z1=0;
  sudut+=-10;
 }
 else if (key == 'z') {
  y1=0;
  x1=0;
  z1=1;
  sudut+=-10;
 }
}

void mySpecialKeyboard(int key, int x, int y){
 switch(key){
  case GLUT_KEY_UP:
   z+=5;
  break;
  case GLUT_KEY_DOWN:
   z-=5;
  break;
 }
}

void init(){
 glClearColor(0,0,0,1);
 glEnable(GL_DEPTH_TEST);
 glMatrixMode(GL_PROJECTION);
 glLoadIdentity();
 gluPerspective(45.0,(GLdouble) w/(GLdouble) h, 1.0,300.0);
 glMatrixMode(GL_MODELVIEW);
}

void timer(int value){
 glutPostRedisplay();
 glutTimerFunc(50,timer,0);
}

void main (int argc, char **argv){
 glutInit(&argc, argv);
 glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH | GLUT_RGBA);
 glutInitWindowPosition(100,100);
 glutInitWindowSize(w,h);
 glutCreateWindow("3D - Cristiano RoDANBO");
 gluOrtho2D(-w/2,w/2,-h/2,h/2);
 glutDisplayFunc(renderScene);
 glutReshapeFunc(resize);
 glutKeyboardFunc(myKeyboard);
 glutSpecialFunc(mySpecialKeyboard);
 glutTimerFunc(1,timer,0);
 init();
 glutMainLoop();
}


·         Fungsi – fungsi yang digunakan untuk menyusun objek tersebut menjadi sebuah boneka adalah sbb :
o   glutSolidSphere(1,100,100);
o    glutSolidCone(3,3,3,3);
o   glutSolidCube(5);
o   glutWireCube(5);

Perbedaan rendering objek dengan tipe wire dan solid adalah, jika kita menggunakan wire maka objek yang terbuat akan terlihat / terbentuk akan membentuk suatu bangun 3D yang dengan outlinenya saja. Sedangkan jika menggunakan solid, objek yang terlihat / terbentuk akan membentuk suatu bangun 3D dengan isian bangun tersebut (fill). Pada hasil debug berupa output bisa kita lihat yakni danbo tersebut terbentuk dari SolidCube sedabgkan untuk garis luar berwarna hitamnya menggunakan WireCube.  
Selain membuat objek – objek 3D tersebut dan menyusunya menjadi sebuah boneka, pada program ini juga ditambahkan interaksi keyboard a,d & x,y,z untuk memberikan efek translasi dan rotasi objek. Sehingga danbo tersebut dapat diputar / didekat – jauh kan dengan interaksi keyboard yang sudah ditentukan.

0 komentar:

Posting Komentar