OpenGL merupakan kumpulan dari standard API yang menghubungkan software dengan hardware grafis untuk membuat tampilan gambar 2D dan 3D. Intinya OpenGL itu adalah kumpulan library untuk mengakses hardware (GL= graphical library).
Berikut ini salah satu contoh program OpenGL, yaitu simulasi bumi mengelilingi matahari dan bulan mengelilingi Bumu. Pada simulasi ini saya anggap teman teman telah mengerti dasar-dasar dari OpenGL dan telah mengerti menambahkan Library (glu32.dll, glut32.dll dan opengl32.dll) dan header (glut.h, SOIL.h) serta cara meng-Compile program.
Jika teman-teman belum mengerti silahkan bertanya.
Catatan Sebelum menjalankan program terlebih dahulu teman teman menambahkan gambar berikut pada folder yang sama dengan file coding.
Matahari = LoadGLTexture("matahari.bmp");
BUMI = LoadGLTexture("bumi.bmp");
bulan = LoadGLTexture("bulan.jpg");
langit = LoadGLTexture("Langit.jpg");
Download Library dan Header melalui ling dibawah ini.
Download Library dan Header
Baca Petunjuk diatas terlebih dahulu.
#include<windows.h>
#include<stdio.h>
#include<glut.h> // OpenGL Graphics Utility Library
#include"SOIL.h"
void display(void);
void init(void);
void keyboard(unsigned char key, int x, int y);
void reshape (int w, int h);
static void KeyPressFunc( unsigned char Key, int x, int y );
GLUquadricObj *pObject; // pointer Object
GLuint BUMI, Matahari, bulan, langit;
GLuint tex_2d;
GLuint LoadGLTexture(const char *filename)
{
// memuat file gambar secara langsung sebagai OpenGL Object
tex_2d = SOIL_load_OGL_texture(filename, SOIL_LOAD_AUTO, SOIL_CREATE_NEW_ID,
SOIL_FLAG_INVERT_Y);
// memeriksa kesalahan selama proses load
if(tex_2d == 0){
printf("SOIL loading error: %s\n", SOIL_last_result());
}
return tex_2d;
}
int main(int argc, char **argv)
{
//Untuk inisialisasi secara umum terhadap
//nilai-nilai yang ada pada library GLUT
glutInit(&argc, argv);
//Untuk inisialisasi modus display.
//bersifat double buffered, dengan warna RGB.
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
// menseting ukuran windows (lebar x panjang)
glutInitWindowSize(1000,1000);
// menseting posisi windows
glutInitWindowPosition(200,0);
//Memberi judul pada windows dengan “BELAJAR GL”
glutCreateWindow("BELAJAR GL");
init();
// Set up callback functions for key presses
// memanggil kembali fungsi glut
glutKeyboardFunc(KeyPressFunc);
glutDisplayFunc(display);
glutReshapeFunc(reshape);
//enter event loop
glutMainLoop();
system("PAUSE");
return 0; }
void init(void)
{
Matahari = LoadGLTexture("matahari.bmp");
BUMI = LoadGLTexture("bumi.bmp");
bulan = LoadGLTexture("bulan.jpg");
langit = LoadGLTexture("Langit.jpg");
glEnable(GL_TEXTURE_2D);
glShadeModel(GL_SMOOTH);
glClearColor(0.0f, 0.0f, 0.0f, 0.5f);
GLfloat mat_specular[] = {1.0, 1.0, 1.0, 1.0};
GLfloat mat_shininess[] = {50.0};
GLfloat light_position[] = {1.0, 1.0, 1.0, 1.0};
pObject = gluNewQuadric();
gluQuadricNormals(pObject, GLU_SMOOTH);
gluQuadricTexture(pObject, GL_TRUE);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_DEPTH_TEST);
glMatrixMode(GL_MODELVIEW);
}
void reshape (int w, int h)
{
glViewport (0, 0, (GLsizei) w, (GLsizei) h);
// Merubah status OpenGL ke Mode Proyeksi
glMatrixMode (GL_PROJECTION);
// memanggil matriks identitas dan dijadikan matriks (proyeksi)
glLoadIdentity();
//parameter Transformasi
gluPerspective(50.0, (GLfloat) w/(GLfloat) h, 1.0, 50.0);
//Merubah status OpenGL ke Mode View
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
//meletakkan posisi kamera di deapan object "gluLookAt()"
gluLookAt (10.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
}
// glutKeyboardFunc is called below to set this function to handle
// all normal key presses.
static void Key_r(void);
static void Key_s(void);
static void KeyPressFunc( unsigned char Key, int x, int y )
{
switch ( Key ) {
case 'R':
case 'r':
Key_r();
break;
case 's':
case 'S':
Key_s();
break;
case 27: // Escape key
exit(1);
}
}
static GLenum spinMode = GL_TRUE;
static GLenum singleStep = GL_FALSE;
static void Key_r(void)
{
if ( singleStep ) { // If ending single step mode
singleStep = GL_FALSE;
spinMode = GL_TRUE; // Restart animation
}
else {
spinMode = !spinMode; // Toggle animation on and off.
}
}
static void Key_s(void)
{
singleStep = GL_TRUE;
spinMode = GL_TRUE;
}
// mendeklarasikan variabel untuk kecepartan gerak objek.
static float HourOfDay = 0.0;
static float DayOfYear = 0.0;
static float AnimateIncrement = 24.0; // Time step for animation (hours)
void display(void){
// Clear the redering window
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
if (spinMode){
// Update the animation state
HourOfDay += AnimateIncrement;
DayOfYear += AnimateIncrement/24.0;
if(DayOfYear > 360){
DayOfYear = 1;
}
if(HourOfDay > 8640){
HourOfDay = 24;
}
//HourOfDay = HourOfDay - ((int)(HourOfDay/25))*25;
//DayOfYear = DayOfYear - ((int)(DayOfYear/365))*365;
}
// Cek Nilai
printf("Nilai HourOfDay = %.0f dan DayOfYear = %.0f \n", HourOfDay, DayOfYear);
//printf("Nilai DayOfYear = %f \n", DayOfYear);
glPushMatrix();
glDisable(GL_LIGHTING);
glBindTexture(GL_TEXTURE_2D, langit);
glutWireSphere(10.0, 360, 180);
glPopMatrix();
glPushMatrix();
// mematikan fungsi lighting
glDisable(GL_LIGHTING);
//glColor3f(1.0, 1.0, 0.0);
//glRotatef((GLfloat) rev, 0.0, 1.0, 0.0);
//glTranslatef(4.0, 0.0, 0.0);
glRotatef(360.0*DayOfYear/365.0, 0.0, 1.0, 0.0);
//glutSolidSphere(1.0, 20, 25);
glBindTexture(GL_TEXTURE_2D, Matahari);
gluSphere(pObject, 1.0, 360, 180);
// menghidupkan kembali fungsi lighting
glEnable(GL_LIGHTING);
glPushMatrix();
glDisable(GL_LIGHTING);
//glColor3f(0.0, 0.0, 1.0);
glRotatef(DayOfYear, 0.0, 1.0, 0.0);
glTranslatef(4.0, 0.0, 0.0);
glRotatef(HourOfDay, 0.0, 1.0, 0.0);
//glutSolidSphere(0.5, 15, 20);
glBindTexture(GL_TEXTURE_2D, BUMI);
gluSphere(pObject, 0.5, 360, 180);
glEnable(GL_LIGHTING);
glPushMatrix();
glDisable(GL_LIGHTING);
//glColor3f(1.0, 1.0, 1.0);
glRotatef(360.0*12.0*DayOfYear/365.0, 0.0, 1.0, 0.0);
glTranslatef(2.0, 0.0, 0.0);
//glutSolidSphere(0.2, 10, 15);
glBindTexture(GL_TEXTURE_2D, bulan);
gluSphere(pObject, 0.3, 360, 180);
glEnable(GL_LIGHTING);
glPopMatrix(); glPopMatrix();
glPopMatrix();
glutSwapBuffers();
if ( singleStep ) {
spinMode = GL_FALSE;
}
glutPostRedisplay(); // Request a re-draw for animation purposes
}
Itulah artikel tentang "Program Simulasi Planet (Bumi Mengelilingi Matahari) menggunakan OpengL". Semoga artikel ini bermanfaat bagi teman teman dan jika ada yang tidak dimengerti silahkan bertanya.
Advertisement