Pemrograman Grafis 3D dengan OpenGL dan GLUT

Tutorial ini berisi konsep 3D dan  OpenGL 3D.

Sebuah dunia 3d terdiri dari 4 elemen, yaitu objek atau grup objek, material objek, pencahayaan, dan camera,
Objek 3d dari OpenGL terdiri dari beberapa proses sebelum ditampilkan pada suatu window.

objek melewati modelview matrix -> clipping ->projection matrix -> viewport matrix -> window
sebuah matrik hanya merupakan operasi matematika matrix sederhana. Matrix-matrix mentransformasikan objek menjadi tampilan sesuai yang diinginkan.

code dibawah adalah contoh mengatur kamera

void setCamera()
{
//set the camera
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(3.3,3.3,3.0,0,0.25,0,0.0,1.0,0.0);
}

Suatu kamera mempunyai prinsip dengan mata. Pada dunia 3d sebuah kamera mempunyai titik posisi dan titik arah pandang dalam koordinat 3d x,y,z. posisi kamera sama dengan posisi “dari”mana kita melihat objek. titik arah pandang adalah arah “ke”mana mata kita memandang.

Pada OpenGL pengaturan suatu proyeksi diatur dengan mengatur matrix modelview. bisa dilihat pada code diatas bahwa ddibawah matrix model view di load suatu matriks identitas.


void cube()
{
//menggambar kubus dan transformasi tarnslasi ke titik 0.5 0.5 0.5 dan skala 1 1 1
glPushMatrix();
glTranslated(0.5,0.5,0.5);//cube
glScaled(1.0,1.0,1.0);
glutSolidCube(1.0);
glPopMatrix();
}

fungsi diatas adalah fungsi untuk menggambar model kubus solid. GLUT menyediakan objek sederhana yang langsung bisa dipanggil dengan mudah kerangka kubus dgn memanggil fungsi glutWireCube(x). Pada code diatas sebelum fungsi pemanggil obejk kubus dipanggil terjadi 2 buah transformasi yaitu skala dan rotasi. Tanpa ada push dan pop serta transformasi secara default objek akan dirender pada skala default dan posisi default yaitu x,y,z = 0 0 0.

Operasi push dan pop matriks adalah operasi penambahan stack matriks pada modelview matriks untuk transformasi. tanpa push berarti menambahkan matriks, pada code diatas ditambahkan transalasi atau pergeseran dx,dy,dz = 0,5 0,5 0,5. operasi pop . Matriks tarnsformasi dirubah dengan menambahkan translate dan scale pada stack matriks model view sehingga objek kubus yang dipanggil melalui perhitungan tarnsformasi. glPop mengeluarkan matriks tarnsformasi keluar dari tumpukan sehingga mengambalikan matriks modelview menjadi matriks identitas.

code lengkap :


#include <Windows.h>
#include <iostream>
#include <gl\GL.h>
#include <gl\GLU.h>
#include <gl\glut.h>
#include <math.h>


void cube()
{
//menggambar kubus dan transformasi tarnslasi ke titik 0.5 0.5 0.5 dan skala 1 1 1
glPushMatrix();
glTranslated(0.5,0.5,0.5);//cube
glScaled(1.0,1.0,1.0);
glutSolidCube(1.0);
glPopMatrix();
}


void setMaterial()
{
//set properties of surfaces material
GLfloat mat_ambient[] = {0.7f,0.7f,0.7f,1.0f}; // ada 4 jenis material yang dipakai, dengan kombinasi warna tertentu
GLfloat mat_diffuse[] = {0.6f,0.6f,0.6f,1.0f};
GLfloat mat_specular[] = {1.0f,1.0f,1.0f,1.0f};
GLfloat mat_shininess[] = {50.0f};
glMaterialfv(GL_FRONT,GL_AMBIENT,mat_ambient);
glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);
glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);
glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess);
}


void setLighting()
{
//set light sources
GLfloat lightIntensity[] = {0.7f,0.7f,0.7f,1.0f};//mensetting pencahayaan
GLfloat light_position[] = {2.0f,6.0f,3.0f,0.0f};
glLightfv(GL_LIGHT0,GL_DIFFUSE,lightIntensity);
glLightfv(GL_LIGHT0,GL_POSITION,light_position);
}


void setViewport()
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
double winHt = 1.0;//half height of the window
glOrtho(-winHt*64/48,winHt*64/48,-winHt,winHt,0.1,100.0);
}


void setCamera()
{
//set the camera
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(3.3,3.3,3.0,0,0.25,0,0.0,1.0,0.0);
}


void displayObject()
{
setMaterial();
setLighting();
setViewport();
setCamera();
//startDrawing
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
cube();//memanggil fungsi menggambar kubus
glFlush();//mengirim smua objek untuk dirender
}


void main(int argc, char **argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB|GLUT_DEPTH);
glutInitWindowSize(640,480);
glutInitWindowPosition(100,100);
glutCreateWindow("simple 3d scene");
glutDisplayFunc(displayObject);//fungsi dari display object yang menggabungkan kubus lighting material dan kamera
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glShadeModel(GL_SMOOTH);
glEnable(GL_DEPTH_TEST);
glEnable(GL_NORMALIZE);
glClearColor(1.0f,1.0f,1.0f,0.0f);
glViewport(0,0,640,480);
glutMainLoop();
}

output :

voila sebuah kubus berwarna abu-abu tergambar. Namun kubus tersebut kurang tampak realistis karena proyeksi yang digunakan adalah ortogonal buka persepektif. Proyeksi perspektif akan membuat objek semakin realistis dengan menghadirkan efek jauh dekat objek.

Tutorial selanjutnya akan membawas masalah animasi dan interaksi dengan keyboard dan mouse.

20 thoughts on “Pemrograman Grafis 3D dengan OpenGL dan GLUT”

  1. penjelasannya dikit banget vick…
    tambahin dong, dibahas per line code kayak laporan praktikum itu, haha
    sebagian besar masih belom paham 😥

  2. Bosss… bntuin aq donkkk …
    gini… ada tugas tuh,, bikin transformasi, nah transformasi nya bikin transformer… kasih source code nya ya buat dev c++.. pliiisss…
    thankss.. 🙂

  3. kebetulan saya jg masih belajar ,
    tp ada link bagus contoh bikin lengan robot. asal basic 3D transformasi bs bs bikin transformer cm masalah ide dan detail 3d nya 😀
    http://vrlab.epfl.ch/~ssarni/tp/exercise8.html
    dan 1 lagi ada yg namanya istilah stick person anatomy yang disitu dipake buat menggerakkan objek2 3D

    well dev C++ masih tetap C++ biasa , source code C++ apapun yg nanti kamu temuin saat cari di google bs dirubah ke project dev C++, selamat mencoba 😀

  4. aDa contoh coding perubahan benda 3D ke benda yang lain gak???misalnya dari meja menjadi robot sederhana gituu????di program dev C++……tolongg bantuannya..:-(

  5. bro pas di cmpile/run ada report error gini gmana ya bro..

    gl\glut.h: No such file or directory.

    mohon bantuannya

    1. iya, gua juga sama bgt nih errornya begini pas di run di vb2012.. kenapa ya gan, bisa bantu ngga agan vicky?

    2. untuk masalah itu, download file glut32.dll, glut32.h dan glut32.lib, untuk peletakannya searching aja, tergantung menggunakan compiler yang digunakan.

Leave a comment