Pada artikel ini, kita akan belajar bagaimana membuat program OpenGL untuk menggambar sebuah kerucut 3D. Kerucut ini akan digambar menggunakan segitiga untuk membentuk alas dan sisi kerucut. Kita juga akan memberikan penjelasan mendalam tentang setiap bagian kode, serta hasil yang bisa Anda harapkan saat menjalankan program ini.
Persiapan
Sebelum memulai, pastikan Anda sudah menginstal OpenGL dan GLUT pada sistem Anda. Program ini menggunakan GLUT (OpenGL Utility Toolkit) untuk menangani windowing dan interaksi pengguna, serta OpenGL untuk menggambar objek 3D.
Full Code Program
Berikut adalah kode lengkap untuk membuat kerucut menggunakan OpenGL:
#include<windows.h>
#include<math.h>
#include<gl\glut.h>
#define PI 3.14
GLint circle_points = 40; // Jumlah titik pada lingkaran basis kerucut
// Fungsi untuk menggambar kerucut
void MyCone(GLfloat radius, GLfloat tinggi){
GLint i;
GLdouble theta, ntheta;
// Membuat beberapa segitiga untuk kerucut
for(i = 0; i < circle_points; i++){
glBegin(GL_POLYGON);
// Menentukan sudut untuk tiap titik pada lingkaran
theta = (2 * PI * i / circle_points);
ntheta = (2 * PI * (i + 1) / circle_points);
// Menambahkan vertex untuk membuat segitiga pada kerucut
glVertex3f(radius * cos(theta), 0, radius * sin(theta)); // Titik 1
glVertex3f(0, tinggi, 0); // Titik apex (puncak) kerucut
glVertex3f(radius * cos(ntheta), 0, radius * sin(ntheta)); // Titik 2
glEnd();
}
}
// Fungsi untuk menampilkan objek
void Display(void){
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0, 1.0, 1.0); // Warna putih untuk objek
// Menggambar bola wireframe dengan glut
glutWireSphere(0, 20, 10);
// Melakukan rotasi sedikit pada objek
glRotatef(0.05, 0, 0, 1);
// Memanggil fungsi untuk menggambar kerucut
MyCone(0.5, 1);
glFlush();
glutSwapBuffers();
glutPostRedisplay();
}
// Fungsi untuk menangani perubahan ukuran jendela
void reshape(int w, int h){
glViewport(0, 0, (GLsizei)w, (GLsizei)h); // Menyesuaikan viewport dengan ukuran jendela
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glMatrixMode(GL_MODELVIEW);
glOrtho(-1.5, 1.5, -1.5, 1.5, 1.5, 20); // Menentukan proyeksi ortogonal
gluLookAt(0, 0, 3, 0, 0, -100, 0., 1., 0.); // Menyusun kamera
}
// Fungsi untuk inisialisasi parameter-parameter OpenGL
void init(void){
glClearColor(0, 0, 0, 0); // Mengatur latar belakang menjadi hitam
glPolygonMode(GL_FRONT, GL_LINE); // Menampilkan garis untuk sisi depan
glPolygonMode(GL_BACK, GL_LINE); // Menampilkan garis untuk sisi belakang
}
// Fungsi utama program
int main(int argc, char* argv[]){
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); // Mengatur mode tampilan
glutInitWindowSize(450, 450); // Menentukan ukuran jendela
glutInitWindowPosition(500, 200); // Menentukan posisi jendela
glutCreateWindow("TM12-Kerucut"); // Membuat jendela dengan judul
init(); // Inisialisasi OpenGL
glutDisplayFunc(Display); // Menentukan fungsi untuk menampilkan objek
glutReshapeFunc(reshape); // Menentukan fungsi untuk menangani perubahan ukuran jendela
glutMainLoop(); // Memulai loop glut
}
Penjelasan Kode Program
-
Header Files
-
windows.h
: Untuk mengakses fungsi-fungsi sistem operasi Windows. -
math.h
: Untuk fungsi matematika seperticos
dansin
, digunakan untuk perhitungan sudut. -
glut.h
: Pustaka GLUT yang menangani tampilan, jendela, dan interaksi pengguna di OpenGL.
-
-
Deklarasi Konstanta dan Variabel
-
PI
: Digunakan untuk menghitung nilai sudut dalam radian. -
circle_points
: Menentukan jumlah segmen yang digunakan untuk menggambar lingkaran alas kerucut.
-
-
Fungsi
MyCone
Fungsi ini menggambar kerucut dengan menggunakan segitiga. Setiap segitiga menghubungkan dua titik pada lingkaran dengan puncak kerucut.void MyCone(GLfloat radius, GLfloat tinggi){ 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(radius * cos(theta), 0, radius * sin(theta)); glVertex3f(0, tinggi, 0); glVertex3f(radius * cos(ntheta), 0, radius * sin(ntheta)); glEnd(); } }
-
Fungsi
Display
Fungsi ini mengatur pembersihan layar, menggambar objek-objek (seperti bola dan kerucut), serta melakukan rotasi objek untuk menghasilkan efek gerakan.void Display(void){ glClear(GL_COLOR_BUFFER_BIT); // Membersihkan buffer warna glColor3f(1.0, 1.0, 1.0); // Mengatur warna objek menjadi putih glutWireSphere(0, 20, 10); // Menggambar bola wireframe glRotatef(0.05, 0, 0, 1); // Memutar objek sedikit MyCone(0.5, 1); // Memanggil fungsi untuk menggambar kerucut glFlush(); glutSwapBuffers(); // Menukar buffer untuk menghasilkan tampilan akhir glutPostRedisplay(); // Meminta tampilan di-refresh }
-
Fungsi
reshape
Fungsi ini digunakan untuk menangani perubahan ukuran jendela dan memastikan tampilan objek tetap proporsional.void reshape(int w, int h){ glViewport(0, 0, (GLsizei)w, (GLsizei)h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glMatrixMode(GL_MODELVIEW); glOrtho(-1.5, 1.5, -1.5, 1.5, 1.5, 20); gluLookAt(0, 0, 3, 0, 0, -100, 0., 1., 0.); }
-
Fungsi
init
Fungsi ini digunakan untuk menginisialisasi parameter OpenGL seperti pengaturan latar belakang dan mode polygon.void init(void){ glClearColor(0, 0, 0, 0); // Mengatur latar belakang menjadi hitam glPolygonMode(GL_FRONT, GL_LINE); // Menampilkan garis untuk sisi depan glPolygonMode(GL_BACK, GL_LINE); // Menampilkan garis untuk sisi belakang }
-
Fungsi
main
Fungsi utama yang memulai program dengan membuat jendela, menginisialisasi OpenGL, dan menjalankan loop GLUT.int main(int argc, char* argv[]){ glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowSize(450, 450); glutInitWindowPosition(500, 200); glutCreateWindow("TM12-Kerucut"); init(); glutDisplayFunc(Display); glutReshapeFunc(reshape); glutMainLoop(); }
Hasil Program
Ketika Anda menjalankan program ini, Anda akan melihat:
-
Sebuah kerucut 3D dengan basis lingkaran yang terdiri dari beberapa segmen segitiga.
-
Kerucut ini akan berputar sedikit berkat rotasi yang diterapkan di fungsi
Display
. -
Latar belakang aplikasi adalah hitam, dengan objek kerucut yang digambar dalam mode wireframe (garis).
-
Selain itu, program juga menampilkan bola wireframe sebagai objek tambahan.
Komentar
Posting Komentar