Transformasi dapat dilakukan pada level vertex, surface, atau objek tergantung pada posisinya dalam program. Urutan transformasi mempengaruhi hasil akhir karena operasi transformasi bersifat non-komutatif. Program mendemonstrasikan pengaruh perbedaan urutan rotasi dan translasi terhadap kubus 3D dengan menggunakan depth buffering untuk menghilangkan permukaan tersembunyi.
Bab 4 Persatuan dan Kesatuan di Lingkup Wilayah Kabupaten dan Kota.pptx
Open GL Tutorial05
1. Tutorial 05
Urutan Transformasi
Transformasi dapat dilakukan pada level vertex, level surface, maupun level obyek bergantung dimana
transformasi diletakkan dalam program. Operasi transformasi merupakan operasi yang tidak bersifat
komutatif, artinya, urutan transformasi juga sangat berpengaruh pada hasilnya. Gambar di bawah ini
memberi ilustrasi akibat urutan transformasi yang berbeda, yaitu hasil operasi “rotasi kemudian di
translasi” berbeda dengan operasi “translasi baru dirotasi”.
Program 08 di bawah ini mirip dengan Program 07, hanya sekarang obyeknya sudah berupa obyek 3D
berupa kubus. Perhatikan bagaimana kubus dibentuk dari vertex dan surface. Selain dengan
mendefinisikan obyeknya sendiri, GLUT telah menyediakan beberapa fungsi untuk menggambar
standard obyek, yaitu kubus, bola, dan poci teh. Perhatikan apa yang terjadi bila glTranslate() dan
glRotate() di fungsi mydisplay() ditukar posisinya atau diletakkan didalam salah satu
glBegin()....glEnd()
2. // OpenGL
// Program 08
// - Complex Object
// - Notice:
// 1. There are surfaces that are not correctly rendered in order.
// uncommented the GL_DEPTH
// 2. Flicker can be eliminated by using GL_DOUBLE
// Rubah rendering algoritma dengan menggunakan data struktur
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include <GL/glut.h>
float z_pos = -10.0f;
float rot = 0.0f;
void init(void);
void myKeyboard(unsigned char, int, int);
void myDisplay(void);
void myTimeOut(int);
void resize(int, int);
int main(int argc, char* argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowSize(500, 500);
glutInitWindowPosition(0, 0);
glutCreateWindow("3D Transformation");
// callbacks register
glutDisplayFunc(myDisplay);
glutKeyboardFunc(myKeyboard);
glutTimerFunc(100, myTimeOut, 0);
glutReshapeFunc(resize);
init();
glutMainLoop();
return 0;
}
void init(void)
{
glEnable(GL_DEPTH_TEST);
glClearColor(0.0, 0.0, 0.0, 1.0); // A background clear color
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0, (GLdouble)500.0 / (GLdouble)500.0, 0.0, 100.0);
glMatrixMode(GL_MODELVIEW);
}
void myDisplay(void)
4. {
switch(key)
{
case '<':
case ',':
z_pos -= 0.1f;
break;
case '>':
case '.':
z_pos += 0.1f;
break;
}
}
void myTimeOut(int id)
{
// called if timer event
// ...advance the state of animation incrementally...
rot += 10;
glutPostRedisplay(); // request redisplay
glutTimerFunc(100, myTimeOut, 0); // request next timer event
}
void resize(int width, int height)
{
glViewport(0, 0, (GLsizei)width, (GLsizei)height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0, (GLdouble)width / (GLdouble)height, 1.0, 300.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
Tambahan:
Konsep Depth Buffer. Mode display pada program di atas diberi tambahan mode GLUT_DEPTH dan
perintah glEnable(GL_DEPTH_TEST). Hal ini untuk memastikan bahwa surface digambar sesuai
dengan urutan penampakkan yang logis. Teknik ini merupakan salah satu algoritma HIDDEN
SURFACE REMOVAL. Untuk melihat apa yang terjadi bila teknik ini tidak dilakukan,
hapus/commented moda GLUT_DEPTH dan glEnable(GL_DEPTH_TEST).