Selasa, 30 April 2013

CARA MEMBUAT OBJEK 3D MELALUI OPENGL


Konsep Dasar 3D

Yang membedakan 2 dimensi dan 3 dimensi adalah kedalaman. Kedalaman didefinisikan sebagai jarak antara viewer terhadap benda yang dia lihat. Ini berarti berbeda dengan 2 dimensi yang hanya menggunakan 2 ukuran, yaitu panjang dan lebar, maka 3 dimensi menggunakan 3 ukuran, yaitu panjang, lebar dan kedalaman. Secara geometri ketiga ukuran tersebut disimbolkan dengan sumbu x, y, dan z.

Sistem Koordinat

Salah satu sistem koordinat yang dikenal adalah sistem koordinat kartesian yang digunakan untuk membedakan lokasi atau posisi sembarang titik atau objek dengan titik atau objek yang lain. Sistem koordinat kartesian terdiri atas sistem koordinat kartesian 2 dimensi dan sistem koordinat kartesian 3 dimensi. Dalam sistem koordinat 3 dimensi terdapat satu sumbu lain selain sumbu x dan sumbu y, yaitu sumbu z yang arahnya tegak lurus terhadap sumbu x dan sumbu y. Hadirnya sumbu z menyebabkan sistem koordinat ini menjadi lebih hidup karena efek jauh dekat menjadi terlihat. Untuk lebih jelasnya, lihat pada gambar di bawah ini :

1.    BentukWire

Fungsi Wire merupakan implementasi dari object 3Dberupa kerangka benda yang berpusat pada asal pemodelan sistem koordinat. Utara dan kutub selatan bola berada di Z positif dan negatif sumbu-masing-masing dan meridian utama persimpangan sumbu X positif.

Berikut adalah list untuk bangun kerangka pada 3D:

a.    Ukuran adalah panjang sisi

void glutWireCube(GLdouble size);

b.    Fungsi glutWireSphere dan glutSolidSphere membuat bola berpusat pada asal pemodelan sistem koordinat. Utara dan kutub selatan bola berada di Z positif dan negatif sumbu-masing-masing dan meridian utama persimpangan sumbu X positif.

void glutWireSphere(GLdouble radius,GLint slices, GLint stacks);

 c.    Ukuran benda ditentukan dari dasar jari-jari alasnya.

void glutWireCone(GLdouble base, GLdouble height,GLint slices, GLint stacks);

d.    Render ditentukan melalui 12 sisi. Berpusat pada asal,dan dengan radius sama dengan kuadrat dari 3.

void glutWireTorus(GLdouble innerRadius, GLdouble outerRadius,GLint nsides, GLint rings);

e.    Renders padat atau wireframe 12-sisi biasa padat. Berpusat di sekitar asal dan dengan radius sama dengan akar kuadrat dari 3

void glutWireDodecahedron(void);

 f.     Renders padat atau wireframe 4-sisi biasa padat. Berpusat di sekitar asal dan dengan radius sama dengan akar kuadrat dari 3.

glutWiredTetrahedronvoid (void);

g.    Renders padat atau wireframe 8-sisi biasa padat. Berpusat di sekitar asal dan dengan radius sebesar 1.0.

void glutWireOctahedr5(void);

h.    Renders padat atau wireframe 20-sisi biasa padat. Berpusat di sekitar asal dan dengan radius sebesar 1.0.

void glutWireIcosahedron(void);

i.      Render dengan membuat membuat poci teh

void glutWireTeapot(GLdouble size);




BERIKUT INI CONTOH PENERAPAN SYNTAX DIATAS :

MEMBUAT WIRECUBE

    Syntax :

    #include<stdlib.h>

    #include<glut.h>

    int w=400, h=400, z=-10;

    int x1=0, y1=0, sudut=0, z1=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);

    glColor3f(0,0.5,1);

    glutWireCube(3); //kubus

    glutSwapBuffers(); //fungsi hampir sama dengan glFLush();

    }

    void resize(int w1, int h1){

    glViewport(0,0,w1,h1);

    glMatrixMode(GL_PROJECTION); //untuk mengatur proyeksi

    glLoadIdentity();

    gluPerspective(45.0,(float) w1/(float) h1, 1.0,300.0);

    glMatrixMode(GL_MODELVIEW);  //untuk mengatur display objek

    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 init(){

    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("WIRECUBE");

    gluOrtho2D(-w/2,w/2,-h/2,h/2);

    glutDisplayFunc(renderScene);

    glutReshapeFunc(resize);

    glutKeyboardFunc(myKeyboard);

    glutTimerFunc(1,timer,0);

    init();

    glutMainLoop();

    }
   

    HASIL RUNNING PROGRAM TERSEBUT :

     

                         

    Keterangan program
    Dibuat sebuah objek yang berorientasi 3D menggunakan fungsi WIRECUBE yang dapat dirotasikan terhadap sumbu x,y,z serta zoom in/out. Parameter yang terdapat pada fungsi WIRECUBE adalah void glutWireCube(GLdouble size); dimana  GLdouble size adalah parameter yang digunakan untuk menentukan ukuran besar kecil dari bentuk CUBE (Kubus) yang dibuat dengan tipe data double.
    Gambar pertama menunjukkan bahwa kubus yang dibuat dari fungsi wirecube(3); berotasi terhadap sumbu x ketika mendapat interaksi keyboard “x”.
    Gambar kedua menunjukkan bahwa kubus yang dibuat dari fungsi wirecube(3); berotasi terhadap sumbu y ketika mendapat interaksi keyboard “y”.
    Gambar ketiga menunjukkan bahwa kubus yang dibuat dari fungsi wirecube(3); berotasi terhadap sumbu z ketika mendapat interaksi keyboard “z”.
     Fungsi keyboard yang digunakan adalah

    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; } }

    Selain fungsi tombol “x”, “y”, dan “z” juga digunakan tombol “a” dan “d” yang digunakan untuk mentranslasi objek wirecube terhadap sumbu z, yang nantinya akan merubah koordinat objek tersebut menjadi mendekat / menjauh.

    Lalu maksud sudut+=10; adalah perubahan sudut yang terjadi ketika interaksi keyboard dilakukan, sehingga perputaran objek akan terjadi setiap 10 derajat.

    ·         Untuk fungsi tambahan yang digunakan adalah

    void resize(int w1, int h1){ //fungsi untuk mengatur ukuran objek perspecttive

    glViewport(0,0,w1,h1);

    glMatrixMode(GL_PROJECTION); //untuk mengatur proyeksi

    glLoadIdentity();

    gluPerspective(45.0,(float) w1/(float) h1, 1.0,300.0);

    glMatrixMode(GL_MODELVIEW);  //untuk mengatur display objek

    glLoadIdentity();

    Pada gluPerspective tersebut terdapat parameter untuk mengatur cara penampilan objek dilihat dari sudut pandang tertentu.

    Sudut yang digunakan agar objek tertampil saat di debug adalah 45 derajat. Dan batas pandang adalah 1, kemudian zoom sebesar 300px

    Dan fungsi selanjutnya adalah :

    void init(){ //fungsi inisialisasi

    glEnable(GL_DEPTH_TEST);

    glMatrixMode(GL_PROJECTION);

    glLoadIdentity();

    gluPerspective(45.0,(GLdouble) w/(GLdouble) h, 1.0,300.0);

    glMatrixMode(GL_MODELVIEW);


2 komentar:

  1. iji share blog sederhana tentang opengl

    heriadyblog.blogspot.co.id

    BalasHapus
  2. Used ford edge titanium | Tiandora, India - Tiandora, India
    › › titanium wallet titanium earrings › › titanium daith jewelry ‎ Tiandora, India — Tiandora, India titanium nail Made in India. winnerwell titanium stove

    BalasHapus