Membuat Objek 3D Botol dengan OpenGL

Membuat Objek 3D Botol Menggunakan OpenGL

Dalam tutorial kali ini, kita akan membuat objek 3D berupa botol menggunakan OpenGL. Program ini menggambar objek botol secara sederhana dengan teknik wireframe (hanya menampilkan garis-garis luar objek), yang memungkinkan kita untuk melihat struktur dasar botol tersebut dari berbagai sudut pandang.

Mari kita mulai dengan langkah-langkah berikut:


1. Persiapan dan Instalasi

Sebelum memulai, pastikan Anda memiliki OpenGL dan GLUT terinstal di sistem Anda. GLUT (OpenGL Utility Toolkit) adalah library yang mempermudah pembuatan aplikasi grafis 3D menggunakan OpenGL. Jika Anda menggunakan Windows, Anda bisa mengunduh GLUT dari situs resminya atau melalui paket yang disediakan oleh IDE seperti Code::Blocks.


2. Struktur Program

Berikut adalah kode lengkap untuk menggambar botol 3D menggunakan OpenGL:

#include<windows.h>
#include<math.h>
#include<gl/glut.h>
#define PI 3.14

GLint circle_points = 40;

void Lingkaran(GLfloat px, GLfloat py, GLfloat pz, GLfloat r){
    GLint i;
    GLdouble sudut;
    glBegin(GL_LINE_STRIP);
    for(i = 0; i < circle_points; i++){
        sudut = 2 * PI * i / circle_points;
        glColor3f(1, 1, 1);
        glVertex3f(px + r * cos(sudut), py, pz + r * sin(sudut));
    }
    glEnd();
}

void Botol(GLfloat radius1, GLfloat radius2){
    GLint i;
    GLdouble theta, ntheta;
    for(i = 0; i < circle_points; i++){
        glBegin(GL_POLYGON);
        theta = (2 * PI * i / circle_points);
        ntheta = (2 * PI * (i + 1) / circle_points);
        glVertex3f(0, 0, 0);
        glVertex3f(radius1 * cos(theta), 0, radius1 * sin(theta));
        glVertex3f(radius1 * cos(ntheta), 0, radius1 * sin(ntheta));
        glVertex3f(radius1 * cos(ntheta), 2, radius1 * sin(ntheta));
        glVertex3f(radius2 * cos(ntheta), 3, radius2 * sin(ntheta));
        glVertex3f(radius2 * cos(ntheta), 4, radius2 * sin(ntheta));
        glVertex3f(radius2 * cos(theta), 4, radius2 * sin(theta));
        glVertex3f(radius2 * cos(theta), 3, radius2 * sin(theta));
        glVertex3f(radius1 * cos(theta), 2, radius1 * sin(theta));
        glVertex3f(radius1 * cos(theta), 0, radius1 * sin(theta));
        glEnd();
    }
}

void Display(void){
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(1.0, 1.0, 1.0);
    glutWireSphere(0, 20, 10);
    glRotatef(0.05, 0, 1, 0);
    Botol(1, 0.5);
    Lingkaran(0, 0, 0, 1);
    Lingkaran(0, 2, 0, 1);
    Lingkaran(0, 3, 0, 0.5);
    Lingkaran(0, 4, 0, 0.5);
    glFlush();
    glutSwapBuffers();
    glutPostRedisplay();
}

void reshape(int w, int h){
    glViewport(0, 0, (GLsizei)w, (GLsizei)h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glMatrixMode(GL_MODELVIEW);
    glOrtho(-3, 3, -1, 4, 1.5, 20);
    gluLookAt(0, 0.5, 3, 0, 0, -100, 0, 1, 0);
}

void init(void){
    glClearColor(0, 0, 0, 0);
    glPolygonMode(GL_FRONT, GL_LINE);
    glPolygonMode(GL_BACK, GL_LINE);
}

int main(int argc, char *argv[]){
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize(500, 500);
    glutInitWindowPosition(500, 200);
    glutCreateWindow("TM12-Botol");
    init();
    glutDisplayFunc(Display);
    glutReshapeFunc(reshape);
    glutMainLoop();
}

3. Penjelasan Kode

a. Lingkaran

Fungsi Lingkaran digunakan untuk menggambar lingkaran pada posisi dan radius tertentu. Fungsi ini menggunakan GL_LINE_STRIP untuk menggambar garis lingkaran.

void Lingkaran(GLfloat px, GLfloat py, GLfloat pz, GLfloat r){
    GLint i;
    GLdouble sudut;
    glBegin(GL_LINE_STRIP);
    for(i = 0; i < circle_points; i++){
        sudut = 2 * PI * i / circle_points;
        glColor3f(1, 1, 1);
        glVertex3f(px + r * cos(sudut), py, pz + r * sin(sudut));
    }
    glEnd();
}

b. Botol

Fungsi Botol menggambar bagian utama botol menggunakan banyak segi banyak yang terhubung dalam bentuk poligon untuk menciptakan ilusi botol 3D.

void Botol(GLfloat radius1, GLfloat radius2){
    GLint i;
    GLdouble theta, ntheta;
    for(i = 0; i < circle_points; i++){
        glBegin(GL_POLYGON);
        theta = (2 * PI * i / circle_points);
        ntheta = (2 * PI * (i + 1) / circle_points);
        ...
        glEnd();
    }
}

c. Fungsi Display

Fungsi Display bertanggung jawab untuk merender objek 3D ke layar, memutar objek secara perlahan dan menggambar botol serta lingkaran-lingkaran.

void Display(void){
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(1.0, 1.0, 1.0);
    glutWireSphere(0, 20, 10);
    glRotatef(0.05, 0, 1, 0);
    Botol(1, 0.5);
    Lingkaran(0, 0, 0, 1);
    Lingkaran(0, 2, 0, 1);
    Lingkaran(0, 3, 0, 0.5);
    Lingkaran(0, 4, 0, 0.5);
    glFlush();
    glutSwapBuffers();
    glutPostRedisplay();
}

d. Fungsi reshape

Fungsi reshape digunakan untuk menangani perubahan ukuran jendela sehingga tampilan tetap proporsional.

void reshape(int w, int h){
    glViewport(0, 0, (GLsizei)w, (GLsizei)h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glMatrixMode(GL_MODELVIEW);
    glOrtho(-3, 3, -1, 4, 1.5, 20);
    gluLookAt(0, 0.5, 3, 0, 0, -100, 0, 1, 0);
}

4. Menjalankan Program

  1. Kompilasi dan Jalankan:

    • Kompilasi program menggunakan IDE atau terminal.

    • Setelah dijalankan, sebuah jendela akan terbuka dan Anda akan melihat botol 3D wireframe yang perlahan berputar.

  2. Visualisasi:

    • Program ini akan menggambar botol 3D dalam mode wireframe yang akan berputar untuk menunjukkan perspektif objek dari berbagai sudut.


5. Hasil Program

Hasil program ini akan menampilkan botol 3D yang digambar menggunakan garis-garis (wireframe) di layar. Botol akan sedikit berputar untuk memberikan tampilan 3D yang dinamis. Ada juga beberapa lingkaran yang menggambarkan bagian bawah, tengah, dan leher botol. Ini memberi kesan kedalaman dan bentuk yang lebih kompleks meskipun menggunakan grafik dasar.

Codeblocks,Pemrograman C++,Pemrograman C,Matematika,Informatika,

Kesimpulan

Dengan mengikuti tutorial ini, Anda telah belajar bagaimana membuat objek 3D sederhana seperti botol menggunakan OpenGL dan GLUT. Meskipun program ini menggunakan wireframe, Anda bisa mengembangkannya lebih lanjut dengan menambahkan shading, tekstur, atau interaktivitas untuk menciptakan tampilan yang lebih menarik.

Semoga tutorial ini bermanfaat dan selamat mencoba!


Komentar