Kumpulan-kumpulan
objek primitive dalam pemrograman opengl dapat membentuk seuatu objek yang
lebih kompleks. Contoh nya adalah membuat sebuah jam analog lengkap dengan
penunjuk angka , dan panah jam, menit, dan detik. Objek primitive yang
digunakan dalam membuat jam analog antara lain GL_POLYGON untuk membuat alas
jam yang berbentuk lingkaran menggunakan rumus rotasi. GL_LINES digunakan untuk
membuat 3 jarum jam yang berbeda sebagai penunjuk jam, menit, dan detik.
GL_POINTS untuk membuat titik-titik yang melingkar sebagai penunjuk angka jam.
Berdasar pada objek-objek tersebut terbentuklah sebuah kerangka gambar jam
analog yang selanjutnya akan dibuat animasi rotasi / perputaran pada
jarum-jarum yang ada pada gambar tersebut.
objek-objek
yang telah dibuat selanjutnya ditata pada fungsi callback dengan urutan
tertentu agar tindihan kombinasi objek tepat. Contohnya pemanggilan fungsi
lingkaran harus terlebih dahulu dari pada pemanggilan fungsi angka (penunjuk
angka), hal ini agar titik angka akan tampil diatas objek lingkaran, begitu
pula pada ketiga panah penunjuk fungsi panah detik harus dipanggil sebelum
panah menit, dan panah menit dipanggil sebelum fungsi panah jam.
Selanjutnya
adalah mengatur perputaran jam, perputaran jam dapat dianimasikan menggunakan
fungsi timer dengan bentuk animasi berupa perutaran jarum jam terhadap satu
titik pusat menggunakan fungsi transformasi berupa glrotate, dimana sudut
perindahannya ditentukan dengan aturan bahwa untuk melangkah menunju satu detik
maka dibutuhkan besar sudut rotas 6 derajat, hal ini karena dalam satu jam
terdapat 60 detik sehingga jarak titik yang menunjukan detik terdapat 60
sehingga sudut dalam satu lingkaran (360 derajat) dibagi dengan 30 sehingga
hasilnya adalah 6, tetapi agar arah putaran jarum searah dengan jarum jam
(berputar ke arah kanan) maka penambahan sudutnya dinegatifkan (increment).
Untuk menentukan panah menit agar sesuai dengan perputaran panah detik maka
sudut untuk perpindahan panah menit yaitu sebesar 6 dibagi dengan 60. Hal ini
karena satu menit terdapat 60 detik sehingga untuk menuju titik satu menit (6
derajat) panah tersebut harus menempuh 60 titik sudut. Sedangkan panah jarum
jam diputar dengan ketentuan sudut perpindahan rotasi 6 derajat dibagi 720
derajat hal ini karena satu jam ditempuh ditempuh selama 60 menit sedangkan
angka pada jarum jam sebanyak 12 sehingga sudut perputaran rotasi sebesar 6
dibagi dengan 720 derajat.
berikut Script lengkap untuk membuat sebuah animasi jam analog menggunakan openGl :
#include <stdlib.h>
#include <glut.h>
#include <math.h>
#define PI 3.1415926535
float sudut = 0;
int i,n;
void lingkaran(int radius, int jumlah_titik, int x_tengah, int y_tengah) {
glBegin(GL_POLYGON);
for (i=0;i<=360;i++){
float sudut=i*(2*PI/jumlah_titik);
float x=x_tengah+radius*cos(sudut);
float y=y_tengah+radius*sin(sudut);
glVertex2f(x,y);
}
glEnd();
}
void panahJam(){
glLineWidth(10);
glBegin(GL_LINES);
glColor3f(0,0,0);
glVertex2i(0,0);
glVertex2i(0,150);
glEnd();
}
void panahMenit(){
glLineWidth(10);
glBegin(GL_LINES);
glColor3f(1,1,1);
glVertex2i(0,0);
glVertex2i(0,200);
glEnd();}
void panahDetik(){
glLineWidth(10);
glBegin(GL_LINES);
glColor3f(1,0,0);
glVertex2i(0,0);
glVertex2i(0,200);
glEnd();
}
void point(){
glPointSize(10);
glBegin(GL_POINTS);
glColor3f(0,0,0);
glVertex2i(0,0);
glEnd();
}
void angka(float jarak, float x, float y) {
glPointSize(10);
glBegin(GL_POINTS);
glColor3f(0,0,0);
for(n=0;n<360;n+=30)
glVertex2f(jarak*(float)sin(n*PI/180.0)+x,jarak*(float)cos(n*PI/180.0)+y);
glEnd();
}
void renderScene(void){
glClear(GL_COLOR_BUFFER_BIT);
glClearColor(1,1,1,1);
glPushMatrix();
glColor3f(1.0,0.6,0.0);
lingkaran(250,100,0,0);
angka(230.,0.,0.);
glPopMatrix();
glPushMatrix();
glRotatef(sudut,0,0,1);
panahDetik();
glPopMatrix();
glPushMatrix();
glRotatef(sudut/60,0,0,1);
panahMenit();
glPopMatrix();
glPushMatrix();
glRotatef(sudut/720,0,0,1);
panahJam();
glPopMatrix();
point();
glFlush();
}
void timer(int value){
sudut-=6;
glutPostRedisplay();
glutTimerFunc(100,timer,0);
}
void main (int argc, char **argv){
glutInit(&argc, argv);
glutInitWindowPosition(100,100);
glutInitWindowSize(300,300);
glutCreateWindow("ANJAR DWI R & DWI PANGLIPURINGTIAS");
gluOrtho2D(-300.,300.,-300.,300.);
glutDisplayFunc(renderScene);
glutTimerFunc(100,timer,0);
glutMainLoop();
}
0 komentar:
Posting Komentar