Membuat Kreasi Kursi Goyang Menggunakan OpenGL

Komputer Grafis adalah cabang dari Ilmu Komputer dan berkaitan dengan manipulasi visual content dan proses sistesisnya secara digital. Walaupun istilah ini sering mengacu kepada komputer grafik 3 dimensi, tetapi sebenarnya juga mencakup grafik 2 dimensi dan pengolahan citra.
Grafik meliputi gambar dan pencitraan lain yang dihasilkan oleh komputer berbentuk garis, lengkungan, kurva dan sebagainya. Komputer dapat menghasilkan pencitraan dalam sejumlah pixel, dan printer dot matrix akan mencetak citra/gambar tersebut dalam sejumlah titik.
Perkembangan grafika komputer menuntut para pengembang sistem aplikasi grafika komputer untuk dapat mengembangkan suatu informasi yang dilengkapi dengan visualisasi dan animasi, agar dapat lebih mudah dipahami oleh pihak yang menggunakan sistem tersebut. Grafika komputer telah menunjukkan kemajuan yang pesat dalam pengembangan berbagai aplikasi untuk menghasilkan gambar.
Grafika komputer digunakan untuk menunjang berbagai bidang dengan teknologi grafika berbasis komputer. Penggunaan grafika komputer telah lama digunakan dalam beberapa macam aplikasi, diantaranya pendidikan, kedokteran, fisika, matematika, multimedia, dan lain-lain. Pada saat ini grafika komputer sudah digunakan pada bidang sains, engineering, kedokteran, bisnis, industri, pemerintahan, seni, hiburan, iklan, pendidikan, dan lain-lain. Oleh karena itu, sudah semakin banyak pula bahasa pemrograman yang dilengkapi dengan tools/library pembuatan grafik Salah satu tools/library pembuatan aplikasi grafik adalah OpenGL (Open Graphics Library). OpenGL (Open Graphics Library) adalah suatu spefikasi grafik yang low-level yang menyediakan fungsi untuk pembuatan grafik primitif termasuk titik, garis, dan lingkaran. OpenGL digunakan untuk mendefinisikan suatu objek, baik objek 2 dimensi maupun objek 3 dimensi.
OpenGL juga merupakan suatu antarmuka pemrograman aplikasi (applicationprogramming interface (API) yang tidak tergantung pada piranti dan platform yangdigunakan, sehingga OpenGL dapat berjalan pada sistem operasi Windows, UNIX dansistem operasi lainnya. OpenGL pada awalnya didesain untuk digunakan pada bahasapemrograman C/C++, namun dalam perkembangannya OpenGL dapat juga digunakandalam bahasa pemrograman yang lain seperti Java, Tcl, Ada, Visual Basic, Delphi,maupun Fortran. Namun OpenGL di-package secara berbeda-beda sesuai dengan bahasapemrograman yang digunakan.
Grafika komputer pada dasarnya adalah suatu bidang ilmu komputer yang mempelajaricara-cara untuk meningkatkan dan memudahkan komunikasi antara manusia denganmesin (komputer) dengan jalan membangkitkan, menyimpan, dan memanipulasi gambar model suatu objek menggunakan komputer. Grafika komputer memungkinkan kita untuk berkomunikasi lewat gambar-gambar, bagan-bagan, dan diagram-diagram. Grafikakomputer dikembangkan melalui suatu sistem operasi yang berbasis GUI (Graphical UserInterface). Graphical User Interface (GUI), dalam hubungannya dengan sains komputer,adalah suatu antarmuka berbentuk tampilan yang memungkinkan seorang user untuk memilih perintah, menjalankan program, melihat serangkaian file dan memilih opsi laindengan menunjukkan representasi gambar (icon) ataupun melalui sejumlah menu padalayar komputer. Beberapa kemajuan utama dalam computer grafik 3D:
1.        Flat shading à suatu teknik shades masing-masing polygon dari suatu objek berdasarkan pada polygon “normal” dan posisi serta intensitas sumber cahaya.
2.        Gouraud shading à ditemukan oleh Henri Gouraud pada tahun 1971 dengan teknik resource-conscious yang digunakan untuk menirukan shade dengan permukaanlembut dan penyisipan warna puncak antarpermukaan polygon.
3.        Texture mapping à suatu teknik untuk menirukan detail permukaan denganpemetaan gambar (tekstur) menjadi polygons.
4.        Phong shading à ditemukan oleh Bui Tuong Phong; suatu teknik shading yanglembut penyisipan yang puncak mendekati normal pencahayaan dari polygoncurved-surface dengan antarpermukaan; model pencahayaan meliputi glossyreflection dengan suatu tingkatan permukaan yang halus.
5.        Bump mapping à ditemukan oleh Jim Blinn, suatu teknik normal-perturbationyang digunakan untuk menirukan permukaan yang tidak rata atau mengerut.
6.        Ray Tracing à suatu metode berdasarkan pada prinsip fisik dari ilmu opticgeometris yang bisa menirukan pantulan berulang dan transparan.

7.        Radiosity à suatu teknik untuk global illumination yang menggunakan teoriperpindahan radiatif untuk menirukan iluminasi secara tidak langsung (yangdicerminkan)


Disini, saya akan memberikan sebuah contoh program berbahasa C menggunakan OpenGL.
Kebutuhan
Keterangan

#ifdef __APPLE__
#include <GLUT/glut.h>
#else
#include <GL/glut.h>
#endif

#include <stdlib.h>

Include yang digunakan ini adalah yang digunakan untuk MAC OS, yang berbeda dengan OS Windows, sehingga ada beberapa perbedaan pada include seperti yang digunakan di OS Windows.
int x1=0, y1=0, sudut=0, z1=0,z=0;
float x=0.0f, y=0.0f, angle=180;
GLfloat xP = 0.0f;
GLfloat yP = 0.0f;
Parameter-parameter komponen yang digunakan.
static void display(void)
{
    GLdouble eqn[4] = {0.0, -1.0, 0.0, 0.0};
    GLdouble eqn2[4] = {0.0, 0.0, 0.0, 1.0};
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
            glTranslatef(0.0f, 10.0f, 0.0f);
    glRotatef(xP, 1.0f, 0.0f, 0.0f);
            glRotatef(yP, 0.0f, 1.0f, 0.0f);
    glRotatef(x, 1.0f, 0.0f, 0.0f);
            glRotatef(y, 0.0f, 1.0f, 0.0f);
    glColor3d(1,0,0);
//Bagian Bawah
    glClipPlane (GL_CLIP_PLANE0, eqn);
    glEnable (GL_CLIP_PLANE0);
    glClipPlane (GL_CLIP_PLANE1, eqn2);
    glEnable (GL_CLIP_PLANE1);

            glPushMatrix();
        glTranslatef(-50,-150,1);
        glScalef(1,1,1);
        glRotatef(90,0,1,0);
        //glRotated(sudut,x1,y1,z1);
        glutSolidTorus(50,100,50,50);
            glPopMatrix();

            glPushMatrix();
        glTranslatef(50,-150,1);
        glScalef(1,1,1);
        glRotatef(90,0,1,0);
         //glRotated(sudut,x1,y1,z1);
        glutSolidTorus(50,100,50,50);
            glPopMatrix();

        glDisable(GL_CLIP_PLANE0);
        glDisable(GL_CLIP_PLANE1);

………….
    glPopMatrix();
    angle+=1;
            rads = angle*3.14/180;
    x = 2*cos((double) rads);
    glutSwapBuffers();
    glutPostRedisplay();
}
Penggambaran Kursi dimulai dengan void dasar ini.
angle+=0.5;
            rads = angle*3.14/180;
    x = 5*cos((double) rads);
    glutPostRedisplay();
Rumus yang digunakan untuk menggerakkan kursi goyang, di ambil dari referensi gerakan pendulum/bandul di internet
const GLfloat light_ambient[]  = { 0.0f, 0.0f, 0.0f, 1.0f };
const GLfloat light_diffuse[]  = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_position[] = { 1.0f, 2.0f, 5.0f, 0.0f };
const GLfloat mat_ambient[]    = { 0.7f, 0.7f, 0.7f, 1.0f };
const GLfloat mat_diffuse[]    = { 0.8f, 0.8f, 0.8f, 1.0f };
const GLfloat mat_specular[]   = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat high_shininess[] = { 100.0f };

Dalam Fungsi Main:
glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LESS);

    glEnable(GL_LIGHT0);
    glEnable(GL_NORMALIZE);
    glEnable(GL_COLOR_MATERIAL);
    glEnable(GL_LIGHTING);

    glLightfv(GL_LIGHT0, GL_AMBIENT,  light_ambient);
    glLightfv(GL_LIGHT0, GL_DIFFUSE,  light_diffuse);
    glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
    glLightfv(GL_LIGHT0, GL_POSITION, light_position);
    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, high_shininess);
Untuk permainan pencahayaan pada objek
void CameraView(unsigned char key, int x, int y){ //arah lihat dr kamera
    if(key == 'a')
        xP-= 5.0f;
    if(key == 'b')
        xP += 5.0f;
    if(key == 'c')
        yP -= 5.0f;
    if(key == 'd')
        yP += 5.0f;
    if(key > 356.0f)
        xP = 0.0f;
    if(key < -1.0f)
        xP = 355.0f;
    if(key > 356.0f)
        yP = 0.0f;
    if(key < -1.0f)
        yP = 355.0f;
}
Untuk melihat dari sisi kamera.dengan menekan tombol, a,b,c ,dan d
void reshape(GLsizei width, GLsizei height) {
   if (height == 0) height = 1;
       GLfloat aspect = (GLfloat)width / (GLfloat)height;
       glViewport(0, 0, width, height);
       glMatrixMode(GL_PROJECTION);
       glLoadIdentity();
       if (width >= height) {
           glOrtho(-200.0 * aspect, 200.0 * aspect, -200.0, 300.0, 900.0, -10000.0);
       }else{
           glOrtho(-300.0, 300.0, -300.0 / aspect, 300.0 / aspect, 1000.0, -10000.0);
       }
}
Menyesuaikan ukuran objek saat ukuran tampilan windows di ubah


Ini dia source code nya.


/*Daniar Dwi Pratiwi
118101093
IK 34 03
Kursi Goyang Futuristik
tekan a,b,c,atau d untuk memutar
*/
#ifdef __APPLE__
#include <GLUT/glut.h>
#else
#include <GL/glut.h>
#include <GL/glu.h>
#include<math.h>
#include<iostream>
#endif
#include <stdlib.h>

float x=0.0f, y=0.0f, angle=180;
double rads=0;
GLfloat xP = 0.0f;
GLfloat yP = 0.0f;

void reshape(GLsizei width, GLsizei height) {
   if (height == 0) height = 1;
       GLfloat aspect = (GLfloat)width / (GLfloat)height;
       glViewport(0, 0, width, height);
       glMatrixMode(GL_PROJECTION);
       glLoadIdentity();
       if (width >= height) {
           glOrtho(-200.0 * aspect, 200.0 * aspect, -200.0, 300.0, 900.0, -10000.0);
       }else{
           glOrtho(-300.0, 300.0, -300.0 / aspect, 300.0 / aspect, 1000.0, -10000.0);
       }
}

static void display(void)
{
    GLdouble eqn[4] = {0.0, -1.0, 0.0, 0.0};
    GLdouble eqn2[4] = {0.0, 0.0, 0.0, 1.0};
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
                glTranslatef(0.0f, 10.0f, 0.0f);
    glRotatef(xP, 1.0f, 0.0f, 0.0f);
                glRotatef(yP, 0.0f, 1.0f, 0.0f);
    glRotatef(x, 1.0f, 0.0f, 0.0f);
                glRotatef(y, 0.0f, 1.0f, 0.0f);
    glColor3d(1,0,0);
//Bagian Bawah
    glClipPlane (GL_CLIP_PLANE0, eqn);
    glEnable (GL_CLIP_PLANE0);
    glClipPlane (GL_CLIP_PLANE1, eqn2);
    glEnable (GL_CLIP_PLANE1);

                glPushMatrix();
        glTranslatef(-50,-150,1);
        glScalef(1,1,1);
        glRotatef(90,0,1,0);
        //glRotated(sudut,x1,y1,z1);
        glutSolidTorus(50,100,50,50);
                glPopMatrix();

                glPushMatrix();
        glTranslatef(50,-150,1);
        glScalef(1,1,1);
        glRotatef(90,0,1,0);
         //glRotated(sudut,x1,y1,z1);
        glutSolidTorus(50,100,50,50);
                glPopMatrix();

        glDisable(GL_CLIP_PLANE0);
        glDisable(GL_CLIP_PLANE1);

//Bagai Sandaran
    glPushMatrix();
        glTranslated(0.0,1.2,-70);
        glRotated(-29,0,0,2);
        glutSolidTorus(10,90,10,3);
    glPopMatrix();

    glPushMatrix();
        glTranslated(2,-5.5,-70);
        glRotated(0,1,0,2);
        glutSolidCube(66);
    glPopMatrix();

    glPushMatrix();
        glTranslated(2,-80,-70);
        glRotated(0,1,0,2);
        glScalef(2.5,1,1);
        glutSolidCube(66);
    glPopMatrix();

//Bagian Alas
    glPushMatrix();
        glTranslated(2,-116,0);
        glRotated(0,1,0,2);
        glScalef(10,0.1,10);
        glutSolidCube(20);
    glPopMatrix();

//Bagian Kaki
    glPushMatrix();
        glTranslated(-50,-160,-1);
        glRotated(0,1,0,2);
       glutSolidSphere(50,20,10);
    glPopMatrix();

    glPushMatrix();
        glColor3d(0.0,1.0,0.0);
        glTranslated(50,-160,-1);
        glRotated(0,1,0,2);
        //glScalef(2.5,0.1,40);
       glutSolidSphere(50,20,10);
    glPopMatrix();

    glPopMatrix();
    angle+=1;
                rads = angle*3.14/180;
    x = 2*cos((double) rads);
    glutSwapBuffers();
    glutPostRedisplay();
}


void CameraView(unsigned char key, int x, int y){ //arah lihat dr kamera
    if(key == 'a')
        xP-= 5.0f;
    if(key == 'b')
        xP += 5.0f;
    if(key == 'c')
        yP -= 5.0f;
    if(key == 'd')
        yP += 5.0f;
    if(key > 356.0f)
        xP = 0.0f;
    if(key < -1.0f)
        xP = 355.0f;
    if(key > 356.0f)
        yP = 0.0f;
    if(key < -1.0f)
        yP = 355.0f;
}

const GLfloat light_ambient[]  = { 0.0f, 0.0f, 0.0f, 1.0f };
const GLfloat light_diffuse[]  = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_position[] = { 1.0f, 2.0f, 5.0f, 0.0f };

const GLfloat mat_ambient[]    = { 0.7f, 0.7f, 0.7f, 1.0f };
const GLfloat mat_diffuse[]    = { 0.8f, 0.8f, 0.8f, 1.0f };
const GLfloat mat_specular[]   = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat high_shininess[] = { 100.0f };

/* Program entry point */

int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitWindowSize(640,480);
    glutInitWindowPosition(10,10);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("Kursi Goyang");
    glutReshapeFunc(reshape);
    glutKeyboardFunc(CameraView);
    glutDisplayFunc(display);
    glClearColor(1,1,1,1);
    glEnable(GL_CULL_FACE);
    glCullFace(GL_BACK);

    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LESS);

    glEnable(GL_LIGHT0);
    glEnable(GL_NORMALIZE);
    glEnable(GL_COLOR_MATERIAL);
    glEnable(GL_LIGHTING);

    glLightfv(GL_LIGHT0, GL_AMBIENT,  light_ambient);
    glLightfv(GL_LIGHT0, GL_DIFFUSE,  light_diffuse);
    glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
    glLightfv(GL_LIGHT0, GL_POSITION, light_position);

Tidak ada komentar:

Posting Komentar

Adsense