Sabtu, 12 Januari 2019

PEMROGRAMAN GRAFIS 3D DENGAN OPENGL DAN GLUT



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.

Sekian dan Terimakasih. Semoga bermanfaat.


EmoticonEmoticon