Menu

Kamis, 23 Mei 2013

Pembuatan kandang sapi sederhana dengan openGl (proyek komgraf)

Assalamualaikum wr wb
Sudah sekian lama blog ini ditinggalkan, akhirnya ada juga kesempatan untuk mengisi kembali . Tema posting kali ini adalah tugas kuliah, tepatnya mata kuliah komputer grafik. Bagi rekan-rekan sekalian yang tidak tahu apa itu komgraf, mungkin saya akan mengulasnya sedikit mengenai hal ini. Komputer grafik atau kebalikannya grafika komputer adalah bagian dari ilmu komputer yang berkaitan dengan pembuatan dan manipulasi gambar visual secara digital (wikipedia). Kasus kali ini adalah sebagian dari materi yang terdapat pada komputer grafik (singkatannya komgraf), yaitu membuat beberapa objek dengan menggunakan openGl di C. Objek yang dibuat pada kasus ini adalah anjing yang sedang menjaga sapi di kandang. Screenshot dari pemodelanya seperti dibawah ini 

 Hal yang pertama kita lakukan adalah membaca literatur terlebih dahulu mengenai fungsi dasar dari openGl, yaitu bagaimana membuat objek pemodelan, pergerakan, pencahayaan, sampai penampilan pada layar. Literatur mengenai openGl dapat dilihat pada situs resminya disini. Aplikasi compiler yang saya gunakan disini adalah dev C++ ver 4.9.9.2 dengan tambahan package glut.  Anda bisa mendownload package nya disini. Setelah didownload silahkan ekstrak pada dev C++ (klik dua kali saja dengan catatan dev C++ telah diinstal). Pembuatan program pemodelan dengan glut berbeda dengan pembuatan program C biasa. Pertama , kita harus membuat projek baru dengan tahapan seperti ini:
  1. File -> new project
  2. Pilih tab multimedia, dan pilih glut (jika glut sudah diekstrak)
  3. Beri nama file project dan main nnya misalkan projectnya bernama tugas dan main nya bernama main.cpp
Source code selengkapnya adalah sebagai berikut :

#include  
#include 
#include 
#include 
#include "glm.h"

double posisiX=-5,posisiY=-4.6,posisiZ=17, rotateX=90;


GLMmodel* model1 = NULL;
GLMmodel* model2 = NULL;
GLMmodel* model3 = NULL;
GLMmodel* model4 = NULL;

int posisi=0;
void grid3d(int baris, int kolom, int z) {

    int i;

    int kiri  = -kolom / 2; //batas kiri x
    int kanan = kolom / 2; //batas kanan x
    int bawah = -baris / 2; //batas bawah y
    int atas  = baris / 2; //batas atas y

    glBegin(GL_LINES);
    glLineWidth(1);

    //Baris digambar dari atas ke bawah
    for (i = 0; i < baris + 1; i++) {
        glVertex3f(kiri, baris / 2 - i, z);
        glVertex3f(kanan, baris / 2 - i, z);
    }

    //Kolom digambar dari kanan ke kiri
    for (i = 0; i < kolom + 1; i++) {
        glVertex3f(kolom / 2 - i, bawah, z);
        glVertex3f(kolom / 2 - i, atas, z);
    }

    glLineWidth(3);
    glColor3f(0.5, 0.5, 0.5);
    glVertex3f(kiri, 0, z);
    glVertex3f(kanan, 0, z);
    glVertex3f(0, bawah, z);
    glVertex3f(0, atas, z);

    glEnd();
    
}
void awan()
{
 glEnable(GL_COLOR_MATERIAL);
 glPushMatrix();
 glColor3f(1, 1, 1);
 glutSolidSphere(10, 50, 50);
 glPopMatrix();
 glPushMatrix();
 glTranslatef(10,0,1);
 glutSolidSphere(5, 50, 50);
 glPopMatrix();
 glPushMatrix();
 glTranslatef(-2,6,-2);
 glutSolidSphere(7, 50, 50);
 glPopMatrix();
 glPushMatrix();
 glTranslatef(-10,-3,0);
 glutSolidSphere(7, 50, 50);
 glPopMatrix();
 glPushMatrix();
 glTranslatef(6,-2,2);
 glutSolidSphere(7, 50, 50);
 glPopMatrix();
 glDisable(GL_COLOR_MATERIAL);
}
void rumput()
{
 //Rumput
 glEnable(GL_COLOR_MATERIAL);
 glPushMatrix();
 glRotatef(90,0,0,1);
 glTranslatef(-6.6,-1.5,0);
 glColor3f(0,1,0.2);
 glScalef(0.11,10,10);
 glutSolidCube(4.);
 glPopMatrix();
 glDisable(GL_COLOR_MATERIAL);
 
 //tanah
 glEnable(GL_COLOR_MATERIAL);
 glPushMatrix();
 glRotatef(90,0,0,1);
 glTranslatef(-6.6,-1.5,0);
 glColor3f(0.7,0.3,0);
 glScalef(0.04,50,50);
 glutSolidCube(4.);
 glPopMatrix();
 glDisable(GL_COLOR_MATERIAL);
}
void pager()
{
 //Pager      
              glEnable(GL_COLOR_MATERIAL);
              glPushMatrix();
              glTranslatef(7,-5.5,13);
              glColor3f(0.3,0.2,0);
              glScalef(15.75,0.5,0.75);
              glutSolidCube(1);
              glPopMatrix();
              glDisable(GL_COLOR_MATERIAL);
              
              glPushMatrix();
              glTranslatef(7,-0.5,13);
              glColor3f(1,0,0);
              glScalef(15.75,0.5,0.75);
              glutSolidCube(1);
              glPopMatrix();

 for (float dep=0.5;dep<13 dep2="-4;dep2" dep="" depan="" float="" for="" glcolor3f="" gldisable="" glenable="" glpopmatrix="" glpushmatrix="" glscalef="" gltranslatef="" glutsolidcube="" kiri="" pager="">-12;dep2-=2)
       {
              glPushMatrix();
              glEnable(GL_COLOR_MATERIAL);
              glTranslatef(dep2,-3,13);
              glColor3f(0.7,0.3,0);
              glScalef(1,7,0.5);
              glutSolidCube(1);
              glDisable(GL_COLOR_MATERIAL);
              glPopMatrix();
       }

  //pagar belakang
              glPushMatrix();
              glEnable(GL_COLOR_MATERIAL);
              glTranslatef(1.2,-5.5,-13);
              glColor3f(0.3,0.2,0);
              glScalef(27.8,0.5,0.75);
              glutSolidCube(1);
              glDisable(GL_COLOR_MATERIAL);
              glPopMatrix();
              
              glPushMatrix();
              glEnable(GL_COLOR_MATERIAL);
              glTranslatef(1.2,-0.5,-13);
              glColor3f(1,0,0);
              glScalef(27.8,0.5,0.75);
              glutSolidCube(1);
              glDisable(GL_COLOR_MATERIAL);
              glPopMatrix();

  for (float dep=-10;dep<13 -10.0="" -3="" -="1;break;" 0.0="" 0.1="" 0.4="" 0.6="" 0.7="" 0.9="" 0="" 1.0="" 10.0="" 100="" 10="" 15="" 1="" 20="" 25="" 30="" 3="" 4.0="" 50.0="" 5="" 600="" 7="" 90.0="" 9="" :="" argc="" argv="" ascii="" awan="" b="" batang="" birds.obj="" birds="" break="" cahaya="" cartoon_cow.obj="" case="" char="" code="" daun="" dep="" display="" ditekan="" dog.obj="" dog="" esc="" exit="" float="" for="" gl_ambient="" gl_depth_buffer_bit="" gl_diffuse="" gl_position="" gl_shininess="" gl_specular="" glclear="" glclearcolor="" glcolor3f="" glcolor3ub="" gldepthfunc="" gldisable="" glenable="" glflush="" glfrustum="" gllightfv="" glloadidentity="" glm_material="" glm_smooth="" glmaterialfv="" glmatrixmode="" glmdraw="" glmfacetnormals="" glmunitize="" glmvertexnormals="" glpopmatrix="" glpushmatrix="" glrotatef="" glscaled="" glscalef="" gltranslatef="" glu_smooth="" glucylinder="" glulookat="" gluperspective="" gluquadricnormals="" gluquadricobj="" glut_double="" glut_key_down="" glut_key_left="" glut_key_right="" glut_key_up="" glut_rgba="" glutcreatewindow="" glutdisplayfunc="" glutinit="" glutinitdisplaymode="" glutinitwindowposition="" glutinitwindowsize="" glutkeyboardfunc="" glutmainloop="" glutpostredisplay="" glutsolidcube="" glutsoliddodecahedron="" glutsolidsphere="" glutspecialfunc="" glutswapbuffers="" gluttimerfunc="" here="" high_shininess="" imer="" init="" int="" kalau="" kanan="" key="" kode="" light_ambient="" light_diffuse="" light_position="" light_specular="" lighting="" m="" main="" mat_ambient="" mat_diffuse="" mat_specular="" matahari="" mod="" model1="" model2="" model3="" model4="" n="" pagar="" pager="" pig.obj="" pig="" pobj="" pohon="" posisix-="1;" posisix="" posisiy="" posisiz-="1;" posisiz="" pre="" presskey="" processnormalkeys="" ranting="" return="" rotatex="0;" rumput="" samp="" samping="" sapi2="" sapi3="" sapi4="" sapi="" speed="" switch="" timer="" tombol="" ugas="" unsigned="" v="" void="" x="" xrot="" y="" yrot="" ztef="">

Hal pertama yang dilakukan adalah memberikan include yang sudah tersedia di open GL. Kita akan menampilkan objek yang sudah dibuat, maka harus memasukan include glm.h dan glm.cpp di folder yang sama dengan main.cpp. berkas glm.cpp dan glm.h dapat di download disini. 

  1. Fungsi grid3d() adalah fungsi untuk membuat koordinat pada layar sehingga kita bisa mengukur letak dari objek yang akan kita buat.
  2. Fungsi awan(), rumput(), pager(), matahari(), pohon() adalah fungsi yang digunakan untuk membuat group setiap objek yang dibuat secara manual . Misalkan pada fungsi awan(), awan-awan yang terbuat dari pemodelan 3d dari solidsphere (bola) dengan tambahan fungsi pergerakan seperti glTranslatef, glRotatef, maka terbentuklah awan yang terlihat pada suatu koordinat tertentu, begitupun juga dengan objek lainnya yang terbuat dari pemodelan sederhana yang di modifikasi. 
  3. Fungsi sapi(),dog(), pig(), birds(), adalah fungsi untuk membuat bentuk objek hewan. Objek ini merupakan model import, yaitu objek yang telah di import dari sebuah model yang telah dibuat sebelumnya. ekstensi file dari model ini biasanya bertipe .obj sama seperti model yang telah dibuat pada aplikasi 3DSMAX, blender. Model import dapat digunakan jika kita sudah memberikan header glm.h dan glm.cpp pada file kita. Hal yang pertama kali dilakukan sebelum membuat objek ini adalah membuat variabel global (pada kasus ini variabel globalnya bernama model1-model4) dengan syntax GLMmodel* namamodelnya = NULL. Tahap selanjutnya adalah mengimport model di fungsi init() sebagai berikut 

    glmReadOBJ("foldernya/namaobjeknya.obj");
    glmUnitize(model);
    glmFacetNormals(model1);
    glmVertexNormals(model1, 90.0);

    Selanjutnya tampilkan di fungsi display atau di fungsi sendiri (pada kasus ini kami saya membuat fungsi sendiri sesuai nama objeknya

    glmDraw(model1,GLM_SMOOTH | GLM_MATERIAL|GLM_TEXTURE);
  4. Fungsi timer () merupakan sebuah fungsi yang dibuat untuk menggerakan objek dengan nilai waktu tertentu. Pada kasus ini objek yang digerakan adalah awan, burung, dan matahari. Objek-objek ini digerakan dengan kecepataan tertentu pada variabel speed.
  5. fungsi cahaya() merupakan sebuah fungsi yang dibuat untuk membuat pencahayaan pada setiap objek yang dikenainnya. Fungsi cahaya ini berisi beberapa fungsi dasar open GL yang berhubungan dengan pencahayaan, silahkan pelajari lebih lanjut fungsi fungsi pencahayaan pada open GL di situs resminya.
  6. fungsi init() adalah fungsi yang digunakan sebagai tempat menggambar.
  7. fungsi display() adalah fungsi yang digunakan untuk menampilkan setiap objek yang kita buat.
  8. fungsi processNormalKeys() merupakan sebuah fungsi yang menerima masukan berupa tombol keyboard alfabet maupun numerik. Objek akan melakukan aksi sesuai perintah yang telah dimasukan pada setia case tombol.
  9. fungsi processSpecialKeys() sama seperti fungsi processNormalKeys(), hanya berbeda tombol masukan, jika sebelumnya alfabet dan numeric, fungsi ini menerima masukan diluar tombol tersebut sepert f1, f2.
Berkas yang lengkap dapat didownload disini. Untuk orang yang pemula dalam komputer grafik mungkin butuh kesabaran yang ekstra untuk memahami kode-kode yang telah dijelaskan diatas , tetapi pesan dari penulis jika kalian ingin menjadi ahli di bidang graphics yaitu keep calm n never give up to try. Selamat bertemu lagi di postingan berikutnya

2 komentar:

  1. thanks for the code, boleh copy kan? saya ada tugas seperti ini juga,, :)

    BalasHapus
  2. maaf mau tanya, kenapa kok pada saat saya compile pasti terjadi error di objLoadernya ya?

    BalasHapus