Membuat Gambar 2D di Pelles C

Listing

#include <windows.h>

#include <GL/gl.h>

#include <GL/glu.h>

#include <GL/glfw.h>

#include <math.h>

#define pi 3.1415

void mulaiOpenGL(void);

int main(void)

{

// mRunning = TRUE, aplikasi masih berjalan

// mRunning = FALSE, ??? :p

GLuint mRunning = GL_TRUE;

// inisialisasi GLFW

if( glfwInit() == GL_FALSE )

{

MessageBox( NULL, “ERROR :: gagal menginisialisasi GLFW”, “Error!”, MB_OK);

return(0);

}

// buat sebuah window yang akan digunakan untuk menggambar.

if( glfwOpenWindow( 640, 480, 0, 0, 0, 0, 24, 0, GLFW_WINDOW ) == GL_FALSE )

{

MessageBox( NULL, “ERROR :: gagal membuat window”, “Error!”, MB_OK );

glfwTerminate();

return(0);

}

// Set judul yang ada di window dan Swap interval.

glfwSetWindowTitle( “Praktikum Grafik Komputer @dearresa : Baby Rocat” );

glfwSwapInterval( 1 );

// mulai OpenGL (melakukan setting awal OpenGL)

mulaiOpenGL();

// mulai looping utama program

while( mRunning )

{

// bersihkan layar dan depth buffer

glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

glLoadIdentity();

// lakukan penggambaran di sini

//————————————————————————————

gluLookAt(0,0,30,

0,0,0,

0,1,0);

//diaper

//lingkaran 1

glBegin(GL_POLYGON);

glColor3f(0,1,0);

GLfloat i,angle;

GLfloat PI = 3.14;

GLint circle_points = 100;

for (i = 1; i < circle_points; i++) {

angle = 2*PI*i/circle_points;

glVertex2f(0.0+3.60*sin(angle), 0.0+4.5*cos(angle));

glColor3f(0,1,1);

}

glEnd();

//lingkaran 2

glBegin(GL_POLYGON);

glColor3f(1,1,0);

for (i = 1; i < circle_points; i++) {

angle = 2*PI*i/circle_points;

glVertex2f(0.0+3*sin(angle), 0.0+3.75*-cos(angle));

glColor3f(1,1,1);

}

glEnd();

//badan

glBegin(GL_QUADS);

glColor3f(1, 0, 0);

glVertex2f(-4,0); glColor3f(2, 1, 2);

glVertex2f(4,0); glColor3f(1, 0, 1);

glVertex2f(4,7); glColor3f(0, 0, 1);

glVertex2f(-4,7);

glEnd();

//kaki kiri

glBegin(GL_LINES);

glColor3f(0,1,1);

glVertex2f(-1,0); glVertex2f(-1,-8);

glVertex2f(-1,-8); glVertex2f(-5,-8);

glVertex2f(-5,-8); glVertex2f(-5,-7);

glVertex2f(-5,-7); glVertex2f(-4,-7);

glVertex2f(-4,-7); glVertex2f(-4,-4);

glVertex2f(-4,-4); glVertex2f(-3,-3);

glVertex2f(-3,-3); glVertex2f(-3,0);

glEnd();

//kaki kanan

glBegin(GL_LINES);

glColor3f(0,1,1);

glVertex2f(3,0); glVertex2f(3,-3);

glVertex2f(3,-3); glVertex2f(4,-4);

glVertex2f(4,-4); glVertex2f(4,-7);

glVertex2f(4,-7); glVertex2f(5,-7);

glVertex2f(5,-7); glVertex2f(5,-8);

glVertex2f(5,-8); glVertex2f(1,-8);

glVertex2f(1,-8); glVertex2f(1,0);

glEnd();

//kepala

glBegin(GL_POLYGON);

glColor3f(1,1,0);

glVertex2f(2,8); glVertex2f(3,9);

glVertex2f(3,12); glVertex2f(2,13);

glVertex2f(-2,13); glVertex2f(-3,12);

glVertex2f(-3,9); glVertex2f(-2,8);

glEnd();

//mulut

glBegin(GL_TRIANGLES);

glColor3f(1,0,0);

glVertex2f(-1,10);

glVertex2f(1,10);

glVertex2f(0,9);

glEnd();

//mata kanan

glBegin(GL_POLYGON);

glColor3f(1,0,1);

glVertex2f(-1.5,10.5);

glVertex2f(-1,11);

glColor3f(1,1,1);

glVertex2f(-1,12);

glVertex2f(-2,12);

glVertex2f(-2,11);

glEnd();

//mata kanan

glBegin(GL_POLYGON);

glColor3f(1,0,1);

glVertex2f(1.5,10.5);

glVertex2f(2,11); glColor3f(1,1,1);

glVertex2f(2,12);

glVertex2f(1,12);

glVertex2f(1,11);

glEnd();

//leher

glBegin(GL_QUADS);

glColor3f(0,1,0);

glVertex2f(1,7);

glVertex2f(1,8);

glVertex2f(-1,8);

glVertex2f(-1,7);

glEnd();

//antena

glBegin(GL_LINES);

glColor3f(0,0,1);

glVertex2f(0,13);

glVertex2f(0,16);

glEnd();

//tangan kiri

glBegin(GL_LINES);

glColor3f(0,1,1);

glVertex2f(4,7); glVertex2f(7.5,2.75);

glVertex2f(7.5,2.75); glVertex2f(7.3,1);

glVertex2f(7.3,1); glVertex2f(6,2.1);

glVertex2f(6,2.1);

glVertex2f(4,5);

glEnd();

//tangan kanan

glBegin(GL_LINES);

glColor3f(0,1,1);

glVertex2f(-4,7); glVertex2f(-7.5,2.75);

glVertex2f(-7.5,2.75); glVertex2f(-7.2,1);

glVertex2f(-7.2,1); glVertex2f(-6,2);

glVertex2f(-6,2);

glVertex2f(-4,5);

glEnd();

//————————————————————————————

//

// tampilkan ke layar (swap double buffer)

glfwSwapBuffers();

// check input , apakah tombol esc ditekan atau tombol “close” diclick

mRunning = !glfwGetKey( GLFW_KEY_ESC ) && glfwGetWindowParam( GLFW_OPENED );

}

glfwTerminate();

return(0);

}

void mulaiOpenGL(void)

{

// Set viewport ke resolusi 640×480 viewport bisa diibaratkan

// layar monitor anda

glViewport( 0, 0, 640, 480 );

// Set mode OpenGL ke mode pryeksi (Projection) dan set proyeksi

// menggunakan proyeksi perspective, dengan sudut pandang (Field Of

// View) 60 derajat

glMatrixMode( GL_PROJECTION );

glLoadIdentity();

gluPerspective( 60.0f, 640.0f/480.0f, 0.1f, 1000.0f );

glMatrixMode( GL_MODELVIEW );

glLoadIdentity();

// Set mode gradasi warna halus (Smooth)

glShadeModel( GL_SMOOTH );

// warna yang digunakan untuk membersihkan layar

glClearColor( 0.0f, 0.0f, 0.0f, 0.0f );

// nilai untuk membersihkan depth buffer.

glClearDepth( 1.0f );

// Depth test digunakan untuk menghindari polygon yang

// tumpang tindih.

glEnable( GL_DEPTH_TEST );

glDepthFunc( GL_LEQUAL );

// beritahu OpenGL untuk menggunakan perhitungan perspective

// yang terbaik (perhitungan ini tidak bisa selalu 100% akurat)

glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST );

}

Penjelasan

gluLookAt(eyeX,eyeY,eyeZ,centerX, centerY, centerZ, upX, upY, upZ) digunakan untuk menentukan posisi awal titik koordinat X, Y, Z.

eyeX, eyeY, eyeZ = menunjukkan posisi mata kepada gambar.

centerX, centerY, centerZ = menunjukkan posisi titik-titik koordinat.

upX, upY, upZ = menunjukkan arah dari vektor.

glBegin()

glEnd()

merupakan kerangka untuk memulai menulis perintah-perintah yang akan dibuat.

Bentuk-bentuk yang tersedia, antara lain:

  • glBegin(GL_POINTS) : untuk membuat titik.
  • glBegin(GL_LINES) : untuk membuat garis.
  • glBegin(GL_TRIANGLES) : untuk membuat segitiga.
  • glBegin(GL_QUADS) : untuk membuat persegi.
  • glBegin(GL_POLYGON) : untuk membuat bentuk gambar dengan banyak sudut.

kemudian user diminta untuk menentukan tipe data dari variabel-variabel tersebut. Pada program ini digunakan tipe data Float (pecahan) yang dideklarasikan dengan huruf “f”.

perintah glColor(r,g,b) digunakan untuk menentukan warna atau campuran warna; digit pertama untuk warna merah (red), digit kedua untuk warna hijau (green), dan yang ketiga untuk warna biru (blue). Untuk membuat gradasi warna, user cukup menambahkan perintah glColor di antara 2 perintah glVerteks.

Membuat POLYGON

Jika kita telah menetapkan beberapa titik, secara otomatis program akan menghubungkan titik-titik tersebut sehingga membentuk sebuah gambar polygon. Tidak hanya digunakan untuk bangun persegi delapan, persegi enam, atau pentagon, tapi juga bentuk-bentuk lain yang memiliki banyak titik, tanpa harus bangun datar simetris.

jika user membuat 5 titik pada program di atas atau menggunakan perintah GL_QUADS, maka secara otomatis program hanya akan mengambil 4 titik pertama saja, titik-titik yang lainnya diabaikan. begitu juga pada GL_TRIANGLES, hanya 3 vertex awal saja yang digunakan, selebihnya diabaikan.

OUTPUT



About resariski

me - Resa - a girl who was born at December 16th is the youngest daughter (from 4 brothers) in my family. This is my official weblog. View all posts by resariski

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: