Anda di halaman 1dari 13

PERMASALAHAN

PRAKTIKUM 5
Pertanyaan :
1. Jelaskan apa saja yang harus dilakukan agar dapat menggerakkan objek dengan keyboard?
2. Jelaskan Fungsi GluLookAt!
3. Dari kode di atas, terdapat dua proyeksi (Pojection, dan Model View), Jelaskan cara
kerjanya. Mengapa keduanya digunakan?
Tugas :
Cobalah untuk mengubah-ubah kode di atas untuk :
a. Mengubah sudut geser
b. Mengubah papan tombol yang digunakan

PEMBAHASAN
1.

Untuk menggerakan objek dengan menggunakan keyboard, terlebih dahulu


membentuk sebuah variabel yaitu rotAngle untuk rotasi horizontal dan rotAngle1 untuk
rotasi vertikal. Kemudian membuat sebuah void keyboard yang berisi sebuah case of. Isi
dari case of tersebut adalah tombol-tombol keyboard yang akan digunakan untuk
menggerakan objek secara horizontal maupun vertikal. Apabila salah satu tombol ditekan
maka nilai rotAngle atau rotAngle1 akan berkurang atau bertambah sesuai dengan tombol
yang ditekan. Kemudian nilai rotAngle atau rotAngle1 yang baru akan digunakan untuk
parameter fungsi glRotated pada fungsi display. Pada menu utama, dipanggil fungsi
keyboard menggunakan glKeyboardFunc.

2. GlutLookAt digunakan untuk mengatur posisi kamera dalam melihat sebuah objek yang
ditampilkan pada layar.
gluLookAt( eye.x, eye.y, eye.z, look.x, look.y, look.z, up.x, up.y, up.z);
eye digunakan untuk memposisikan kamera
look digunakan untuk memposisikan titik pusat objek
up digunakan untuk menentukan arah

3.

Cara kerja Projection adalah memproyeksikan objek sehingga objek yang ditampilkan
di layar adalah objek yang jauh akan lebih kecil dari objek yang dekat. Sedangkan
ModelView digunakan untuk menampilkan objek ke layar sesuai dengan ukuran aslinya.
Keduanya digunakan agar objek 3D yang ditampilkan dilayar seperti objek sesungguhnya
yaitu semakin jauh semakin kecil dan ukuran dari objek tidak berubah.

TUGAS
void
keyboard(unsigned char k, int x, int y)
{
switch (k)
{
case 'd':
rotAngle += 60; // increase rotation by 5 degrees
break;
case 'w':
rotAngle1+= 60; // increase rotation by 5 degrees
break;
case 's':
rotAngle1-=60; // increase rotation by 5 degrees
break;
case 'a':
rotAngle -= 60; // decrease rotation by 5 degrees
break;
case 'q':
exit(0); // exit
}
glutPostRedisplay(); // redraw the image now
}

a. Sudut geser diubah, dari 5 derajat menjadi 60 derajat, sehingga apabila ditekan tombol
keyboard sesuai code diatas maka objek akan berotasi sejauh 60 derajat sesuai dengan
tombol yang ditekan.
b. Tombol untuk menggerakan objek diubah pada fungsi keyboard menjadi tombol a untuk
merotasi objek kekiri, d merotasi objek ke kanan, w merotasi objek ke atas, s merotasi
objek ke bawah.

PERMASALAHAN
PRAKTIKUM 6
Pertanyaan :
1. Jelaskan Lighting yang ada di OpenGL !
2. Jelaskan apa kegunaan void lighting di atas !
3. Analisislah Bagaimana Kubus, Grid dan pencahayaan tersebut dapat dibuat!
Tugas :
Apabila sebelumnya sudah pernah membuat sebuah mobil 2D, sekarang buatlah
sebuah mobil 3D yang memanfaatkan Depth dan Lighting.

PERMASALAHAN
1.

Dalam model OpenGL, sumber cahaya hanya memiliki efek ketika ada permukaan
yang menyerap dan memantulkan cahaya. Setiap permukaan diasumsikan terdiri dari
bahan dengan berbagai sifat. Sebuah bahan bisa memancarkan cahaya sendiri seperti
lampu pada sebuah mobil atau mungkin menyebarkan beberapa cahaya yang masuk ke
segala penjuru, dan mungkin juga memantulkan sebagian dari cahaya masuk dalam arah
preferensial seperti cermin atau permukaan mengilap. Model pencahayaan yang OpenGL
mempertimbangkan pencahayaan yang dibagi menjadi empat komponen independen:
memancarkan (emissi), ambient, diffuse, dan specular. Semua empat komponen dihitung
secara independen dan kemudian ditambahkan secara bersamasama.
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 mengilap memiliki
komponen specular tinggi, dan kapur atau karpet telah hampir tidak ada. Specularity dapat
juga dianggap sebagai shininess.
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.

2. Void lighting tersebut digunakan untuk mengaktifkan pencahayaan pada objek yang sudah
dibuat.

3.

Kubus tersusun dari 6 buah poligon segiempat yang disusun sedemikan rupa sehinnga
membentuk kubus. Poligon pertama digunakan sebagai acuan untuk poligon selanjutnya.
Poligon pertama untuk menampilkan bidang bagian depan kubus, kemudian untuk
membuat bagian atas digunakan poligon yang ukurannya sama dengan poligon pertama
namun ditambah rotasi sebesar 90 derajat mengelilingi sumbu x, dan untuk membuat
semua sisi, langkah yang digunakan sama dengan membuat sisi atas namun hanya besar
sudut dan sumbu poros yang diubah. Biasanya metode ini dinamakan Surface of
Revolution.
Pada program ini ditampilkan juga sebuah grid yang dibentuk dari kumpulan garisgaris horizontal dan vertikal. Pada layar, grid akan semakin mengecil/menyatu dengan grid
yang lain pada jarak maksimal karena pada program ini digunakan Projection yang
menyebabkan semua objek diproyeksikan termasuk grid tersebut.
Sedangkan pencahayaan pada program ini memanfaatkan fungsi rotasi dan translasi.
Dimana pada awal pembentukan bangun 3D, terlebih dahulu dibuat jaring-jaring dari
bangun yang akan dibuat. Karena agar semua sisi dapat terkena pencahayaan. Sehingga
apabila sisi belakang dari bangun 3D ini disorot kamera, maka bangun tersebut akan
terang.

TUGAS MOBIL 3D
#include
#include
#include
#include
#include

<math.h>
<GL/glut.h>
<stdio.h>
<string.h>
<stdlib.h>

double rotAngle = 0; // rotation angle (BEWARE: Global)


double rotAngle1 = 0; // rotation angle (BEWARE: Global)
float angle=0.0, deltaAngle = 0.0, ratio;
float x=0.0f,y=1.75f,z=15.0f; // posisi awal kamera
float lx=0.0f,ly=0.0f,lz=-1.0f;
int deltaMove = 0,h,w;
int bitmapHeight=12;
const double PI = 3.141592653589793;
int i,j,radius,jumlah_titik,x_tengah,y_tengah;
void Reshape(int w1, int h1)
{
// Fungsi reshape
if(h1 == 0) h1 = 1;
w = w1;
h = h1;
ratio = 1.0f * w / h;
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glViewport(0, 0, w, h);
gluPerspective(45,ratio,0.1,1000);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(
x, y, z,
x + lx,y + ly,z + lz,
0.0f,1.0f,0.0f);
}
void moveMeFlat(int i)
{
// Fungsi ini untuk maju mundur kamera
x = x + i*(lx)*1;
z = z + i*(lz)*1;
glLoadIdentity();
gluLookAt(x, y, z,x + lx,y + ly,z + lz,0.0f,1.0f,0.0f);
}
void keyboard(unsigned char k, int x, int y)
{
// Fungsi ini untuk rotasi kamera
switch (k)
{
case 'a':
rotAngle += 10; // increase rotation by 5 degrees
break;
case 'w':
rotAngle1 += 10; // increase rotation by 5 degrees
break;
case 's':
rotAngle1 -= 10; // increase rotation by 5 degrees
break;
case 'd':
rotAngle -= 10; // decrease rotation by 5 degrees
break;
case 'q':
exit(0); // exit
}
glutPostRedisplay();
}

void Grid() {
// Fungsi untuk membuat grid di "lantai"
double i;
const float Z_MIN = -50, Z_MAX = 50;
const float X_MIN = -50, X_MAX = 50;
const float gap = 1.5;
glColor3f(0.0, 0.0, 0.0);
glBegin(GL_LINES);
for(i=Z_MIN;i<Z_MAX;i+=gap)
{
glVertex3f(i, 0, Z_MIN);
glVertex3f(i, 0, Z_MAX);
}
for(i=X_MIN;i<X_MAX;i+=gap)
{
glVertex3f(X_MIN, 0, i);
glVertex3f(X_MAX, 0, i);
}
glEnd();
}
void Mobil()
{
glPushMatrix();
glTranslatef(-3,0.8,0);
//---------MONCONG-------------//depan
glPushMatrix();
glTranslatef(0,0,3);
glColor3f(0.6,0.0,0.0);
glBegin(GL_QUADS);
glVertex3f(-1.0f,0.0f,0.0f);
glVertex3f(2.0f,0.0f,0.0f);
glVertex3f(2.0f,1.5f,0.0f);
glVertex3f(-1.0f,1.0f,0.0f);
glEnd();
glPopMatrix();
//atas
glPushMatrix();
glRotated(-90, 1, 0, 0);
glTranslatef(0,-3,1.15);
glRotated(-10, 0, 1, 0);
glColor3f(0.6,0.0,0.0);
glBegin(GL_QUADS);
glVertex3f(-1.0f,0.0f,0.0f);
glVertex3f(2.0f,0.0f,0.0f);
glVertex3f(2.0f,3.0f,0.0f);
glVertex3f(-1.0f,3.0f,0.0f);
glEnd();
glPopMatrix();
//belakang
glPushMatrix();
glRotated(-180, 1, 0, 0);
glTranslatef(0,-1,0);
glColor3f(0.6,0.0,0.0);
glBegin(GL_QUADS);
glTexCoord2f(0.0f,0.0f); // kiri
glVertex3f(-1.0f,1.0f,0.0f);
glTexCoord2f(1.0f,0.0f); // kiri
glVertex3f(2.0f,1.0f,0.0f);
glTexCoord2f(1.0f,1.0f); // kiri
glVertex3f(2.0f,-0.5f,0.0f);
glTexCoord2f(0.0f,1.0f); // kiri
glVertex3f(-1.0f,0.0f,0.0f);
glEnd();
glPopMatrix();
//bawah
glPushMatrix();
glRotated(90, 1, 0, 0);
glTranslatef(0,0,0);
glColor3f(0.6,0.0,0.0);
glBegin(GL_QUADS);
glTexCoord2f(0.0f,0.0f); // kiri
glVertex3f(-1.0f,0.0f,0.0f);
glTexCoord2f(1.0f,0.0f); // kiri
glVertex3f(2.0f,0.0f,0.0f);
glTexCoord2f(1.0f,1.0f); // kiri
glVertex3f(2.0f,3.0f,0.0f);
glTexCoord2f(0.0f,1.0f); // kiri
glVertex3f(-1.0f,3.0f,0.0f);
glEnd();
glPopMatrix();

bawah
bawah
bawah
bawah

bawah
bawah
bawah
bawah

//kiri
glPushMatrix();
glRotated(-90, 0, 1, 0);
glTranslatef(1,0,1);
glColor3f(0.6,0.0,0.0);
glBegin(GL_QUADS);
glVertex3f(-1.0f,0.0f,0.0f);
glVertex3f(2.0f,0.0f,0.0f);
glVertex3f(2.0f,1.0f,0.0f);
glVertex3f(-1.0f,1.0f,0.0f);
glEnd();
glPopMatrix();
//---------MONCONG 2-------------//depan
glPushMatrix();
glTranslatef(0,0,3);
glColor3f(0.6,0.0,0.0);
glBegin(GL_QUADS);
glVertex3f(2.0f,0.0f,0.0f);
glVertex3f(3.2f,0.0f,0.0f);
glVertex3f(3.2f,2.2f,0.0f);
glVertex3f(2.0f,1.5f,0.0f);
glEnd();
glPopMatrix();
//belakang
glPushMatrix();
glRotated(-180, 1, 0, 0);
glTranslatef(0,0,0);
glColor3f(0.6,0.0,0.0);
glBegin(GL_QUADS);
glVertex3f(2.0f,0.0f,0.0f);
glVertex3f(3.2f,0.0f,0.0f);
glVertex3f(3.2f,-2.2f,0.0f);
glVertex3f(2.0f,-1.5f,0.0f);
glEnd();
glPopMatrix();
//atas
glPushMatrix();
glRotated(-90, 1, 0, 0);
glTranslatef(0.25,-3,0.5);
glRotated(-30, 0, 1, 0);
glColor3f(0.6,0.0,0.0);
glBegin(GL_QUADS);
glVertex3f(2.0f,0.0f,0.0f);
glVertex3f(3.4f,0.0f,0.0f);
glVertex3f(3.4f,3.0f,0.0f);
glVertex3f(2.0f,3.0f,0.0f);
glEnd();
glPopMatrix();
//bawah
glPushMatrix();
glRotated(90, 1, 0, 0);
glTranslatef(0,0,0);
glColor3f(0.6,0.0,0.0);
glBegin(GL_QUADS);
glVertex3f(2.0f,0.0f,0.0f);
glVertex3f(3.2f,0.0f,0.0f);
glVertex3f(3.2f,3.0f,0.0f);
glVertex3f(2.0f,3.0f,0.0f);
glEnd();
glPopMatrix();
//---------BODY-------------//depan
glPushMatrix();
glTranslatef(0,0,3);
glColor3f(0.6,0.0,0.0);
glBegin(GL_QUADS);
glVertex3f(3.2f,0.0f,0.0f);
glVertex3f(6.0f,0.0f,0.0f);
glVertex3f(6.0f,2.2f,0.0f);
glVertex3f(3.2f,2.2f,0.0f);
glEnd();
glPopMatrix();
//belakang
glPushMatrix();
glRotated(-180, 1, 0, 0);
glTranslatef(0,0,0);
glColor3f(0.6,0.0,0.0);
glBegin(GL_QUADS);
glVertex3f(3.2f,0.0f,0.0f);
glVertex3f(6.0f,0.0f,0.0f);
glVertex3f(6.0f,-2.2f,0.0f);
glVertex3f(3.2f,-2.2f,0.0f);

glEnd();
glPopMatrix();
//atas
glPushMatrix();
glRotated(-90, 1, 0, 0);
glTranslatef(0,-3,2.2);
glColor3f(0.6,0.0,0.0);
glBegin(GL_QUADS);
glVertex3f(3.2f,0.0f,0.0f);
glVertex3f(6.0f,0.0f,0.0f);
glVertex3f(6.0f,3.0f,0.0f);
glVertex3f(3.2f,3.0f,0.0f);
glEnd();
glPopMatrix();
//bawah
glPushMatrix();
glRotated(90,1,0,0);
glTranslatef(0,0,0);
glColor3f(0.6,0.0,0.0);
glBegin(GL_QUADS);
glVertex3f(3.2f,0.0f,0.0f);
glVertex3f(6.0f,0.0f,0.0f);
glVertex3f(6.0f,3.0f,0.0f);
glVertex3f(3.2f,3.0f,0.0f);
glEnd();
glPopMatrix();
//kanan
glPushMatrix();
glRotated(90, 0, 1, 0);
glTranslatef(-6.2,0,6);
glColor3f(0.6,0.0,0.0);
glBegin(GL_QUADS);
glVertex3f(3.2f,0.0f,0.0f);
glVertex3f(6.2f,0.0f,0.0f);
glVertex3f(6.2f,2.2f,0.0f);
glVertex3f(3.2f,2.2f,0.0f);
glEnd();
glPopMatrix();

//---------BAK-------------//depan
glPushMatrix();
glTranslatef(0,0,3);
glColor3f(0.6,0.0,0.0);
glBegin(GL_QUADS);
glVertex3f(6.0f,0.0f,0.0f);
glVertex3f(9.0f,0.0f,0.0f);
glVertex3f(9.0f,1.2f,0.0f);
glVertex3f(6.0f,1.2f,0.0f);
glEnd();
glPopMatrix();
//belakang
glPushMatrix();
glRotated(-180,1,0,0);
glTranslatef(0,-1.2,0);
glColor3f(0.6,0.0,0.0);
glBegin(GL_QUADS);
glVertex3f(6.0f,0.0f,0.0f);
glVertex3f(9.0f,0.0f,0.0f);
glVertex3f(9.0f,1.2f,0.0f);
glVertex3f(6.0f,1.2f,0.0f);
glEnd();
glPopMatrix();
//bawah
glPushMatrix();
glRotated(90,1,0,0);
glTranslatef(0,0,0);
glColor3f(0.6,0.0,0.0);
glBegin(GL_QUADS);
glVertex3f(6.0f,0.0f,0.0f);
glVertex3f(9.0f,0.0f,0.0f);
glVertex3f(9.0f,3.0f,0.0f);
glVertex3f(6.0f,3.0f,0.0f);
glEnd();
glPopMatrix();
//atas
glPushMatrix();
glRotated(-90,1,0,0);
glTranslatef(0,-3,1.2);
glColor3f(0.6,0.0,0.0);
glBegin(GL_QUADS);

glVertex3f(6.0f,0.0f,0.0f);
glVertex3f(9.0f,0.0f,0.0f);
glVertex3f(9.0f,3.0f,0.0f);
glVertex3f(6.0f,3.0f,0.0f);
glEnd();
glPopMatrix();
//atas
glPushMatrix();
glRotated(-90,1,0,0);
glTranslatef(0,-3,1.2);
glColor3f(0.6,0.0,0.0);
glBegin(GL_QUADS);
glVertex3f(6.0f,0.0f,0.0f);
glVertex3f(9.0f,0.0f,0.0f);
glVertex3f(9.0f,3.0f,0.0f);
glVertex3f(6.0f,3.0f,0.0f);
glEnd();
glPopMatrix();
//kanan
glPushMatrix();
glRotated(90,0,1,0);
glTranslatef(-9,0,9);
glColor3f(0.6,0.0,0.0);
glBegin(GL_QUADS);
glVertex3f(6.0f,0.0f,0.0f);
glVertex3f(9.0f,0.0f,0.0f);
glVertex3f(9.0f,1.2f,0.0f);
glVertex3f(6.0f,1.2f,0.0f);
glEnd();
glPopMatrix();
//---------RODA 1-------------glPushMatrix();
for(j=0;j<=360;j++){
glPushMatrix();
glTranslatef(1,0,-0.5);
glRotated(90,1,0,0);
glRotated(j,0,1,0);
glTranslatef(0,3,0.8);
glColor3f(0.3,0.3,0.3);
glBegin(GL_QUADS);
glVertex3f(0,0,0);
glVertex3f(0.1,0,0);
glVertex3f(0.1,0.6,0);
glVertex3f(0,0.6,0);
glEnd();
glPopMatrix();
}
glPopMatrix();
glPushMatrix();
glTranslatef(0,0,3.1);
glColor3f(0.3,0.3,0.3);
glBegin(GL_TRIANGLE_FAN);
radius=80;
jumlah_titik=20;
x_tengah=100;
y_tengah=0;
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/100,y/100);
}
glEnd();
glPopMatrix();
glPushMatrix();
glTranslatef(0,0,2.5);
glRotated(180,1,0,0);
glColor3f(0.3,0.3,0.3);
glBegin(GL_TRIANGLE_FAN);
radius=80;
jumlah_titik=20;
x_tengah=100;
y_tengah=0;
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/100,y/100);
}
glEnd();
glPopMatrix();
glPopMatrix():}

void display() {
// Kalau move dan angle tidak nol, gerakkan kamera...
if (deltaMove)
moveMeFlat(deltaMove);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glRotated(rotAngle, 0, 1, 0); // rotate by rotAngle about y-axis
glRotated(rotAngle1, 1, 0, 0); // rotate by rotAngle about yaxis
// Gambar grid
Grid();
// Gambar objek
Mobil();
glPopMatrix();
glFlush();
glutSwapBuffers();
}
void pressKey(int key, int x, int y) {
// Fungsi ini akan dijalankan saat tombol keyboard ditekan dan belum dilepas
// Selama tombol ditekan, variabel angle dan move diubah => kamera bergerak
switch (key) {
case GLUT_KEY_UP : deltaMove = 1;break;
case GLUT_KEY_DOWN : deltaMove = -1;break;
}
}
void releaseKey(int key, int x, int y) {
// Fungsi ini akan dijalankan saat tekanan tombol keyboard dilepas
// Saat tombol dilepas, variabel angle dan move diset nol => kamera berhenti
switch (key) {
case GLUT_KEY_UP : if (deltaMove > 0)
deltaMove = 0;
break;
case GLUT_KEY_DOWN : if (deltaMove < 0)
deltaMove = 0;
break;
}
}
// Variable untuk pencahayaan
const GLfloat light_ambient[] = { 0.5f, 0.5f, 0.5f, 0.0f };
const GLfloat light_diffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_position[] = { 0.0f, 20.0f, 10.0f, 1.0f };
const GLfloat mat_ambient[] = { 0.7f, 0.7f, 0.7f, 1.0f };
const GLfloat mat_diffuse[] = { 0.8f, 0.8f, 0.8f, 1.0f };
const GLfloat mat_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat high_shininess[] = { 100.0f };
void lighting(){
// Fungsi mengaktifkan pencahayaan
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
glEnable(GL_LIGHT0);
glEnable(GL_NORMALIZE);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_LIGHTING);
glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
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, high_shininess);
}
void init(void)
{
glEnable (GL_DEPTH_TEST);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
}
int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowPosition(100,100);
glutInitWindowSize(640,480);
glutCreateWindow("3D Lighting");
glutSpecialFunc(pressKey);
glutSpecialUpFunc(releaseKey);
glutDisplayFunc(display);
glutKeyboardFunc(keyboard);
glutIdleFunc(display); // Fungsi display-nya dipanggil terusmenerus
glutReshapeFunc(Reshape);

lighting();
init();
glClearColor(1.0f,1.0f,1.0f,1.0f);
glutMainLoop();
return(0);
}

Pada program mobil 3D ini, digunakan objek quads untuk membentuk bady mobil,
dan menggunakan objek lingkaran untuk membentuk sebuah roda. Apabila program diatas di
tampilkan pada layar, maka hanya akan tampak sebuah body mobil dan 1 buah roda. Untuk
membuat 3 roda lainnya, hanya perlu menggunakan algoritma roda pertama dan
ditranslasikan sesuai dengan posisinya.
Kamera pada program diatas menggunakan 6 tombol pada keyboard yaitu 'up' untuk
memajukan kamera, 'down' untuk memundurkan kamera, 'a' untuk merotasi kamera kekiri, 'd'
untuk merotasi kamera ke kanan, 'w' untuk merotasi kamera ke atas, dan 's' untuk merotasi
kamera ke bawah.

Gambar di atas mobil 3D yang dibuat menggunakan coding di atas. Hanya di tambah
beberapa objek 3D agar mobil terlihat lebih realistis.

Anda mungkin juga menyukai