Subscribe For Free Updates!

.

Rabu, 01 Juni 2016

Cara Membuat Objek 3D Menggunakan Visual Studio

visual studio

BAB I
PENGENALAN OPENGL
A.  TUJUAN
1.  Mampu melakukan konfigurasi Library opengl di Visual Studio 2008
2.  Mampu memahami inisialisasi fungsi openGL
3.  Mampu membuat objek dasar dengan fungsi openGL
Cara mining bitcoin free klik disini
B.  MATERI
1.  Konfigurasi library openGL
2.  Inisialisas OpenGL

C.  GLUT (GL Utility Toolkit)
Merupakan pengembangan dari OpenGL yang didesain untuk aplikasi dengan
level  kecil  hingga  menengah  dan  menggunakan  callback  functions  untuk
menambahkan  interaksi dari user. Untuk pemrograman OpenGL menggunakan C++,
diperlukan library tambahan yaitu :
1.  glut.h yang dicopy ke $dir\Microsoft Visual Studio 2010 (sesuaikan dengan
versi visual studio anda)\Vc\include
2.  glut32.lib  yang dicopy ke $dir\Program Files\Microsoft Visual Studio
2010(sesuaikan dengan versi visual studio anda)\Vc\lib
3.  glut32.dll yang dicopy ke $dir\Windows\System32 or if Win64 to sysWOW64
D.  Klasifikasi Fungsi
1.  Primitive : berupa geometric, imagesAttribute  : berupa color, line type, light,
texture
2.  Viewing : berupa virtual cameraControl : turn fuction ON / OFF
3.  Windowing : window, mouse, keyboard
 Cara mining bitcoin free klik disini
E.  CARA KERJA OPENGL
OpenGL  lebih  mengarah  pada  prosedural  daripada  sebuah  deskriptif  API
grafis.Untuk  mendeskripsikan  scene  dan  bagaimana  penampilannya,sebenarnya
programer lebih tau untuk menentukan hal-hal yang dibutuhkan untuk menghasilkan
efek  yang  di  inginkan.Langkah  tersebut  termasuk  memanggil  banyak  perintah 2

openGL,  perintah  tersebut  digunakan  untuk menggambarkan  grafis  primitif  seperti
titik,garis  dan  poligon  dalam  tiga  dimensi.Sebagai  tambahan,openGL  mendukung
lighting,  shading,  texture mapping, blending,  transparancy,dan banyak kemampuan
efek khusus lainnya.  
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 :
Fungsi / Prosedur  Pengertian
 LoadGlut(glut32.dll)  ‘if  you  no
include gl in system’
Pemanggilan library openGL
 InitGL   Inisialisasi  openGL  awal  yang  harus
dilakukan
 glViewport   Untuk pengaturan viewport
glMatrixMode   Untuk pengaturan viewport
gluPerspective   Pengaturan persepektif
  Pembuatan Gambar
Fungsi / Prosedur  Pengertian
mode GL_QUARDS  Untuk menggambar segi empat
mode 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,
glPointSize  suatu fungsi yang berfungsi untuk mengatur
besarnya suatu objek,
gluOrtho2D  yaitu suatu fungsi untuk mengatur proyeksi
hasil eksekusi dan mendefinisikan besarnya 3

sistem  koordinat  dengan  urutan  kirikanan
dan bawah-atas.
glClearColor    Menandakan  warna  apa  yang  digunakan
sebagai  background.  Warna  dinyatakan
dalam  bentuk  RGBA,  angka  pertama
memwakil warna merah, kedua hijau, ketiga
biru, dan keempat adalah alpha atau tingkat
transparansi.  Tiap warna  berkisar  antara  0
hngga 1.
glClear   Untuk menghapus window dan memberikan
warna  yang  telah  kita  definisakn
sebelumnya  dengan  menggunakan
glClearColor
glPushMatrix  Menyimpan koordinat Matrik yang ada
glPopMatrix   Berguna untuk memanggil suatu fungsi yang
telah disimpan pada glPushMatrix
glBegin(GL_Lines)  Untuk  memmulai  menggambar  dalam
bentuk  garis.  Setiap  pasangan  verteks
sebagai seg,em garis independen
glEnd   Untuk  mengakhiri  penggambaran  sebuah
garis
SwapBuffers(hDC)   untuk  menukar  bagian  belakang  buffer
menjadi buffer screen
glflush()  Rendiring
  Fungsi dasar menggambar titik
Fungsi / Prosedur  Pengertian  Contoh
-  glVertex2i(x,y)   Yaitu  suatu  fungsi  untuk
menggambar  titik  pada
koordinat  x  dan  y, dengan
nilai satuan berupa integer.
glVertex2i(10,10)
-  glVertex2f(x,y)   Yaitu  suatu  fungsi  untuk
menggambar  titik  pada
koordinat  x  dan  y,  dengan
nilai satuan berupa float.
glVertex2f(10.0,10.0)
-  glVertex2d(x,y)   Yaitu  suatu  fungsi  untuk
menggambar  titik  pada
koordinat  x  dan  y, dengan
nilai satuan berupa double.
glVertex2d(10.0,10.0)

  Definisi primitive objek 4

Fungsi / Prosedur  Pengertian
# define GL_POINTS  Primitif  objek  ini  dipergunakan  untuk
menciptakan suatu titik.
# define GL_LINES   Primitif  objek  ini  adalah  suatu  primitive
objek guna menciptakan suatu garis.
# define GL_LINE_LOOP  Menarik  sekelompok  verteks  yang
terhubung menjadi  segmen  garis  dari  titik
pertama sampai terakhir, kemudian kembali
ke verteks yang pertama.
# define GL_LINE_STRIP  Menggambar  sekelompok  verteks  yang
terhubung menjadi segitiga. Sebuah segitiga
baru  didefinisikan  untuk  setiap  titik  yang
diberikan setelah dua verteks pertama dan
seterusnya.
# define GL_TRIANGLES  Triangle atau segitiga adalah tiga buah titik
yang  terhubung  menjadi  suatu  segitiga
dengan blok di tengahnya.
# define GL_TRIANGLES_STRIP  Pada  triangles  strip  jumlah  vertex  yang
dipergunakan adalah 4 buah vertex.
# define GL_TRIANGLES_FAN  Triangles fan adalah pembuatan suatu objek
dengan  menggunakan  segitiga  dimana
hanya menggunakan 1 titik pusat saja.
# define GL_QUADS  Quad  atau  segempat  adalah  empat  buah
titik  yang  terhubung  menjadi  quat  segi
empat dengan blok di tengahnya.
# define GL_QUADS _STRIP  Pada quads strip 4 buah vertex merupakan
1 kelompok.
# define GL_POLYGON  Polygon merupakan suatu fungsi yang mirip
dengan polyline, tetapi   menghasilkan kurva
tertutup dengan blok warna (fill).

 Fungsi untuk memberikan warna (fungsi color):
Fungsi  Warna
glColor3f(0,0,0);  Black
glColor3f(0,0,1);  Blue
glColor3f(0,1,0);  Green
glColor3f(0,1,1);  Cyan
glColor3f(1,0,0);  Red
glColor3f(1,0,1);  Magenta
glColor3f(1,1,0);  Yellow 5

glColor3f(1,1,1);  White
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 dua merupakan perputaran terhadap sumbu y,
Parameter  ke  tiga  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

Contoh script untuk inisialisasi openGL :
#include <stdio.h>
#include <GL/glut.h>
void mydisplay(){
  glClear(GL_COLOR_BUFFER_BIT);//Menghapus layar
  glBegin(GL_POLYGON);
  glVertex2f(-0.5, -0.5);
  glEnd();
  glFlush();
}

Script  di  atas  merupakan  script  yang  paling  sederhana,  dalam  artian  minimal
diperlukan  untuk menginisialisasi  penggunaan  openGL.Fungsi-fungsi  lain  seperti  yang
disebut diatas  seperti glViewport, glMatrixMode, dapat di tambah kan pada script sesuai
dengan kebutuhan.
G.  SET UP PROJECT BARU
1.  Buatlah project baru pada Visual Studio dengan nama prak0.  6



   7

BAB II
P R I M I T I F   O B J E K
A.  TUJUAN
1.  Mampu melakukan inisialisasi pembuatan primitif objek pada openGL
2.  Mampu membuat primitif objek menggunakan openGL

B.  MATERI
1.  konsep primitif objek di openGL
2.  Pembuatan primitif objek di openGL

C.  Definisi Primitif Objek
Contoh primitive grafika dasar antara lain : titik, garis, kurva, fill area dan text. Objek
kompleks dapat dibuat dengan kombinasi dari primitive ini. Misalkan, Poligaris atau yang
dapat  didefinisikan  sebagai  urutan  garis  lurus  yang  saling  terhubung.  Secara  umum
algoritma grafis memiliki persamaan yaitu bagaimana menampilkan hasil.
Contoh SegiEmpat yang menggunakan Primitive Objek :
      Pada  primitive  object  dapat  digunakan  untuk  membuat  segi  empat  berikut  adalah
pembuatan suatu objek berupa segiempat, pertama mengalami Proses Rendering :
SegiEmpat (posx, posy, w, h)



Maka sintaks pembuatan segiempat :
##include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include <GL/glut.h>
void mydisplay(){
  glClear(GL_COLOR_BUFFER_BIT);//Menghapus layar
  glBegin(GL_POLYGON); 8

  glVertex2f(-0.5, -0.5);
  glVertex2f(-0.5, 0.5);
  glVertex2f(0.5, 0.5);
  glVertex2f(0.5, -0.5);
  glEnd();
  glFlush();
}
int main(int argc, char** argv) {
  printf(“Hello World… this is 2D Rectangle”);
  glutCreateWindow("simple");
  glutDisplayFunc(mydisplay);
  glutMainLoop();
}

Segitiga
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include <glut.h>
void mydisplay(){
  glClear(GL_COLOR_BUFFER_BIT);
  glBegin(GL_TRIANGLES);
  glVertex2f(-0.5, -0.5);
  glVertex2f(-0.5, 0.5);
  glVertex2f(0.5, 0.5);
  glEnd();
  glFlush();
}
int main(int argc, char** argv){
  glutCreateWindow("simple");
  glutDisplayFunc(mydisplay);
  glutMainLoop();

Polygon Segi 8
Program 03. Polygon Segi Delapan
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include <GL/glut.h>
void mydisplay(){
  glClear(GL_COLOR_BUFFER_BIT);
  glBegin(GL_POLYGON);
  glColor3f(0, 1, 0);
  glVertex2f(-0.5, -0.5);
  glVertex2f(-0.75, 0);
  glVertex2f(-0.5, 0.5);
  glVertex2f(0, 0.75);
  glVertex2f(0.5, 0.5);
  glVertex2f(0.75, 0);
  glVertex2f(0.5, -0.5);
  glVertex2f(0, -0.75);
  glEnd();
  glFlush();
}
int main(int argc, char** argv){
  glutCreateWindow("simple");
  glutDisplayFunc(mydisplay);
  glutMainLoop();
} 9


   10

BAB III
Algoritma Pembentukan Objek
A.  TUJUAN
1.  Mampu memhami konsep algoritma bresenham
2.  Mampu menerapkan algoritma bresenham pada openGL
3.  Mampu membuat garis dengan algoritma bresenham

B.  MATERI
1.  Konsep algoritma bresenham
2.  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
:
 Langkah-langkah  pembentukan  garis  berdasarkan  algoritm  Bressenham
adalah:
1.  Tentukan  dua  titik  yang  akan  dihubungkan  dalam  pembentukan
garis.
2.  Tentukan  salah  satu  sebagai  titik  awal  (x0,  y0)  dan  titik  akhir
(x1,y1).
3.  Hitung dx, dy, 2dy dan 2dy - 2dx
4.  Hitung parameter : p = 2dy – dx
5.  Untuk setiap xk sepanjang jalur garis, dimulai dengan k=0, dimulai
dari K0
a.  bila  pk <  0 maka  titik  selanjutnya  adalah:  (xk+1,  yk)  dan
pk+1 = pk + 2dy
b.  bila tidak, titik selanjutnya adalah: (xk+1, yk+1) dan pk+1 =
pk + 2dy – 2dx
6.  Ulangi nomor 5 untuk menentukan posisi pixel berikutnya, sampai
x = x1 atau y = y1.
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 algoritmaBressenham. 11




Contoh program 12

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include <GL\glut.h>
#include <math.h>

void display(void)
{

glClearColor(1.0,1.0,1.0,0.0);

glMatrixMode(GL_PROJECTION);
gluOrtho2D(0.0,300.0,0.0,300.0);
}
void setPixel (GLint xCoordinate, GLint yCoordinate)
{
glBegin (GL_POINTS);
glVertex2i (xCoordinate, yCoordinate);
glEnd();
glFlush();
}

void lineBres (GLint x0, GLint y0, GLint xEnd, GLint yEnd)
{
GLint dx = (float) fabs ((float) xEnd - x0);
GLint dy = (float) fabs ((float) yEnd - y0);
GLint p = 2*dy-dx;
GLint twoDy = 2*dy;
GLint twoDyMinusDx = 2*(dy-dx);
GLint x,y;

if(x0 > xEnd){
x=xEnd;
y=yEnd;
xEnd=x;
}
else{
x=x0;
y=y0;
}
setPixel(x,y);
while(x<xEnd){
x++;
if(p<0)
p+=twoDy;
else{ 13

y++;
p+=twoDyMinusDx;
}
setPixel(x,y);
}
}
void drawMyLine (void)
{
    glClear (GL_COLOR_BUFFER_BIT);
   
    glColor3f(1.0,0.0,0.0);
    glPointSize(4.0);
    GLint x0 = 50;
    GLint y0 = 50;
    GLint xEnd = 150;
    GLint yEnd = 50;
    lineBres(x0,y0,xEnd,yEnd);
   
    glColor3f(0.0,1.0,0.0);
    glPointSize(4.0);
    GLint x1 = 50;
    GLint y1 = 100;
    GLint x2 = 150;
    GLint y2 = 100;
    lineBres(x1,y1,x2,y2);

    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);

   
}

int main(int argc, char** argv)
{

glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(400,400);
glutInitWindowPosition(0,0);
glutCreateWindow("Digital Differential Analyzer Algorithm");
display();
glutDisplayFunc(drawMyLine);
glutMainLoop(); 14

return 0;
}





  TUGAS 
   15

  BAB IV
Transformasi objek
A.  TUJUAN
1.  Mampu memahami transformasi objek pada openGL
2.  Mampu melakukan transformasi objek menggunakan openGL
3.  Mampu melakukan implementasi transformasi objek pada openGL

B.  MATERI
1.  Konsep Transformasi Objek
2.  Penerapan Transformasi objek pada openGL

C.  Tujuan transformasi adalah :
1.  Merubah atau menyesuaikan komposisi pemandangan
2.  Memudahkan membuat objek yang simetris
3.  Melihat objek dari sudut pandang yang berbeda
4.  Memindahkan satu atau beberapa objek dari satu tempat ke tempat lain, ini biasa
dipakai untuk animasi komputer.
Secara  substansi, Grafika Komputer  adalah  proses  transformasi  dari model  3D
obyek berupa informasi geometri bentuk, informasi pose, warna, texture, dan pencahayaan
menjadi citra 2D


  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
kamera.


 16


Untuk menghasilkan gambar dari obyek dengan skenario tertentu kita harus melakukan
beberapa proses, yaitu:
-  Melakukan  pengesetan  kamera  dalam  bentuk  setting  lensa  kamera  (Transformasi
Proyeksi),
-  Mengarah kamera dengan mengatur letak tripod (Transformasi Viewing),
-  Mengatur letak obyek (Transformasi Modeling), dan
-  Mengatur skala dan layout dari foto (Transformasi Viewport)


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.
#include <stdlib.h>
#include <glut.h>
void drawQuad(){ 17

  glBegin(GL_QUADS);
  glVertex2f(0., 0.);
  glVertex2f(0., 50.);
  glVertex2f(200., 50.);
  glVertex2f(200., 0.);
  glEnd();


}
void render(){
  glClear(GL_COLOR_BUFFER_BIT);
  //drawKoordinat
  glColor3f(1.,1.,1.);
  drawQuad();
  //draw kordinat menjadi tidak tengah lagi/ translasi
  glTranslatef(10,10,0);
  glColor3f(1.,0.,0.);
  drawQuad();
  glFlush();
}
  int main(int argc, char** argv) {
    glutInit(&argc, argv);
    glutInitWindowPosition(100, 100);
    glutInitWindowSize(480, 480);
    glutCreateWindow("Translasi");
    // merubah ukuran canvas
    gluOrtho2D(-320.0, 320.0, -320.0, 320.0);
    glutDisplayFunc(render);
    glutMainLoop();

  }

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.  18

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 :
glTranslatef  (x,  y,  z)  digunakan  untuk merubah  titik  posisi  awal  sumbu  koordinat
menuju  posisi  yang  ditentukan  sesuai  koordinat  x,y,  dan  z.  glRotatef  (angle,  x,  y,  z)
digunakan untuk memutar suatu bidang pada sudut tertentu (angle).

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.

Contoh Program
#include <stdlib.h>
#include <glut.h>
void drawQuad(){
  glBegin(GL_QUADS);
  glVertex2f(0., 0.);
  glVertex2f(0., 50.);
  glVertex2f(200., 50.);
  glVertex2f(200., 0.);
  glEnd();
}
void render(){
  glClear(GL_COLOR_BUFFER_BIT);
  //drawKoordinat
  glColor3f(1., 1., 1.);
  drawQuad();
  glTranslatef(0, 0, 0);
  glRotatef(0, 0, 0, 1);
  glColor3f(1., 0., 0.);
  drawQuad();
  glFlush();
}

#include "harikeduatranslasi.h"

  int main(int argc, char** argv) {
    glutInit(&argc, argv);
    glutInitWindowPosition(100, 100);
  19

    glutInitWindowSize(480, 480);
    glutCreateWindow("Translasi");
    // merubah ukuran canvas
    gluOrtho2D(-320.0, 320.0, -320.0, 320.0);
    glutDisplayFunc(render);
    glutMainLoop();

  }
F.   Scale
 Skala merupakan  salah  satu  bentuk  transformasi  yang merubah  ukuran  dari  objek
yang ditentukan, baik membesar ataupun mengecil. Perubahan ukuran tersebut didasarkan
pada sumbu x, sumbu y, maupun sumbu z, dimana jika yang diubah hanya sumbu x, maka
besarnya objek akan berubah sesuai dengan sumbu x baru yang  telah ditentukan, begitu
pula jika diubah terhadap sumbu  dan zy, maka objek akan menguikuti perubahan sesuai
sumbu y maupun z baru yang telah ditentukan.
Perubahan  skala  diperoleh  dari  mengalikan  nilai  koordinat  objek  dengan  skala
tertentu sesuai dengan sumbu masing - masing. Bentuk dari matriks skala adalah:

Transformasi skala dapat dilakukan dengan cara memanggil fungsi:
glScalef(Sx, Sy, Sz)
 glScaled(Sx, Sy, Sz)
Dimana  Sx,  Sy,  dan  Sz merupakan  parameter  dari masing  – masing  sumbu  (  Sx
merupakan  parameter  pada  sumbu  x,  Sy merupakan  parameter  pada  sumbu  y,  dan  Sz
merupakan parameter pada sumbu z)
Source code
#include <stdlib.h>
#include <glut.h>
#include "DrawLine.h"
void drawQuad(){
  glBegin(GL_QUADS);
  glVertex2f(0., 0.);
  glVertex2f(0., 50.);
  glVertex2f(200., 50.);
  glVertex2f(200., 0.);
  glEnd();
}
void renderScene(void){

  glClear(GL_COLOR_BUFFER_BIT);
  drawkordinat();
  glColor3f(1, 1, 0); 20

  glScalef(1, 2, 1);
  drawQuad();
  glFlush();
}


  D. Tutorial 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. ilustrasi akibat urutan transformasi yang berbeda, yaitu hasil
operasi “rotasi kemudian di translasi” berbeda dengan operasi “translasi baru dirotasi”.  21


Program  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()
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<stdarg.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 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 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);    glBegin(GL_QUADS);
  // Front Face, red    
  glColor3f(1.0, 0.0, 0.0);
  glVertex3f(-1.0f, -1.0f, 1.0f); 22

  glVertex3f(1.0f, -1.0f, 1.0f);
  glVertex3f(1.0f, 1.0f, 1.0f);
  glVertex3f(-1.0f, 1.0f, 1.0f);

  // Back Face, green
  glColor3f(0.0, 1.0, 0.0);
  glVertex3f(1.0f, -1.0f, -1.0f);
  glVertex3f(1.0f, 1.0f, -1.0f);
  glVertex3f(-1.0f, 1.0f, -1.0f);
  glVertex3f(-1.0f, -1.0f, -1.0f);
  // Top Face, blue  
  glColor3f(0.0, 0.0, 1.0);
  glVertex3f(-1.0f, 1.0f, -1.0f);
  glVertex3f(-1.0f, 1.0f, 1.0f);
  glVertex3f(1.0f, 1.0f, 1.0f);
  glVertex3f(1.0f, 1.0f, -1.0f);
  // Bottom Face, yellow  
  glColor3f(1.0, 1.0, 0.0);
  glVertex3f(-1.0f, -1.0f, -1.0f);
  glVertex3f(1.0f, -1.0f, -1.0f);
  glVertex3f(1.0f, -1.0f, 1.0f);
  glVertex3f(-1.0f, -1.0f, 1.0f);
  // Right face, cyan    
  glColor3f(0.0, 1.0, 1.0);
  glVertex3f(1.0f, -1.0f, -1.0f);
  glVertex3f(1.0f, 1.0f, -1.0f);
  glVertex3f(1.0f, 1.0f, 1.0f);
  glVertex3f(1.0f, -1.0f, 1.0f);
  // Left Face, magenta    
  glColor3f(1.0, 0.0, 1.0);
  glVertex3f(-1.0f, -1.0f, -1.0f);
  glVertex3f(-1.0f, -1.0f, 1.0f);
  glVertex3f(-1.0f, 1.0f, 1.0f);
  glVertex3f(-1.0f, 1.0f, -1.0f);
  glEnd();

  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);
  //glutInitDisplayMode( GLUT_DOUBLE /*|GLUT_DEPTH* / );
  glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
  glutInitWindowSize(500, 500);
  glutInitWindowPosition(0, 0);
  glutCreateWindow("simple");
  // callbacks
  glutDisplayFunc(mydisplay);
  glutKeyboardFunc(myKeyboard);
  glutTimerFunc(100, myTimeOut, 0);
  glutReshapeFunc(resize); 23

  init();
  glutMainLoop();
  return 0;
}

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).
G.  Implementasi Transformasi Objek
Contoh Program :
##include <stdlib.h>
#include <glut.h>
#include  "DrawLine.h"
void drawQuad(){
  glBegin(GL_POLYGON);
  glVertex2f(77., 70.);
  glVertex2f(80., 146.);
  glVertex2f(99., 90.);
  glVertex2f(157., 90.);
  glVertex2f(110., 55.);
  glVertex2f(128., 1.);
  glVertex2f(80., 34.);
  glVertex2f(32., 1.);
  glVertex2f(54., 55.);
  glVertex2f(3., 90.);
  glVertex2f(63., 90.);
  glVertex2f(80., 146.);
  glEnd();  glFlush();
}
void renderScene(void){
  glClear(GL_COLOR_BUFFER_BIT);
  drawkordinat();
  glPushMatrix();
  glTranslatef(-500, -500, 0);
  glColor3f(0, 1, 0);
  //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();
  glTranslatef(-200, -350, 0); 24

  glScalef(0.5, 0.5, 0);
  glColor3f(1, 0, 1);
  //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.);

  glutDisplayFunc(renderScene);
  glutMainLoop();
}

 25

Tugas  26
 27

BAB V
ANIMASI DAN PEMROGRAMAN
A.  TUJUAN
1.  Mampu memahami animasi pada openGL
2.  Mampu melakukan implementasi animasi objek pada openGL

B.  MATERI
1.  Animasi objek pada opengl

A.  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.
1.  Fungsi dasar pembuatan animasi dengan menggunakan TimerFunction
GLUTAPI void APIENTRY glutTimerFunc(unsigned int millis, void
(GLUTCALLBACK *func)(int value), int value);

Dalam  penggunaan  glutTimerFunc  dimungkinkan  untuk membuat  sebuah  animasi  yang
dikontrol olehwaktu.
2.  Inisialisasi dalam penggunaan TimerFunction



Fungsi    dari      glutPostRedisplay    adalah    mengirim  kan  perintah    untuk
mengaktifkan display secara berkala (looping).
Kemudian  pada  main  program  perlu  menambahkan  fungsi  untuk  mengaktifkan  timer
function.

   Berikut adalah contoh dari sebuah bentuk jam analog  28

sederhana dengan minimal empat tempat penunjuk angka dan menggunakan 3 jarum. Jarum
jam berputar sesuai dengan timer per detik waktu nyata.  
Program :
#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(){
  glBegin(GL_POLYGON);
  glColor3f(0, 0, 0);
  glVertex2i(0, 200);
  glVertex2i(10, 180);
  glVertex2i(5, 180);
  glVertex2i(5, 0);
  glVertex2i(-5, 0);
  glVertex2i(-5, 180);
  glVertex2i(-10, 180);
  glVertex2i(0, 200);
  glEnd();
}
void panahMenit(){
  glBegin(GL_POLYGON);
  glColor3f(1, 1, 1);
  glVertex2i(0, 220);
  glVertex2i(10, 200);
  glVertex2i(5, 200);
  glVertex2i(5, 0);
  glVertex2i(-5, 0);
  glVertex2i(-5, 200);
  glVertex2i(-10, 200);
  glVertex2i(0, 220);
  glEnd();

}
void panahDetik(){
  glBegin(GL_POLYGON);
  glColor3f(1, 0, 0);
  glVertex2i(0, 240);
  glVertex2i(10, 210);
  glVertex2i(5, 210);
  glVertex2i(5, 0);
  glVertex2i(-5, 0);
  glVertex2i(-5, 210);
  glVertex2i(-10, 210);
  glVertex2i(0, 240);
  glEnd(); 29

}
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);

  glPushMatrix();
  glColor3f(0.7, 0.7, 0.7);
  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();
  glColor3f(0, 0, 0);
  lingkaran(20, 100, 0, 0);
  glFlush();
}
void timer(int value){
  sudut -= 0.6;
 glutPostRedisplay();
  glutTimerFunc(100, timer, 0);
}
#include "bab5program1.h"
void main(int argc, char **argv){
  glutInit(&argc, argv);
  glutInitWindowPosition(100, 100);
  glutInitWindowSize(300, 300);
  glutCreateWindow("JAM ANALOG: Prak Grafkom");
  gluOrtho2D(-300., 300., -300., 300.);
  glutDisplayFunc(renderScene);
  glutTimerFunc(60, timer, 0);
  glutMainLoop();
}



Contoh program ke-2
Membuat sebuah baling-baling yang bisa perputar secara clockwise kemudian unclockwise yang
pusatnya berada pada pusat koordinat.
#include <stdlib.h>  30

#include <glut.h>
int x=0;
int zputer=0;
int zbalik=180;

void Timer(int value){
  if (zputer <= 360){
    x = 1;
    zputer += 1;
  }
  if (zputer>360){
    x = -1;
    zbalik -= 1;
  }
  if (zbalik<0){
    x = 1;
    zputer = 0;  
    zbalik = 360;
  }
  glutPostRedisplay();
  glutTimerFunc(5, Timer, 0);

}
void Draw(){
  glBegin(GL_TRIANGLES);
  glClear(GL_COLOR_BUFFER_BIT);
  glVertex2d(0, 0);
  glVertex2d(-100, 200);
  glVertex2d(100, 200);
  glVertex2d(0, 0);
  glVertex2d(-100, -200);
  glVertex2d(100, -200);
  glEnd();
}
void display(){
  glClear(GL_COLOR_BUFFER_BIT);
  glPopMatrix();
  glRotatef(x, 0., 0., 1.);
  Draw();
  glPushMatrix();
  glFlush();
}


Animasi 2D menggunakan OpenGL dapat dilakukan dengan melakukan
perpindahan objek menggunakan glTranslatef, juga dapat dilakukan dengan melakukan
perputaran atau pergerakan objek yang berporos pada sumbu-sumbu koordinat dari
sumbu pembentuk objek tersebut menggunakan glRotatef. Kemudian waktu yang
digunakan dalam pergerakan animasi juga dapat diatur sesuai keinginan dengan
menggunakan glutTimerFunc.
 31

BAB VI
INTERAKSI DENGAN PERANGKAT
A.  TUJUAN
1.  Mampu memahami interasksi perangkat keras dengan openGL
2.  Mampu melakukan implementasi interkasi perangkat keras dengan openGL

B.  MATERI
1.  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 INPUTKEYBOARD PADA GLUT-KEY BIASA DAN SPECIAL
KEY
a.  KONSEP INPUT KEYBOARD (GENERAL BUTTON)
glutKeyboardFunc adalah suatu fungsi callback untuk digunakan sebagai masukan
pada  suatu  jendela  window.  Konsepnya  pada  saat  seorang  user  atau  pengguna
memberikan  input yaitu menekan pada tombol keyboard, setiap tombol keyboard yang
ditekan akan menghasilkan suatu karakter ASCII yang akan menghasilkan suatu callback
keyboard yang telah didefinisikan berupa fungsi dengan 3 parameter.
Penggunaan  input keyboard pada  tombol-tombol biasa atau normal key  (a-z, 1-0),
dapat  dilakukan  dengan  menggunakan  callback  function  berupa
glutKeyboardFunc(myKeyboard)  dengan  dideklarasikan  terlebih  dahulu  suatu  fungsi
buatan untuk menampung semua perintah input yang akan digunakan oleh user. Fungsi
buatan tersebut seperti contoh di bawah ini:
void myKeyboard(unsigned char key, int x,int y)
{
// masukkan perintah disini
}
Fungsi  tersebut  berisi  suatu  perintah  yang  akan  digunakan  dalam
pengoperasian program oleh user. Di dalam fungsi tersebut terdapat 3 parameter
dan di dalamnya dideklarasikan suatu perintah yang nantinya akan digunakan.
 
void timer(int value){
glutPostRedisplay();
 glutTimerFunc(100, timer, 0);
}

void myKeyboard(unsigned char key, int x, int y)
{  32

if(key == 'a') glTranslatef(0,5,0); if(key == 'd')
glTranslatef(0,-5,0);
}

void renderScene(void){
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.,0.,0.); Draw(); glFlush();
}


  Sintaks  tersebut  adalah  sintak  dasar  yang  digunakan,  untuk  bisa  menggunakan  input
keyboard maka harus diberikan callback function untuk memanggilnya.
glutDisplayFunc(renderScene);
glutKeyboardFunc(myKeyboard); glutTimerFunc(30,timer,0);
Sintaks tersebut harus disertakan pada fungsi main.
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.
void keyPressed(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(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 33

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)
 kemudian dilanjutkan dengan pendeklarasian masing-masing method.
void keyPressed(unsigned char key, int x, int y) {
keyStates[key] = true;
}
void keyUp(unsigned char key, int x, int y){ keyStates[key] =
false;
}
void keyOperations(void){ if(keyStates['a']){
// saat tombol ‘a’ ditekan
// aksi yang diberikan saat tombol ‘a’ ditekan }
}
   Sama seperti sebelumnya fungsi-fungsi tersebut akan dipanggil pada fungsi
main dengan callback function berikut:
void display (void){ keyOperations();
glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
// menjadikan background menjadi warna merah

}
2. KONSEP INPUT KEYBOARD SPECIAL KEY
GlutSpecialFunc  merupakan  suatu  fungsi  callback  pada  opengl  yang  digunakan  untuk
mengaktifkan  tombol-tombol  khusus  pada  keyboard  sehingga  dapat  digunakan  untuk
berinteraksi  antara  user  dengan  objek  yang  ada  di  dalam  display  opengl.  Pendeklarasiannya
adalah :
void glutSpecialFunc (void (* func) (int key, int x, int y));

callback  keyboard  khusus  dipicu  ketika  keyboard  fungsi  atau  tombol  special  yang
dideklarasikan ditekan. Parameter callback kunci adalah  GLUT_KEY_tombol khusus.. Parameter
x  dan  y mengindikasikan  koordinat  relatif  jendela  ketika  tombol  ditekan.  Ketika  jendela  baru 34

dibuat, tidak ada callback khusus awalnya terdaftar dan stroke kunci khusus di jendela diabaikan.
Melewati NULL untuk glutSpecialFunc Menonaktifkan generasi callback khusus. Selama callback
khusus, glutGetModifiers dapat dipanggil untuk menentukan keadaan tombol pengubah ketika
keystroke menghasilkan callback terjadi. Nilai-nilai yang tersedia GLUT_KEY_ * adalah:
GLUT_KEY_F1      F1 function key
GLUT_KEY_F2      F2 function key
GLUT_KEY_F3      F3 function key
GLUT_KEY_F4      F4 function key
GLUT_KEY_F5      F5 function key
GLUT_KEY_F6      F6 function key
GLUT_KEY_F7      F7 function key
GLUT_KEY_F8      F8 function key
GLUT_KEY_F9      F9 function key
GLUT_KEY_F10    F10 function key
GLUT_KEY_F11    F11 function key
GLUT_KEY_F12    F12 function key
GLUT_KEY_LEFT    Left function key
GLUT_KEY_RIGHT   Right function key
GLUT_KEY_UP    Up function key
GLUT_KEY_DOWN    Down function key
GLUT_KEY_PAGE_UP   Page Up function key
GLUT_KEY_PAGE_DOWN   PageDown function key
GLUT_KEY_HOME    Home function key
GLUT_KEY_END    End function key
GLUT_KEY_INSERT   Insert function key
Tombol-tombol diatas dapat diaktifkan dengan membuat sebuah  fungsi callback yang
akan  dipanggil  oleh  glutSpecialFunc  ke  dalam  fungsi main  program,  sehingga  user  dapat
berinteraksi dengan objek yang ada dengan menekan tombol-tombol special keyboard yang
telah di deklarasikan ke dalam fungsi callback tersebut. contoh pembuatan fungsi callback
untuk tombol special keyboard :
void mySpecialKeyboard(int key, int x, int y){
   switch(key){
       case  35

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;
 }
}
Selanjutnya fungsi tersebut akan dipanggil oleh glutDisplayFunc ke dalam fungsi main,
berikut script nya :
glutSpecialFunc(mySpecialKeyboard);

Selain  fungsi  callback  yang  mendeklarasikan  tombol  special  keyboard,  untuk  dapat
berinteraksi fungsi tersebut harus memiliki fungsi callback lain yang akan dipanggil kedalam
fungsi  glutDisplayfunc  dan  fungsi  glutTimerFunc  didalam  fungsi main  program  tersebut.
fungsi  callback  di  dalam  fungsi  glutDisplayFunk merupakan  fungsi  yang mendklarasikan
objek yang akan berinteraksi dengan  tombol keyborad,   Sedangkan  fungsi glutTimerFunc
berfungsi agar tombol keyboard dapat terus terdeteksi oleh glut.  Contoh program interaksi
keyboard lengkap :
#include <stdlib.h>  36

#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);
  glPushMatrix();
  glTranslatef(c, d, 0);
  triAngles();
  glPopMatrix();
  glFlush();
}

void main(int argc, char **argv){
  glutInit(&argc, argv);
  glutInitWindowPosition(100, 100);
  glutInitWindowSize(640, 480);
  glutCreateWindow("uji keyfunc");
  gluOrtho2D(-320., 320., -240., 240.);
  glutTimerFunc(50, timer, 0);
  glutDisplayFunc(renderScene);
  glutSpecialFunc(mySpecialKeyboard);
  glutMainLoop();
}

  Sesuai dengan program dimana setiap tombol arah akan memiliki nilai variabel c
dan d yang berbeda-beda yang akan mengakibatkan gambar akan bergeser dengan arah yang
sesuai nilai variabel tersebut ketika tombol khusus arah (up, down, left dan right) ditekan.
  KONSEP MOUSE PADA GLUT  37

Dalam konsep mouse pada glut ada beberapa fungsi dasar dan inisialisasi yang
digunakan untuk melakukan interaksi mouse. Adapun penjelasannya adalah sebagai
berikut :  
2.  Fungsi dasar pembuatan interaksi dengan menggunakan MouseFunction
GLUTAPI void APIENTRY glutMouseFunc(void (GLUTCALLBACK *func)(int button,
int state, int x, int y));
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.
3.  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);
}
void motion(int x,int y){
}
Dalam penerapan interaksi mouse pada open gl / glut, Fungsi inisialisasinya adalah sebagai
berikut :
1.  GLUT_LEFT_BUTTON
Fungsi inisialisasi ini bertujuan untuk inisialisasi button mouse kiri. Jadi apabila
kita ingin mengaktifkan fungsi penggunaan dari button mouse sebelah kiri maka bisa
menggunakan fungsi inisialisasi ini.
2.  GLUT_RIGHT_BUTTON
Fungsi inisialisasi ini bertujuan untuk inisialisasi button mouse kanan. Jadi
apabila kita ingin mengaktifkan fungsi penggunaan dari button mouse sebelah kanan
maka bisa menggunakan fungsi inisialisasi ini.
3.  GLUT_MIDDLE_BUTTON
Fungsi inisialisasi ini bertujuan untuk inisialisasi button mouse tengah. Jadi
apabila kita ingin mengaktifkan fungsi penggunaan dari button mouse tengah maka bisa
menggunakan fungsi inisialisasi ini.
4.  GLUT_DOWN
Fungsi inisialisasi ini adalah untuk inisialisasi ketika tombol mouse ditekan.
5.  GLUT_UP   38

Fungsi  inisialisasi  ini adalah untuk  inisialisasi ketika tombol mouse dilepaskan.
Kemudian  pada  main  program  perlu  menambahkan  fungsi  untuk  callback  fungsi
MouseFunction. glutMouseFunc(mouse); glutMotionFunc(motion);
3. Sistim Koordinat interaksi mouse pada glut
Sistim  koordinat  interaksi  mouse  pada  glut  adalah  sebagai  berikut.  Misalnya
ditentukan iinisialisasi awal adalah :
int w = 480, h=480; float x=0, y=0, z=0;
maka :
a.  Titik  0,0  berada  pada  pojok  kiri  atas,  koordinatnya  akan  berubah  apabila  terjadi
pergeseran mouse.
b.  Titik 480,0 berada pada pojok kanan atas.
c.  Titik 0, 480 berada pada pojok kiri bawah
d.  Titik 480,480 berada pada pojok kanan bawah
CONTOH PROGAM PENERAPAN MOUSE PADA GLUT
   39

#include <stdlib.h>
#include <glut.h>
#include <stdio.h>

void Triangles(){

  glBegin(GL_TRIANGLES);
  glVertex2i(0, 0);
  glVertex2i(100, -30);
  glVertex2i(100, 30);
  glEnd();
}  

void mouseku(int button, int state, int x, int y){
  if (button == GLUT_LEFT_BUTTON){
    printf("tombol KIRI (%d,%d)\n", x, y);
  }
  else if (button == GLUT_MIDDLE_BUTTON){
    printf("tombol TENGAH (%d,%d)\n", x, y);
  }
  else{
    printf("tombol KANAN (%d,%d)\n", x, y);
  }
  if (state == GLUT_DOWN){
    printf("tombol DITEKAN\n");
  }
  else{
    printf("tombol DILEPAS\n");
  }
} void display(){
  glClear(GL_COLOR_BUFFER_BIT); glRotatef(10, 0., 0., 1.);
  Triangles();
  glFlush();
}  
void Timer(int value){
  glutPostRedisplay();
  glutTimerFunc(30, Timer, 0);
}
void main(int argc, char **argv){
  glutInit(&argc, argv);
  glutInitDisplayMode(GLUT_DEPTH | GLUT_SINGLE | GLUT_RGBA);
  glutInitWindowPosition(100, 100);    
  glutInitWindowSize(320, 320);  
  glutCreateWindow("coba");
  glutDisplayFunc(display);
  gluOrtho2D(-320.0, 320.0, -320.0, 320.0);
  glutTimerFunc(10, Timer, 0); glutMouseFunc(mouseku);
  glutMainLoop();

}  
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); 40

  glEnd();

}

void mouseku(int button, int state, int x, int y){
  if (button == GLUT_LEFT_BUTTON){
    printf("tombol KIRI (%d,%d)\n", x, y);
  }
  else if (button == GLUT_MIDDLE_BUTTON){
    printf("tombol TENGAH (%d, %d)\n", x, y);
  }
  else{
    printf("tombol KANAN (%d,%d)\n", x, y);
  }
  if (state == GLUT_DOWN){
    printf("tombol DITEKAN\n");
  }
  else{
    printf("tombol DILEPAS\n");
  }
}
void motionku(int x, int y){
  printf("posisi printer mouse (%d, %d)\n", x, y);
}
void display(){
  glClear(GL_COLOR_BUFFER_BIT);    glRotatef(89, 0., 0., 1.);
  Triangles();
  glFlush();
}
void Timer(int value){
  glutPostRedisplay();
  glutTimerFunc(10, Timer, 0);
}
void main(int argc, char **argv){
  glutInit(&argc, argv);

  glutInitDisplayMode(GLUT_DEPTH | GLUT_SINGLE | GLUT_RGBA);
  glutInitWindowPosition(100, 100);
  glutInitWindowSize(320, 320);
  glutCreateWindow("GLUT");
  glutDisplayFunc(display);
  gluOrtho2D(-320.0, 320.0, -320.0, 320.0);

  glutTimerFunc(10, Timer, 0);
  glutMouseFunc(mouseku);
  glutMotionFunc(motionku);
  glutMainLoop();
}


4.  Contoh Implementasi
#include "stdlib.h"
#include "stdio.h"
#include <conio.h>
#include "glut.h"

float x = 1, y = 1, z = 0;
int w = 480, h = 480, flag = 0, flg;
 41

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);      42

  glutDisplayFunc(renderScene);  
  glutMouseFunc(mouse);
  glutTimerFunc(1, timer, 0);  
  glutMainLoop();
}



   43

BAB VII
OBJEK 3D
C.  TUJUAN
1.  Mampu memahami konsep Objek 3D wireframe pada openGL
2.  Mampu  membuat objek 3d wirefirme pada openGL
3.  Mampu melakukan implemntasi transformasi pada objek 3d dengan OpenGL

D.  MATERI
1.  Pembuatan Objek 3D wireframe
2.  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.
•  Sphere glutWireSphere(5, 20, 20);

•  Cube
glutWireCube(25);

•  Cone glutWireCone(alas, tinggi, 20, 20);

•  Dodecahedron glutWireDodecahedron();  44


•  Teapot glutWireTeapot(15);

•  Torus glutWireTorus(luar, dalam, 20, 20);

Setiap primitive 3D memiliki parameter nilai yang mengekspresikan letak dan bentuk
primitive objek tersebut.
F. Transformasi Objek 3 Dimensi
Metode  transformasi objek  tiga dimensi  sangat berbeda dengan objek dua dimensi
karena terdapat sumbu z yang ditambahkan sebagai salah satu acuan untuk memperoleh
posisi koordinat baru. a. Translasi (Perpindahan)
Dalam tranformasi objek tiga dimensi, translasi adalah pemindahan suatu titik dari
titik P=(x,y,z) ke posisi P=(x’,y’,z’) (Hearn, 1994) dengan menggunakan operasi matriks :

Parameter tx, ty, dan tz menjelaskan perpindahan jarak untuk koordinat x, y, dan z.
 45

Sebuah bangun tiga dimensi yang ditranslasikan dengan vektor  tertentu, dilakukan
dengan memindahkan titik-titik sesuai dengan vektor tersebut.

B.  Contoh Program dalam Open GL
1. Contoh Penerapan “Cube” pada GLUT
Cube   menggunakan   fungsi  
void glutWireCube(GLdouble size);
untuk menentukan ukuran panjang sisi.
   
#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 resize(int w1, int h1){
  glViewport(0, 0, w1, h1);
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  gluPerspective(45.0, (float)w1 / (float)h1,1.0, 300.0);
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();
}
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, int z){
  if (key == 'x'){
    sx = 1;
    sy = 0;
    sz = 0; 46

    sudut += 10;
  }
  else if (key == 'y'){
    sx = 0;  
    sy = 1;  
    sz = 0;
    sudut += 10;
  }
  else if (key == 'z'){
    sx = 0;
    sy = 0;    
    sz = 1;
  }
}

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);  
  glutReshapeFunc(resize);
  init();
  glutTimerFunc(50, update, 0);
  glutKeyboardFunc(myKeyboard);
  glutMainLoop();
}

Note:
Dengan interaksi keyboard “y”, maka objek akan berotasi pada sumbu y saja.
2. Contoh Penerapan “WireSphere” pada GLUT
WireSphere menggunakan fungsi
void glutWireSphere(GLdouble radius,GLint slices, GLintstacks);
 untuk membuat bola berpusat pada asal pemodelan sistem koordinat.
#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, 150);
}
void display(){
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  glLoadIdentity();
  glTranslatef(0, 0, z);
  glRotatef(sudut, sx, sy, sz);
  sphere();
  glutSwapBuffers();
} 47

void resize(int w1, int h1){
  glViewport(0, 0, w1, h1);
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  gluPerspective(45.0, (float)w1 / (float)h1, 1.0, 300.0);
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();
}
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 == 'y'){
    sy = 1;
    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);    glutReshapeFunc(resize);
  init();
  glutTimerFunc(50, update, 0);
  glutKeyboardFunc(myKeyboard);
  glutMainLoop();
}

Note :
-  Dengan interaksi keyoboard “y”, objek akan berotasi pada sumbu y saja.
  3. Contoh Penerapan “WireCone” pada GLUT
  WireCone menggunakan fungsi void
glutWireCone(GLdouble base, GLdouble height,GLintslices, GLint stacks);
untuk membuat ukuran benda ditentukan dari dasar jari-jari alasnya.
#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); 48

  glutWireCone(10, 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 resize(int w1, int h1){
  glViewport(0, 0, w1, h1);
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  gluPerspective(45.0, (float)w1 / (float)h1,1.0, 300.0);
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();
}
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;
  }
  else if (key == 'y'){
    sx = 0;
    sy = 1;
    sz = 0;
    sudut += 10;
  }
  else if (key == 'z'){
    sx = 0;
    sy = 0;
    sz = 1;
  }
}
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);
  glutReshapeFunc(resize);
  init();
  glutTimerFunc(50, update, 0);
  glutKeyboardFunc(myKeyboard);
  glutMainLoop(); 49

}
Note :
Dengan  interaksi  keyoboard  “x”, objek akan berotasi pada  sumbu  x  saja. Dengan  interaksi
keyboard “z”, objek akan berotasi pada sumbu z saja
4.  Contoh Penerapan “Torus” pada GLUT
Torus menggunakan fungsi
void glutWireTorus(GLdouble innerRadius, GLdouble outerRadius,GLint nsides, GLint
rings); .
untuk merender 12 sisi yang berpusat pada asal, dan dengan radius sama dengan kuadrat
dari 3.
#include <stdlib.h>
#include <glut.h>
float w = 480, h = 480;
float
sudut = 0, sx = 0, sy = 0, sz = 0, dalam = 20, luar = 50, sides = 50, rings =
50;

void torus(){
  glColor3d(0, 1, 1);
  glutWireTorus(dalam, luar, sides, rings);
}
void display(){
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  glLoadIdentity();
  glTranslatef(0, 0, -200);
  glRotatef(sudut, sx, sy, sz);
  torus();
  glutSwapBuffers();
}
void resize(int w1, int h1){
  glViewport(0, 0, w1, h1);
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  gluPerspective(45.0, (float)w1 / (float)h1, 1.0, 300.0);
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();
}
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;
  }
  else if (key == 'y'){
    sx = 0;
    sy = 1;
    sz = 0;
    sudut += 10; 50

  }
  else if (key == 'z'){
    sx = 0;
    sy = 0;
    sz = 1;
    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);
  glutReshapeFunc(resize);
  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 berotasi pada sumbu z saja.
5.  Contoh Penerapan “Dose” pada GLUT
Dode   menggunakan   fungsi  
void glutWireDodecahedron(void);
untuk merenders padat atau wireframe 12-sisi biasa padat. Berpusat di sekitar asal
dan dengan radius sama dengan akar kuadrat dari 3
#include <stdlib.h>
#include <glut.h>
float w = 480, h = 480;
float sudut = 0, sx = 0, sy = 0, sz = 0, t = -7;
void wireDode(){
  glColor3d(0, 1, 0);
  glutWireDodecahedron();
}
void display(){
  glClear(GL_COLOR_BUFFER_BIT |
  GL_DEPTH_BUFFER_BIT);
  glLoadIdentity();
  glTranslatef(0, 0, t);
  glRotatef(sudut, sx, sy, sz);
  wireDode();
  glutSwapBuffers();
}
void resize(int w1, int h1){
  glViewport(0, 0, w1, h1); 51

  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  gluPerspective(45.0, (float)w1 / (float)h1,1.0, 300.0);
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();
}
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;
    }
    else if (key == 'y'){
      sx = 0;
      sy = 1;
      sz = 0;
      sudut += 10;
    }
    else if (key == 'z'){
      sx = 0;
      sy = 0;
      sz = 1;
      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);
  glutReshapeFunc(resize);
  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.
6.  Contoh Penerapan “TetraHedron” pada GLUT  52

TetraHedron menggunakan fungsi
glutWiredTetrahedronvoid (void);
untuk merenders padat atau   wireframe 4-sisi biasa padat. Berpusat di sekitar asal
dan dengan radius sama dengan akar kuadrat dari 3.
#include <stdlib.h>
#include <glut.h>
float w=480,h=480;
float sudut = 0, sx = 0, sy = 0, sz = 0, t = -5;

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 resize(int w1, int h1){
  glViewport(0, 0, w1, h1);  
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  gluPerspective(45.0, (float)w1 / (float)h1,1.0, 300.0);
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();
}
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;
  }
  else if (key == 'y'){
    sx = 0;
    sy = 1;
    sz = 0;
    sudut += 10;
  }
  else if (key == 'z'){
    sx = 0;
    sy = 0;  
    sz = 1;
    sudut += 10;
  }
}
void update(int value){
  glutPostRedisplay();
  glutTimerFunc(50, update, 0); 53

}
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);
  glutReshapeFunc(resize);  
  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 berotasi pada sumbu z saja.
7.  Contoh Penerapan “OctaHedron” pada GLUT
OctaHedron menggunakan fungsi
void glutWireOctahedron(void);
#include <stdlib.h>
#include <glut.h>
float w = 480, h = 480;
float sudut = 0, sx = 0, sy = 0, sz = 0, t = -5;
void WireOctahedron(){
  glColor3d(1, 0, 1);
  glutWireOctahedron();
}
void display(){
  glClear(GL_COLOR_BUFFER_BIT |GL_DEPTH_BUFFER_BIT);
  glLoadIdentity();
  glTranslatef(0, 0, t);
  glRotatef(sudut, sx, sy, sz);
  WireOctahedron();
  glutSwapBuffers();
}
void resize(int w1, int h1){
  glViewport(0, 0, w1, h1);
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  gluPerspective(45.0, (float)w1 / (float)h1,1.0, 300.0);
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();

}
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.); 54

  glMatrixMode(GL_MODELVIEW);
}
void myKeyboard(unsigned char key, int x, int y){
  if (key == 'x'){
    sx = 1;
    sy = 0;
    sz = 0;
    sudut += 10;
  }
  else if (key == 'y'){
    sx = 0;
    sy = 1;
    sz = 0;
    sudut += 10;
  }
  else if (key == 'z'){
    sx = 0;
    sy = 0;
    sz = 1;
    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);
  glutReshapeFunc(resize);
  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 berotasi pada sumbu z saja.
8.  Contoh Penerapan “Teapot” pada GLUT
Teapot menggunakan fungsi
void glutWireTeapot(GLdouble size);
Untuk merender dengan teapot dengan source code sebagai berikut :
#include<stdlib.h>
#include<glut.h>
float w = 480, h = 480;
float sudut = 0, sx = 0, sy = 0, sz = 0, t = -100, tepot = 10;
void teapot(){
  glColor3d(1, 1, 1); 55

  glutWireTeapot(tepot);
}
void display(){
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  glLoadIdentity();
  glTranslatef(0, 0, t);
  glRotatef(sudut, sx, sy, sz);
  teapot();
  glutSwapBuffers();
}
void resize(int w1, int h1){
  glViewport(0, 0, w1, h1);
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  gluPerspective(45.0, (float)w1 / (float)h1, 1.0, 300.0);
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();
}
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;
  }
  else if (key == 'y'){
    sx = 0;
    sy = 1;
    sz = 0;
    sudut += 10;
  }
  else if (key == 'z'){
    sx = 0;
    sy = 0;
    sz = 1;
    sudut += 10;
  }
}
void mySpecialKeyboard(int key, int x, int y){
  switch (key){
  case GLUT_KEY_UP:
    tepot += 1;
    break;
  case GLUT_KEY_DOWN:
    tepot -= 1;
    break;
  }
}
void update(int value){
  glutPostRedisplay();
  glutTimerFunc(50, update, 0);
}
void main(int argc, char **argv){
  glutInit(&argc, argv); 56

  glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH | GLUT_RGBA);
  glutInitWindowPosition(100, 100);
  glutInitWindowSize(w, h);
  glutCreateWindow("Objek 3D");
  glutDisplayFunc(display);
  glutReshapeFunc(resize);
  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 beritasi pada sumbu y saja. Dengan interaksi keyboard “z”,
objek akan berotasi pada sumbu z saja.


  Tugas 
   57

Bab VIII
Objek Solid dan Lighting  
C.  TUJUAN
1.  Mampu memahami konsep Objek 3D solid pada openGL
2.  Mampu  membuat objek 3d solid pada openGL
3.  Mampu melakukan implemntasi transformasi pada objek 3d dengan OpenGL
4.  Mampu memahami konsep lighting pada openGL
5.  Mampu melakukan implementasi lighting objek 3d dengan opnGL

D.  MATERI
1.  Pembuatan Objek 3D Solid
2.  Transformasi Objek 3D Solid
3.  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.

Seperti  ditunjukkan  pada  Gambar  diatas,  wilayah  gelap  tampak  tidak  berbeda
dari bulatan dua dimensi . hal Ini menunjukkan betapa pentingnya interaksi antara obyek dan
cahaya  adalah dalam menciptakan  adegan  tiga dimensi.   Agar   obyek    yang    telah   dibuat
terlihat  lebih  nyata,  diperlukan  tambahan  efek pencahayaan  pada  obyek  yang  telah  kita
buat.  Pencahayaan  adalah  proses  pemberian cahaya  pada  suatu  obyek,  dikenal  dengan
istilah  lighting  atau  iluminasi.  Pada  OpenGL terdapat  sebuah  perbedaan  penting  antara
warna   dan   pencahayaan   yang   perlu   pahami. Ketika   menggunakan   pencahayaan   atau
tekstur   pemetaan   dengan   efek   pencahayaan dihidupkan, warna dari vertex adalah efek 58

kumulatif  dari  warna  bahan  dan  cahaya  yang  bersinar  di  puncak.  Ketika  pencahayaan
dimatikan, maka warna dari vertex adalah efek pengaturan warna dan warna yang berbeda
dengan bahan warna.

Dengan menggunakan OpenGL, dapat memanipulasi pencahayaan dan obyek dalam
sebuah  adegan  untuk  menciptakan  berbagai  macam  efek.  Dalam  pokok  bahasan  pada
bab  pencahayaan    akan    dimulai    dengan    sebuah    pencahayaan    yang    penting    pada
permukaan  tersembunyi    penghapusan.    Kemudian    menjelaskan    bagaimana    untuk
mengontrol  pencahayaan  dalam  suatu  adegan,  membahas  model  konseptual  OpenGL
pencahayaan,  dan menggambarkan    secara    rinci    cara   mengatur    pencahayaan    dengan
banyak    parameter    untuk mendapatkan    efek    tertentu.    Pada    akhir    bab,    perhitungan
matematis  yang  menentukan bagaimana warna mempengaruhi pencahayaan disajikan  
A.  Cahaya Ambient, Diffuse, dan Specular  
Pencahayaan   ambient   adalah    cahaya  yang  sudah berserakan begitu banyak
disebabkan  oleh  lingkungan  dan  arahnya  tidak  mungkin  ditentukan  atau  tampaknya
datang  dari  segala  penjuru.  Backlighting  pada  sebuah  ruangan  memiliki  komponen
ambient  besar,  karena  sebagian  besar  cahaya  yang  mencapai  mata  yang  memantul
dari banyak  permukaan.  Sebuah  lampu  sorot  kecil  di  luar  rumah  memiliki  komponen
ambient, sebagian besar cahaya dalam arah yang sama, dan karena diluar, sangat sedikit
cahaya mencapai mata setelah memantul dari benda-benda lain. Ketika cahaya ambient
menyerang permukaan, maka akan tersebar merata di segala penjuru.  
Komponen  cahaya  diffuse  adalah  komponen  yang  berasal  dari  satu  arah,  jadi
akan  terang  kalau  hal  tersebut  terjadi  tepat  diatas  sebuah  permukaan  dibandingkan
jika hampir  tidak  terjadi  di  atas  permukaan.  Setelah  mengenai permukaan,  akan
tersebar merata  di  segala  penjuru,  sehingga  tampak  sama-sama  terang,  tak  peduli  di
mana  mata berada.  Setiap  cahaya  yang  datang  dari  posisi  atau  arah  tertentu
mungkin  memiliki komponen diffuse.  

Cahaya  specular  datang  dari  arah  tertentu,  dan  cenderung  terpental  pada permukaan
dalam   arah  yang   diinginkan.  sinar  laser   berkualitas   tinggi  memantul   pada cermin
dan  menghasilkan  hampir  100  persen  refleksi  specular.  Logam  atau  plastik mengkilap
memiliki  komponen  specular  tinggi,  dan  kapur  atau  karpet  telah  hampir  tidak  ada.
Specularity dapat juga dianggap sebagai shininess.    59


Meskipun  sumber  cahaya  memberikan  satu  distribusi  frekuensi,  komponen
ambient,  diffuse,  dan  specular  mungkin  berbeda.  Sebagai  contoh,  jika  memiliki
cahaya  putih  di  sebuah  ruangan  dengan  dinding  merah,  cahaya  yang  tersebar
cenderung menjadi warna  merah,  meskipun  cahaya  secara  langsung  objek  putih
yang  mencolok.  OpenGL memungkinkan  untuk  mengatur  nilai  merah,  hijau,  dan
biru  untuk  setiap  komponen cahaya secara bebas.  
Selain  pencahayaan    Ambient,  Diffuse,  dan  Specular,    terdapat  juga
pencahayaan Emmisive, yaitu sebuah objek memancarkan cahayanya sendiri.
parameter variabel untuk memilih material warna jenis apa yang diaktifkan
pilihannya antara lain seprti tabel dibawah

B.  Implementasi Pencahayaan (lighting) pada OpenGL
Object 3D (Solid) Bentuk Solid
Fungsi Solid merupakan implementasi dari object 3D yang berpusat pada asal pemodelan
sistem koordinat. Utara dan kutub selatan bola berada di Z positif dan negatif sumbumasing-
masing dan meridian utama persimpangan sumbu X positif.
Berikut adalah list untuk bangun 3D:

a.  Kubus Solid void glutSolidCube(GLdouble size);  60

b.  Fungsi glutSolidSphere membuat bola berpusat pada asal pemodelan  sistem koordinat.
Utara dan kutub  selatan bola berada di Z positif dan negatif sumbumasing-masing dan
meridian utama persimpangan sumbu X positif.
void glutSolidSphere(GLdouble radius,GLint slices, GLint
stacks);
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);
e.  Dodecahedron Solid void glutSolidDodecahedron(void);
f.  Tetra Hedron solid.
glutSolidTetrahedron void (void);
g.  Oktahedron solid.
void glutSolidOctahedron(void);
h.  Icosahedron solid.
void glutSolidIcosahedron(void);
i.  Poci teh solid
void glutSolidTeapot(GLdouble size);
C.  Contoh Program
Proyeksi cube
#include <Windows.h>
#include <iostream>
#include <glut.h>
#include <math.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
 61

  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[] =
  {
    0.7f, 0.7f, 0.7f, 1.0f
  };//mensettingpencahayaan
  GLfloat light_position[] =
  {
    2.0f, 6.0f, 3.0f, 0.0f
  };
  glLightfv(GL_LIGHT0, GL_DIFFUSE, lightIntensity);
  glLightfv(GL_LIGHT0, GL_POSITION, light_position);
}
void setViewport()
{
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  double winHt = 1.0;
  //half height of thewindow
  glOrtho(-winHt * 64 / 48, winHt * 64 / 48, -winHt, winHt, 0.1, 100.0);
}
void setCamera()
{
  // set the camera
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();
  gluLookAt(3.3, 3.3, 3.0, 0, 0.25, 0, 0.0, 1.0, 0.0);
}

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"); 62

  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();
}
Impelemntasi bumi, bulan, matahari :
#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) {

  glClearColor(0.0, 0.0, 0.0, 0.0);
  glShadeModel(GL_SMOOTH);

  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 };

  GLfloat matahari_ambient[] = { 1.0, 1.0, 0.0, 0.0 };
  GLfloat matahari_diffuse[] = { 0.0, 0.0, 0.0, 0.0 };
  GLfloat matahari_specular[] = { 0.0, 0.0, 0.0, 0.0 };
  GLfloat matahari_shininess[] = { 15.0 };

  GLfloat bumi_ambient[] = { 0.0, 0.0, 2.0, 0.0 };
  GLfloat bumi_diffuse[] = { 0.0, 0.0, 1.0, 0.0 };
  GLfloat bumi_specular[] = { 0.0, 0.0, 0.3, 0.0 };
  GLfloat bumi_shininess[] = { 15.0 };


  GLfloat bulan_ambient[] = { 0.0, 0.0, 0.2, 0.0 };
  GLfloat bulan_diffuse[] = { 1.0, 1.0, 1.0, 0.0 };
  GLfloat bulan_specular[] = { 0.2, 0.2, 0.2, 0.0 }; 63

  GLfloat bulan_shininess[] = { 1.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);
  glPushMatrix();


  // 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();
}

// Handle special key-press  
void specialkey(int key, int x, int y) {
 64

  switch (key) {
  case GLUT_KEY_UP:
    rx += 5;
    break;

  case GLUT_KEY_DOWN:
    rx -= 5;
    break;

  case GLUT_KEY_RIGHT:
    ry += 5;
    break;

  case GLUT_KEY_LEFT:
    ry -= 5;
    break;

  default:
    break;
  }

  // Gambar kembali window  
  glutPostRedisplay();
}

void keyboard(unsigned char key, int x, int y) {

  switch (key) {
  case 'f': // Kamera lihat dari depan  
  case 'F':
    cx = 0; cy = 0; cz = 5;
    break;

  case 'n': // Kamera lihat dari samping kanan  
  case 'N':
    cx = 5; cy = 0; cz = 0;
    break;

  case 'l': // Kamera lihat dari depan-atas-kanan  
  case 'L':
    cx = 5; cy = 3; cz = 2;
    break;

  default:
    break;
  }

  // Gambar kembali window  
  glutPostRedisplay();
}

int main(int argc, char **argv)
{
  glutInit(&argc, argv);
  glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);

  glutInitWindowSize(600, 600);
  glutInitWindowPosition(100, 100);

  glutCreateWindow("Kehidupan");
  init();
 65

  shapeindex = 1;
  cx = 0; cy = 6; cz = 6;

  glutDisplayFunc(display);
  glutKeyboardFunc(keyboard);
  glutSpecialFunc(specialkey);
  glutIdleFunc(animate);
  glutMainLoop();

  return 0;
}

0 komentar:

Posting Komentar