PENGENALAN OPENGL
A. TUJUAN
a. Mampu melakukan konfigurasi Library opengl di Visual Studio
2008
b. Mampu memahami inisialisasi fungsi openGL
c. Mampu membuat objek dasar dengan fungsi openGL
B. MATERI
a. Konfigurasi library openGL
b. Inisialisas OpenGL
D. KLASIFIKASI FUNGSI
a. Primitive : berupa geometric,
b. imagesAttribute : berupa color, line type, light, texture
c. Viewing : berupa vithrtual
d. cameraControl : turn fuction ON / OFF
e. Windowing : window, mouse, keyboard
F. INISIALISASI AWAL
Inti dari tahapan ini adalah mengatur view port dan persepektif untuk
penampilan obyek ke dalam layar monitor, viewport adalah besarnya layar
monitor(image) yang dipakai untuk menampilkanobyek, sedangkan persepektif
yang dimaksud adalah pengaturan sumbu z dalam penampilan obyek 3
dimensi,sehingga user dapat melihat obyek seolah-olah dalam bidang 3 dimensi
(X-Y-Z),selain itu penggambaran obyek yang dilakukan oleh programer juga dapat
menggunaan koordinat 3 dimensi. Selain ke dua tujuan di atas pada tahap ini juga
dilakukan koneksi awal dengan library openGL, koneksi ini dilakukan supaya
fungsi-fungsi yang di sediakan openGL dapat digunakan. Fungsi/prosedur yang
digunakan :
Pembuatan Gambar
Fungsi / Prosedur Pengertian
GL_QUARDS Untuk menggambar segi empat
GL_LINES Penggambarkan sebuah garis
glVertex3f Untuk menentukan titik 3 dimensi
glColor3f Untuk penentuan suatu warna
glLineWidth Yaitu suatu fungsi yang berfungsi
untuk mengatur tebalnya garis,
Transformasi objek
Fungsi / Prosedur Pengertian
glTranslatef(x,y,z); Parameter pertama menunjukkan translasi berdasarkan
sumbu x.
Parameter ke dua menunjukkan translasi terhadap sumbu
y.
Parameter ke tiga menunjukkan parameter terhadap
sumbu z pada kanvas.
glRotatef(sudut,x,y,z) Parameter pertama merupakan nilai perputaran sudut yang
; diinginkan.
Parameter ke dua adalah perputaran terhadap sumbu x,
parameter ke tiga merupakan perputaran terhadap sumbu
y,
Parameter ke empat6 adalah perputaran terhadap sumbu z.
Dan parameter ke dua, ke tiga, dan ke empat harus
bernilai 1 untuk menjadi sumbu putar sempurna. Dan
untuk pemberian nilainya akan menyebabkan perputaran
searah dengan jarum jam ketika diberi nilai negatif, dan
sebaliknya.
glScalef(x,y,z); Parameter pertama, kedua, dan ke tiga masing-masing
menunjukkan nilai skala untuk obyek berdasarkan sumbu
x, y, dan z. Jika nilai skala adalah 1, maka ukuran obyek
tersebut adalah tetap
B. MATERI
a. Konsep primitif objek di openGL
b. Pembuatan primitif objek di openGL
Pada primitive object dapat digunakan untuk membuat segi empat berikut
adalah pembuatan suatu objek berupa segiempat, pertama mengalami Proses
Rendering :
Segitiga
B. MATERI
a. Konsep algoritma bresenham
b. Penerapan algoritma bresenham pada openGL
C. Algoritma Bresenham
Algoritma Garis Bresenham adalah suatu algoritma yang menentukan titik-
titik dalam dimensi yang membentuk pendekatan dekat dengan garis lurus antara
dua titik yang diberikan. Pendekatan ini biasa digunakan untuk menggambar garis
pada layar komputer, karena hanya menggunakan integer penambahan,
pengurangan dan pergeseran. Algoritma ini merupakan salah satu algoritma paling
awal yang dikembangkan di bidang komputer grafis. Konsep Algoritma Bresenham
Contoh :
Diketahui 2 buah titik A(10,10) dan titik B(17,16) bila titik A sebagai titik awal dan
titik B sebagai titik akhir, tentukan titik-titik antara yang menghubungkan titik A
dan titik B sehingga membentuk garis AB dengan menggunakan algoritma
Bressenham.
void display()
{
glMatrixMode(GL_PROJECTION);
gluOrtho2D(0.0,300.0,0.0,300.0);
}
void lineBres (GLint x0, GLint y0, GLint xEnd, GLint yEnd)//rumus
{
GLint dx = (xEnd - x0);
GLint dy = (yEnd - y0);
GLint p = 2*dy-dx;
GLint twoDy = 2*dy;
GLint twoDyMinusDx = 2*(dy-dx);
GLint x,y;
glColor3f(0.0,1.0,0.0);
glPointSize(4.0);
GLint x1 = 50;
glColor3f(0.0,0.0,1.0);
glPointSize(4.0);
GLint x3 = 50;
GLint y3 = 150;
GLint x4 = 150;
GLint y4 = 150;
lineBres(x3,y3,x4,y4);
}
TUGAS
B. MATERI
a. Konsep Transformasi Objek
b. Penerapan Transformasi objek pada openGL
Jika dilihat secara analogi, hal di atas mirip dengan cara kerja kamera
dalam mengambil foto dalam bidang fotografi (cf. Gambar 4). Model ini disebut
model sintesis camera.
D. Translasi
Translasi adalah transformasi dengan bentuk yang tetap, memindahkan
objek apa adanya. Setiap titik dari objek akan ditranslasikan dengan besaran yang
sama.Dalam operasi translasi, setiap titik pada suatu entitas yang ditranslasi
bergerak dalam jarak yang sama. Pergerakan tersebut dapat berlaku dalam arah
sumbu X saja, atau dalam arah sumbu Y saja atau keduanya. Translasi juga
berlaku pada garis, objek atau gabungan objek 2D yang lain. Untuk hal ini, setiap
titik pada garis atau objek yang ditranslasi dalam arah x dan y masing -masing
sebesar tx,ty.
Program di bawah ini akan memberikan ilustrasi bagaimana transformasi
translate diimplementasikan.
E. Rotate
Rotasi artinya berputar. Ketika suatu bentuk benda sengaja diputar maka
perlu di tentukan pusat dan besar sudut putar. sedangkan translasi adalah
pergeseran. Benda yang telah berpindah dari pusatnya berarti mengalami
pergeseran, yaitu apakah dia bergerak maju mundur ataupun menuju ke atas bawah.
Rotasi berbeda dengan translasi karena perubahan posisi pada translasi
tidak mengacu pada suatu titik tertentu. Keistimewaan dari rotasi adalah jarak
antara titik pusat dengan masing-masing bagian dari obyek yang diputar akan
selalu tetap, seberapa jauh pun obyek itu diputar.
Pada sebuah game yang menggunakan grafik vektor dan grafik bitmap,
rotasi dan translasi sangat di butuhkan. Dengan basic4GL kita bisa
menggunakan source code yang tersedia yaitu :
Untuk membangkitkan rotasi pada objek 3D kita harus membuat aksis dari
rotasi dan jumlah sudut rotasi . Tidak seperti melakukan rotasi pada objek 2D
yang semua proses transformasi dilakukan di koordinat xy, sebuah rotasi objek
tiga dimensi bisa dilakukan di space manapun.
#include<stdlib.h>
#include<glut.h>
float z_pos = -10.0f; float rot = 0.0f;
void resize(int width, int height)
{
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0,(float)width / (float)height, 1.0,
300.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void putaran(int id)
{
rot += 10;
glutPostRedisplay(); // request redisplay
glutTimerFunc(100, putaran, 0); // request next timer event
}
void myKeyboard(unsigned char key, int x, int y)
{
if ((key == '<') || (key == ',')) z_pos -= 0.1f;
if ((key == '>') || (key == '.')) z_pos += 0.1f;
}
void mydisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(0.0, 0.0f, z_pos);
glRotatef(rot, 0, 1, 0);
glFlush();
glutSwapBuffers();
}
void init() {
glEnable(GL_DEPTH_TEST);
glClearColor(0.0, 0.0, 0.0, 1.0); // A Background Clear Color
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45,
(GLdouble)500.0 / (GLdouble)500.0, 0, 100);
glMatrixMode(GL_MODELVIEW);
return;
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
//blue
drawQuad();
glPopMatrix();
glPushMatrix();
glTranslatef(-450, -350, 0);
glRotatef(30, 0, 0, 1);
glScalef(0.5, 0.5, 0);
glColor3f(0, 1, 1);
//red
drawQuad();
glPopMatrix();
glPushMatrix();
//yellow
drawQuad();
glPopMatrix();
glPushMatrix();
glTranslatef(-150, 0, 0);
glScalef(0.3, 0.3, 0);
glColor3f(1, 1, 1);
//pink
drawQuad();
glPopMatrix();
glPushMatrix();
glTranslatef(450, 400, 0);
glRotatef(45, 0, 0, 1);
glScalef(0.6, 0.6, 0);
glColor3f(1, 0, 1);
//green
drawQuad();
glPopMatrix();
glPushMatrix();
glTranslatef(-50, -180, 0);
glScalef(0.4, 0.4, 0);
glColor3f(1, 1, 1);
//magenta
drawQuad();
glPopMatrix();
glPushMatrix();
glTranslatef(-400, -200, 0);
glScalef(0.4, 0.4, 0);
glColor3f(10, 0, 1);
//blue
drawQuad();
glPopMatrix();
glPushMatrix();
glTranslatef(50, 0, 0);
glScalef(0.4, 0.4, 0);
glColor3f(1, 0, 0);
//green
drawQuad();
glPopMatrix();
glPushMatrix();
glTranslatef(150, 300, 0);
glRotatef(-45, 0, 0, 1);
glColor3f(1, 1, 1);
glPopMatrix();
glFlush();
}
void main(int argc, char **argv){
glutInit(&argc, argv);
glutInitWindowPosition(100, 100);
glutInitWindowSize(480, 480);
glutCreateWindow("Implementasi Transformasi");
gluOrtho2D(-640., 640., -640., 640.);
Tugas
B. MATERI
a. Animasi Object pada OpenGL
C. Konsep Animasi pada GLUT
Dalam penggunaan glutTimerFunc dimungkinkan untuk membuat
sebuah animasi yang dikontrol oleh waktu. Fungsi dari glutPostRedisplaya
dalah mengirimkan perintah untuk mengaktifkan display secara berkala
(looping). Kemudian pada main program perlu menambahkan fungsi untuk
mengaktifkan timer function.
#include <stdlib.h>
#include <glut.h>
int x=0;
int zputer=0;
int zbalik=180;
B. MATERI
a. Interaksi perangkat keras dengan openGL
Pada bab ini akan membahas tentang bagaimana objek yang kita buat akan
berinteraksi dengan perangkat keras komputer serperti, keyboard dan mouse.
1. KONSEP INPUT KEYBOARD PADA GLUT-KEY BIASA DAN
SPECIAL KEY
'd') glTranslatef(0,-5,0);
void renderScene(void){
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.,0.,0.);
Draw();
glFlush();
glutDisplayFunc(renderScene);
glutKeyboardFunc(myKeyboard);
glutTimerFunc(30,timer,0);
Selain itu, pada keyboard juga terdapat method lain yang bisa
digunakan dalam proses input ini, yaitu: Key Press, Key Up, dan Key
Buffering.
a. Key Press
Metode ini akan memberitahukan kita pada command line tombol apa
yang sedang kita tekan. Method ini dapat dinamakan keyPressed dan pada
GLUT akan terdapat 3 parameter, satu untuk tombol yang saat itu ditekan,
dan dua untuk memberitahukan lokasi mouse ketika tombol ditekan.
Dan fungsi tersebut akan dipanggil pada fungsi main, namun callback
function-nya sedikit berbeda dari callback function yang sebelumnya.
glutKeyboardFunc(keyPressed); // memberitahukan pada GLUT
untuk menggunakan method "keyPressed" untuk tombol yang ditekan
b. Key Up
Fungsi Key Up ini adalah fungsi register yang menyimpan nilai
masukan sampai ketika tombol keyboard dilepaskan. Hal ini bisa berguna
untuk pengaturan beberapa nilai ketika suatu tombol pertama kali ditekan, dan
tetap menjaga nilai tersebut sampai tombol tersebut dilapaskan. Method sama
seperti method Key Press tadi yaitu memiliki 3 parameter yang memiliki
fungsi yang sama, hanya berbeda pada penamaannya yaitu, keyUp.
void keyUp(unsigned char key, int x, int y){
If(key == ‘a’){ // saat tombol ‘a’ ditekan
// aksi yang diberikan saat tombol ‘a’ ditekan }
}
Dan fungsi tersebut akan dipanggil pada fungsi main, namun callback
function-nya sedikit berbeda dari callback function yang sebelumnya.
glutKeyboardFunc(keyUp); // memberitahukan pada GLUT
untuk menggunakan method "keyUp" untuk tombol yang dilepas
c. Key Buffering
Method ini memungkinkan untuk penanganan terhadap tombol yang
ditekan dalam jumlah banyak dalam proyekproyek OpenGL. Seperti yang
diketahui tipe data char sama dengan byte dan dapat mengambila nilai integer
dari 0 sampai 255. Ini dikarenakan tipe data char memiliki ukuran 28 atau 256.
Hal ini memungkinkan kita untuk menangani hingga 256 tombol berbeda pada
keyboard, atau seluruh set karakter ASCII.
Pertama dimulai dengan pendeklarasian sebuah array dari nilai
Boolean yang akan menangani masing-masing method keyboard, true untuk
tombol yang ditekan, dan false saat tombol dilepaskan.
bool* keyStates = new bool[256]; // membuat array dari
nilai boolean dengan ukuran 256 (0-255)
glutSpecialFunc(mySpecialKeyboard);
#include <stdlib.h>
#include <glut.h>
int c, d;
void triAngles(){
glBegin(GL_TRIANGLES);
glVertex2i(280, 0);
glVertex2i(250, 60);
glVertex2i(220, 0);
glEnd();
}
void mySpecialKeyboard(int key, int x, int y){
switch (key){
case
GLUT_KEY_LEFT: c += -4;
d += 0;
break;
case
GLUT_KEY_RIGHT: c += 4;
d += 0;
break;
case
GLUT_KEY_UP: c += 0; d += 4;
break;
case
GLUT_KEY_DOWN: c += 0;
d += -4;
break;
}
}
void timer(int value){
glutPostRedisplay();
glutTimerFunc(50, timer, 0);
}
void renderScene(void){
glClear(GL_COLOR_BUFFER_BIT);
Paramater func adalah fungsi yang akan ditangani dengan event klik mouse.
GLUTAPI void APIENTRY glutMotionFunc(void *func(int x, int
y));
Fungsi di atas adalah fungsi pelengkap dari fungsi interaksi mouse untuk
mendeteksi gerakan mouse.
2. Inisialisasi dalam penggunaan MouseFunction
void mouse(int button, int state, int x,int y){
if(button==GLUT_LEFT_BUTTON &&
state==GLUT_DOWN)
drawDot(x,480-y);
if(button==GLUT_RIGHT_BUTTON &&
state==GLUT_DOWN)
drawDot2(x,480-y);
if(button==GLUT_MIDDLE_BUTTON &&
state==GLUT_DOWN)
drawDot3(x,480-y);
1. GLUT_LEFT_BUTTON
4. GLUT_DOWN
void Triangles(){
glBegin(GL_TRIANGLES);
glVertex2i(0, 0);
glVertex2i(100, -30);
glVertex2i(100, 30);
glEnd();
}
2. Interaksi Drag
#include <stdlib.h>
#include <glut.h>
#include <stdio.h>
void Triangles(){
glBegin(GL_TRIANGLES);
glVertex2i(0, 0);
glVertex2i(100, -30);
glVertex2i(100, 30);
glEnd();
glutInitDisplayMode(GLUT_DEPTH | GLUT_SINGLE |
GLUT_RGBA);
glutInitWindowPosition(100, 100);
glutInitWindowSize(320, 320);
glutCreateWindow("GLUT");
glutDisplayFunc(display);
3. Contoh Implementasi
#include <stdlib.h>
#include <stdio.h>
#include <glut.h>
float x = 1, y = 1, z = 0;
int w = 480, h = 480, flag = 0, flg;
void drawQuad() {
glBegin(GL_POLYGON);
glColor3f(0, 0, 1);
glVertex2f(-20., -20.);
glVertex2f(20., -20.);
glVertex2f(20., 20.);
glVertex2f(-20., 20.);
glEnd();
}
void mouse(int button, int state, int xmouse,
int ymouse){
if (flg == 0)
{
if (state == GLUT_DOWN)
{
if (button == GLUT_LEFT_BUTTON)
{
flag++; if (flag == 2)
{
flg = 3; x = 3; y = 3;
printf("%d", flg);
}
}
}
}
if (flg == 3)
{
if (state == GLUT_DOWN)
{
if (button == GLUT_LEFT_BUTTON)
{
flag--; if (flag == 0)
{
x = 1; y = 1; flg =
0;
}
}
}
void renderScene(void){
glClear(GL_COLOR_BUFFER_BIT);
glClearColor(1, 1, 1, 1);
glPushMatrix();
glScalef(x, y, z);
drawQuad();
glPopMatrix();
glFlush();
}
void timer(int value){
glutPostRedisplay();
glutTimerFunc(50, timer, 0);
}
void main(int argc, char **argv){
glutInit(&argc, argv);
glutInitWindowPosition(100, 100);
glutInitWindowSize(w, h);
glutCreateWindow("Interaksi Mouse");
gluOrtho2D(-w / 2, w / 2, -h / 2, h / 2);
glutDisplayFunc(renderScene);
glutMouseFunc(mouse);
glutTimerFunc(1, timer, 0);
glutMainLoop();
4. }
B. MATERI
a. Pembuatan Objek 3D wireframe
b. Transformasi Objek 3D wireframe
a. Primitive 3D
Ada beberapa bentuk primitive dari objek 3 dimensi. Promitive
yaitu bentuk dasar yang dapat dengan mudah didefinisikan secara
matematik.
a. Sphere
b. Cube
glutWireCube(25);
c. Cone
glutWireCone(alas, tinggi, 20, 20);
e. Teapot glutWireTeapot(15);
Parameter tx, ty, dan tz menjelaskan perpindahan jarak untuk koordinat x, y, dan
z.
#include<stdlib.h>
#include<glut.h>
float w=480,h=480;
float sudut = 0, sx = 0, sy = 0, sz = 0;
void cube(){
glColor3d(0, 0, 1);
glutWireCube(10);
}
void display(){
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(0, 0, -40);
glRotatef(sudut, sx, sy, sz);
cube();
glutSwapBuffers();
}
void init(){
glClearColor(0.0, 0.0, 0.0, 1.0);
glEnable(GL_DEPTH_TEST);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45., (GLdouble)w / (GLdouble)h,1., 300.);
glMatrixMode(GL_MODELVIEW);
}
void myKeyboard(unsigned char key, int x, int y){
Note:
Dengan interaksi keyboard “y”, maka objek akan berotasi pada sumbu y
saja.
#include<stdlib.h>
#include<glut.h>
float w = 480, h = 480;
float sudut = 0, sx = 0, sy = 0, sz = 0, z = -320;
void sphere(){
glColor3d(1, 1, 1);
glutWireSphere(100, 150,100);
}
void display(){
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(0, 0, z);
glRotatef(sudut, sx, sy, sz);
sphere();
glutSwapBuffers();
}
void resize(int w1, int h1){
#include<stdlib.h>
#include<glut.h>
float w = 480, h = 480;
float sudut = 0, sx = 0, sy = 0, sz = 0, zz = -70;
int t = 20;
void WireCone(){
glColor3d(0, 1, 1);
glutWireCone(20, t, 50, 50);
}
void display(){
glClear(GL_COLOR_BUFFER_BIT |GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(0, 0, zz);
glRotatef(sudut, sx, sy, sz);
WireCone();
glutSwapBuffers();
void init(){
glClearColor(0.0, 0.0, 0.0, 1.0);
glEnable(GL_DEPTH_TEST);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45., (GLdouble)w / (GLdouble)h,1., 300.);
glMatrixMode(GL_MODELVIEW);
}
void myKeyboard(unsigned char key, int x, int y){
if (key == 'x'){
sx = 1;
sy = 0;
sz = 0;
sudut += 10;
}
}
void update(int value){
glutPostRedisplay();
glutTimerFunc(50, update, 0);
}
void main(int argc, char **argv){
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE |
GLUT_DEPTH | GLUT_RGBA);
glutInitWindowPosition(100, 100);
glutInitWindowSize(w, h);
glutCreateWindow("Objek 3D");
glutDisplayFunc(display);
init();
glutTimerFunc(50, update, 0);
glutKeyboardFunc(myKeyboard);
glutMainLoop();
}
Note :
Dengan interaksi keyoboard “x”, objek akan berotasi pada sumbu x saja.
Dengan interaksi keyboard “z”, objek akan berotasi pada sumbu z saja
void torus(){
glColor3d(0, 1, 1);
glutWireTorus(dalam, luar, sides, rings);
}
void init(){
glClearColor(0.0, 0.0, 0.0, 1.0);
glEnable(GL_DEPTH_TEST);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45., (GLdouble)w / (GLdouble)h, 1., 300.);
glMatrixMode(GL_MODELVIEW);
}
void myKeyboard(unsigned char key, int x, int y){
if (key == 'x'){
sx = 1;
sy = 0;
sz = 0;
sudut += 10;
}
}
void update(int value){
glutPostRedisplay();
glutTimerFunc(50, update, 0);
}
void main(int argc, char **argv){
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH |
GLUT_RGBA);
glutInitWindowPosition(100, 100);
glutInitWindowSize(w, h);
glutCreateWindow("Objek 3D");
glutDisplayFunc(display);
init();
glutTimerFunc(50, update, 0);
glutKeyboardFunc(myKeyboard);
glutMainLoop();
}
Note :
}
void update(int value){
glutPostRedisplay();
glutTimerFunc(50, update, 0);
}
void main(int argc, char **argv){
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE |
GLUT_DEPTH | GLUT_RGBA);
glutInitWindowPosition(100, 100);
glutInitWindowSize(w, h);
glutCreateWindow("Objek 3D");
glutDisplayFunc(display);
init();
glutTimerFunc(50, update, 0);
glutKeyboardFunc(myKeyboard);
glutMainLoop();
}
Note :
Dengan interaksi keyoboard “x”, objek akan berotasi pada sumbu x saja.
Dengan interaksi keyboard “y”, objek akan berotasi pada sumbu y saja. Dengan
interaksi keyboard “z”, objek akan bergerak pada sumbu z saja.
void WireTetrahedron(){
glColor3d(1, 0, 1);
glutWireTetrahedron();
}
void display(){
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(0, 0, t);
glRotatef(sudut, sx, sy, sz);
WireTetrahedron();
glutSwapBuffers();
}
void init(){
glClearColor(0.0, 0.0, 0.0, 1.0);
glEnable(GL_DEPTH_TEST);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45., (GLdouble)w / (GLdouble)h,1., 300.);
glMatrixMode(GL_MODELVIEW);
}
void myKeyboard(unsigned char key, int x, int y){
if (key == 'x'){
sx = 1;
sy = 0;
sz = 0;
sudut += 10;
}
}
void update(int value){
glutPostRedisplay();
glutTimerFunc(50, update, 0);
}
void main(int argc, char **argv){
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH | GLUT_RGBA);
glutInitWindowPosition(100, 100);
glutInitWindowSize(w, h);
glutCreateWindow("Objek 3D");
glutDisplayFunc(display);
init();
glutTimerFunc(50, update, 0);
glutKeyboardFunc(myKeyboard);
glutMainLoop();
}
}
void init(){
glClearColor(0.0, 0.0, 0.0, 1.0);
glEnable(GL_DEPTH_TEST);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45., (GLdouble)w / (GLdouble)h,1., 300.);
glMatrixMode(GL_MODELVIEW);
}
void myKeyboard(unsigned char key, int x, int y){
if (key == 'x'){
sx = 1;
sy = 0;
sz = 0;
sudut += 10;
}
}
void update(int value){
init();
glutTimerFunc(50, update, 0);
glutKeyboardFunc(myKeyboard);
glutMainLoop();
}
Note :
void init(){
glClearColor(0.0, 0.0, 0.0, 1.0);
glEnable(GL_DEPTH_TEST);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45., (GLdouble)w / (GLdouble)h, 1., 300.);
glMatrixMode(GL_MODELVIEW);
}
void myKeyboard(unsigned char key, int x, int y){
if (key == 'x'){
sx = 1;
sy = 0;
Note :
Dengan interaksi keyoboard “x”, objek akan berotasi pada sumbu x
saja. Dengan interaksi keyboard “y”, objek akan beritasi pada sumbu y saja.
Dengan interaksi keyboard “z”, objek akan berotasi pada sumbu z saja.
B. MATERI
a. Pembuatan Objek 3D Solid
b. Transformasi Objek 3D Solid
c. Lighting Objek 3d Solid
Visualisasi tentu saja tidak akan terjadi bila tidak ada cahaya.
Pencahayaan merupakan esensi dari visualisasi dan merupakan topik yang
sangat kompleks. Hingga tahap ini lingkungan diberi pencahayaan default
atau standar dengan cahaya lingkungan (ambient) yang sama pada setiap titik.
Kondisi default atau standar dapat dicapai kapan saja dengan mematikan status
Lighting menjadi disabled dengan glDisable(GL_LIGHT0).
OpenGL akan melakukan komputas\i warna setiap pixel di display
akhir, ditampilkan adegan itu dilakukan di frame buffer. Bagian dari komputasi
ini tergantung pada pencahayaan yang digunakan dalam adegan dan hal
tersebut berkenaan dengan bagaimana suatu benda dalam adegan yang
memantulkan atau menyerap cahaya. Sebagai contoh saja misalnya sebuah
lautan memiliki warna yang berbeda pada cerah maupun pada saat hari
mendung. Adanya sinar matahari atau awan menentukan apakah laut termelihat
sebagai pirus terang atau abu-abu keruh kehijauan. Pada kenyataannya,
sebagian besar objek bahkan yang tidak terlihat tiga dimensi sampai
mereka diterangi cahaya. Pada gambar 2 menunjukkan dua versi dari
adegan yang persis sama
yaitu sebuah bola, dimana satu dengan pencahayaan dan satu tanpa pencahayaan.
c. Kerucut Solid.
void glutSolidCone(GLdouble base, GLdouble height,GLint
slices, GLint stacks);
d. Torus Solid.
void glutSolidTorus(GLdouble innerRadius, GLdouble
outerRadius, Glintnsides, GLint rings);
void glutSolidDodecahedron(void);
g. Oktahedron solid.
void glutSolidOctahedron(void);
h. Icosahedron solid.
void glutSolidIcosahedron(void);
C. Contoh Program
Proyeksi cube
#include <glut.h>
void cube()
{
//menggambar kubus dan transformasitarnslasi ke titik 0.5 0.5
0.5 dan skala 1 1 1
glPushMatrix();
glTranslated(0.5, 0.5, 0.5);//cube
glScaled(1.0, 1.0, 1.0);
glutSolidCube(1.0);
glPopMatrix();
}
void setMaterial()
{
//set properties of surfaces material
GLfloat mat_ambient[] =
{
0.7f, 0.7f, 0.7f, 1.0f
};
// ada 4 jenis
GLfloat mat_diffuse[] =
{
0.6f, 0.6f, 0.6f, 1.0f
};
GLfloat mat_specular[] =
{
1.0f, 1.0f, 1.0f, 1.0f
};
GLfloat mat_shininess[] = { 50.0f };
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
}
void setLighting()
{
//set light sources
GLfloat lightIntensity[] =
void displayObject()
{
setMaterial();
setLighting();
setViewport();
setCamera();
//startDrawing
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
cube();//memanggil fungsi menggambar kubus
glFlush();//mengirim smua objek untuk dirender
}
void main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(640, 480);
glutInitWindowPosition(100, 100);
glutCreateWindow("simple 3d scene");
glutDisplayFunc(displayObject);//fungsidari display object
yang menggabungkankubus lighting material dan kamera
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glShadeModel(GL_SMOOTH);
glEnable(GL_DEPTH_TEST);
glEnable(GL_NORMALIZE);
glClearColor(1.0f, 1.0f, 1.0f, 0.0f);
glViewport(0, 0, 640, 480);
glutMainLoop();
}
#include <stdlib.h>
#include <glut.h>
#include <math.h>
int shapeindex;
GLdouble cx, cy, cz; // Posisi kamera
GLdouble ry, rx; // Rotasi kamera terhadap sumbu y dan x
GLfloat bumi_y, bulan_y;
void init(void) {
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-1, 1, -1, 1, 1.8, 20);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0); // Aktifkan 3 sumber cahaya
bumi_y = 1;
bulan_y = 1;
}
void display(void) {
GLfloat light_position[] = { -1.0, 0.0, 0.0, 1.0 };
GLfloat light_ambient[] = { 5.0, 5.0, 0.0, 0.0 };
GLfloat light_diffuse[] = { 0.5, 0.5, 0.5, 0.0 };
GLfloat light_specular[] = { 0.5, 0.5, 0.5, 0.0 };
// Bersihkan layar
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
gluLookAt(cx, cy, cz, 0, 0, 0, 0, 1, 0);
glRotatef(ry, 0.0, 1.0, 0.0);
glRotatef(rx, 1.0, 0.0, 0.0);
// gambar matahari
glMaterialfv(GL_FRONT, GL_AMBIENT, matahari_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, matahari_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, matahari_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, matahari_shininess);
glPushMatrix();
glutSolidSphere(0.4, 50, 50);
glPopMatrix();
//gambar bumi
glMaterialfv(GL_FRONT, GL_AMBIENT, bumi_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, bumi_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, bumi_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, bumi_shininess);
glPushMatrix();
glRotatef(bumi_y, 0.0, 1.0, 0.0);
glTranslatef(2.3, 0.0, 0.0);
glutSolidSphere(0.2, 50, 50);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
glPopMatrix();
//gambar bulan
glMaterialfv(GL_FRONT, GL_AMBIENT, bulan_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, bulan_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, bulan_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, bulan_shininess);
glRotatef(bumi_y, 0.0, 1.0, 0.0);
glTranslatef(2.3, 0.0, 0.0);
glRotatef(bulan_y, 0.0, 0.1, 0.0);
glTranslatef(0.5, 0.0, 0.0);
glutSolidSphere(0.05, 50, 50);
glPopMatrix();
glutSwapBuffers();
}
void animate(void) {
bumi_y += 1;
bulan_y += 1;
glutPostRedisplay();
}
switch (key) {
case GLUT_KEY_UP:
rx += 1;
break;
case GLUT_KEY_DOWN:
rx -= 1;
break;
case GLUT_KEY_RIGHT:
case GLUT_KEY_LEFT:
ry -= 1;
break;
default:
break;
}
switch (key) {
case 'f': // Kamera lihat dari depan
case 'F':
cx = 0; cy = 0; cz = 5;
break;
default:
break;
}
glutInitWindowSize(600, 600);
glutInitWindowPosition(100, 100);
glutCreateWindow("Kehidupan");
init();
shapeindex = 1;
cx = 0; cy = 6; cz = 6;
glutDisplayFunc(display);
glutKeyboardFunc(keyboard);
glutSpecialFunc(specialkey);
glutIdleFunc(animate);
glutMainLoop();