Program Simulasi Planet (Bumi Mengelilingi Matahari) menggunakan OpengL
Sunday 9 July 2017
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.