Pages - Menu

Rabu, 01 Mei 2013

Menggambar Objek Dua Dimensi Dengan OpenGL


                Grafik komputer dua dimensi (2D) adalah pembuatan objek gambar dengan menggunakan dua titik sebagai acuannya, yaitu sumbu x dan y. Karakteristik pada grafik komputer 2D adalah terlihat dari tampilan objeknya yang datar, tidak beruang, berupa struktur garis dan tampilan frame layarnya terbatas. Dalam grafika komputer, objek 2D memiliki keunggulan di antaranya adalah kemudahan dalam membuat gambar dan tidak memerlukan waktu banyak untuk meresource. 

                Selain itu, objek 2D juga memiliki kelemahan, yaitu gambar terlihat biasa saja, belum mendukung bentuk-bentuk 3D atau fenomena yang bersifat tiga dimensi, seperti pencahayaan, bayangan, pantulan, refraksi, dan sebagainya. Macam-macam objek 2D di antaranya, line, circle, arc, polygon, text, section, rectangle, ellips, donut, star, dan helix.
Salah satu implementasi dalam menggambar objek 2D dengan OpenGL adalah menggambar rumah sederhana
Objek Rumah 2D

Gambar rumah sederhana di atas dibentuk dari lebih dari satu macam objek 2D, di antaranya bangun segiempat, segitiga dan jajar genjang.
Berikut ini adalah penjelasan dari source code untuk menampilkan objek 2D berupa rumah sederhana seperti gambar di atas 

void persegi(float posx, float posy, float w, float h) {
      glBegin(GL_QUADS);
            glVertex2f(posx, posy);
            glVertex2f(posx+w, posy);
            glVertex2f(posx+w, posy-h);
            glVertex2f(posx, posy-h);
      glEnd();
}
Fungsi di atas menggunakan GL_QUADS untuk menggambar bangun segiempat sebagai badan rumah, jendela dan pintu.

void jajargenjang(float posx, float posy, float w, float h){
      glBegin(GL_QUADS);
            glVertex2f (posx,posy);
            glVertex2f (posx+(0.67*w), posy);
            glVertex2f (posx+w, posy+(0.5*h));
            glVertex2f (posx+(0.33*w), posy+(0.5*h));
      glEnd();
}

Fungsi di atas menggunakan GL_QUADS untuk menggambar bangun jajar genjang sebagai salah satu bagian dari atap rumah

void segitiga() {
      glBegin(GL_TRIANGLES);
            glVertex2f(100,0);
            glVertex2f(200,0);
            glVertex2f(150,75);
      glEnd();
           
}
Fungsi di atas menggunakan GL_TRIANGLES untuk menggambar bangun segitiga sebagai bagian atap rumah yang lain
void renderScene(void){
      glClear(GL_COLOR_BUFFER_BIT);
      glTranslatef(-100,75,0);//memindahkan semua objek ke posisi baru
            //1
            glColor3f(1., 0.4, 0.);
            jajargenjang(0,0,150,150);

            //2
            glColor3f(1.0,0.6,0.0);
            segitiga();

            //3
            glColor3f(0.6,0.5,1.);
            segiempat(0,0,200,75);

            //4
            glColor3f(1,0.2,0.2);
            segiempat(150,-5,30,70);

            //5
            glColor3f(1,1,0.2);
            segiempat(50,-5,40,30);
           
      glFlush();
}

  • Bagian 1 dari fungsi renderScene memanggil fungsi jajargenjang sebagai salah satu bagian atap rumah dan mengisinya dengan warna orange tua.
  • Bagian 2 memanggil fungsi segitiga sebagai bagian lain atap rumah dan mengisinya dengan warna orange muda
  • Bagian 3 memanggil fungsi segiempat sebagai badan rumah dan mengisinya dengan warna ungu muda
  •  Bagian 4 memanggil fungsi segiempat sebagai pintu dan mengisinya dengan warna merah
  • Bagian 5 memanggil fungsi segiempat sebagai jendela dan mengisinya dengan warna kuning


Berikut ini adalah keseluruhan source code untuk menampilkan rumah sederhana :
#include <stdlib.h>
#include <glut.h>

void jajargenjang(float posx, float posy, float w, float h){
      glBegin(GL_QUADS);
            glVertex2f (posx,posy);
            glVertex2f (posx+(0.67*w), posy);
            glVertex2f (posx+w, posy+(0.5*h));
            glVertex2f (posx+(0.33*w), posy+(0.5*h));
      glEnd();
}

void segitiga() {
      glBegin(GL_TRIANGLES);
            glVertex2f(100,0);
            glVertex2f(200,0);
            glVertex2f(150,75);
      glEnd();
           
}

void segiempat(float posx, float posy, float w, float h) {
      glBegin(GL_QUADS);
            glVertex2f(posx, posy);
            glVertex2f(posx+w, posy);
            glVertex2f(posx+w, posy-h);
            glVertex2f(posx, posy-h);
      glEnd();
}

void renderScene(void){
      glClear(GL_COLOR_BUFFER_BIT);
            glTranslatef(-100,75,0);
            glColor3f(1., 0.4, 0.);
            jajargenjang(0,0,150,150);
            glColor3f(1.0,0.6,0.0);
            segitiga();
            glColor3f(0.6,0.5,1.);
            segiempat(0,0,200,75);
            glColor3f(1,0.2,0.2);
            segiempat(150,-5,30,70);
            glColor3f(1,1,0.2);
            segiempat(50,-5,40,30);      
      glFlush();
}

void main(int argc, char **argv){
      glutInit(&argc, argv);

      glutInitDisplayMode(GLUT_DEPTH | GLUT_SINGLE | GLUT_RGBA);
      glutInitWindowPosition(100,100);
      glutInitWindowSize(640,480);
     
      glutCreateWindow("Bias | Mirza");
      gluOrtho2D(-320.0,320.0,-320.,320.);
      glutDisplayFunc(renderScene);
      glutMainLoop();
}

Tidak ada komentar:

Posting Komentar