GRAFIKA KOMPUTER
LIGHTING DAN MATERIAL
Disusun oleh :
B. TUGAS ASISTENSI
1. Buatlah program yang menampilkan sebuah rumah dengan atap yang berbeda warna
dengan temboknya dan dikelilingi oleh pagar.
Nama Program : Rumah 3D
Compiler : Microsoft Visual C++ 2008 Express Edition
Source Code :
#include <glut.h>
glShadeModel(GL_SMOOTH);
glClearColor(0.0f,0.0f,0.0f,0.5f);
glClearDepth(1.0f);
glEnable(GL_DEPTH_TEST);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
glPushMatrix();
glColor3f(0.5f, 1.0f, 1.0f);
glTranslatef(-1,0.5,0);
glScalef(5.4,0.2,0.1);
glutSolidCube(1);
glPopMatrix();
glPushMatrix();
glColor3f(2.0f, 0.5f, 1.0f);
glTranslatef(-1,-0.2,0);
glScalef(5.4,0.8,0.1);
glutSolidCube(1);
glPopMatrix();
glPushMatrix();
glScalef(0.5,1.5,1);
glTranslatef(3,0,0);
glColor3f(0.0f, 0.5f, 0.5f);
glutSolidCube(1);
glPopMatrix();
glDisable(GL_COLOR_MATERIAL);
glPopMatrix();
}
void renderScene(void){
GLfloat LightPosition[] = {10.0f, 10.0f, 20.0f, 0.0f};
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glClearColor(0, 0, 0, 0);
LightPosition[0] = cx;
LightPosition[1] = cy;
LightPosition[1] = cy;
glPushMatrix(); //tembok
glEnable(GL_COLOR_MATERIAL);
glColor3f(1, 1, 0.8);
glRotatef(50,0,1,0);
glutSolidCube(3);
glDisable(GL_COLOR_MATERIAL);
glPushMatrix(); //pagar
glRotatef(-180, 0, 1, 0);
glTranslatef(-2,0,1.5);
pagar();
glPopMatrix();
glPushMatrix();
glRotatef(-90,0,1,0);
glTranslatef(-2,0,-3.5);
pagar();
glPopMatrix();
glPushMatrix();
glTranslatef(-2,0,-3.5);
pagar();
glPopMatrix();
glPushMatrix();
glRotatef(-90,0,1,0);
glTranslatef(-2,0,1.5);
pagar();
glPopMatrix();
glPushMatrix(); //pintu
glEnable(GL_COLOR_MATERIAL);
glColor3f(0.0f, 0.5f, 1.0f);
glTranslatef(-0.6,-1,1.46);
glScalef(7,10,1);
glutSolidCube(0.1);
glDisable(GL_COLOR_MATERIAL);
glPopMatrix();
glPushMatrix(); //jendela
glEnable(GL_COLOR_MATERIAL);
glColor3f(0.0f, 0.5f, 1.0f);
glTranslatef(0.5,0.1,1.46);
glScalef(3,3,1);
glutSolidCube(0.1);
glDisable(GL_COLOR_MATERIAL);
glPopMatrix();
glPushMatrix();
glEnable(GL_COLOR_MATERIAL);
glColor3f(0.0f, 0.5f, 1.0f);
glTranslatef(0.9,0.1,1.46);
glScalef(3,3,1);
glutSolidCube(0.1);
glDisable(GL_COLOR_MATERIAL);
glPopMatrix();
glPushMatrix();
glEnable(GL_COLOR_MATERIAL);
glColor3f(0.0f, 0.5f, 1.0f);
glTranslatef(0.9,-0.3,1.46);
glScalef(3,3,1);
glutSolidCube(0.1);
glDisable(GL_COLOR_MATERIAL);
glPopMatrix();
glPushMatrix();
glEnable(GL_COLOR_MATERIAL);
glColor3f(0.0f, 0.5f, 1.0f);
glTranslatef(0.5,-0.3,1.46);
glScalef(3,3,1);
glutSolidCube(0.1);
glDisable(GL_COLOR_MATERIAL);
glPopMatrix();
glPopMatrix();
glPushMatrix(); //atap
glEnable(GL_COLOR_MATERIAL);
glColor3f(0.8,0,0);
glRotatef(5,0,1,0);
glTranslatef(0,1.5,0);
glScalef(3,1.3,3);
glutSolidOctahedron();
glDisable(GL_COLOR_MATERIAL);
glPopMatrix();
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 timer(int value){
glutPostRedisplay();
glutTimerFunc(50,timer,0);
}
void main (int argc, char **argv){
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH | GLUT_RGBA);
glutInitWindowPosition(100,100);
glutInitWindowSize(w,h);
glutCreateWindow("Xaphyra Aura Shava : Rumah 3D");
gluOrtho2D(-w/2,w/2,-h/2,h/2);
glutDisplayFunc(renderScene);
glutReshapeFunc(resize);
glutKeyboardFunc(myKeyboard);
glutMouseFunc(mouse);
glutMotionFunc(motion);
glutTimerFunc(1,timer,0);
init();
glutMainLoop();
}
Output :
TAMPAK DEPAN
TAMPAK BELAKANG
Penjelasan :
Pada program ini menggunakan fungsi kubus solid dengan glutSolidCube (GLdouble
size); untuk membuat kerangka kubus yang sudah disediakan oleh glut. Dan juga
menggunakan fungsi glutSolidOctahedron(void); yang juga sudah disediakan oleh
glut. Kemudian memanggil fungsi renderScene ditambahkan fungsi posisi
pencahayaan dan juga rotasi yang menggunakan parameter. Dan fungsi init
memanggil fungsi pencahayaan dimana efek pencahayaan bersifat menyeluruh dan
menyebabkan semua obyek memiliki warna serupa. Agar warna tiap obyek 3d
berbeda dengan efek pencahayaan yang aktif. Fungsi di atas dapat diaktifkan setelah
glEnable(GL_COLOR_MATERIAL). Parameter face adalah variabel untuk
menentukan bagaimana material warna obyek 3D ditampilkan, pilihannya antara lain
GL_FRONT Sedangkan parameter mode adalah variabel untuk memilih material
warna jenis apa yang diaktifkan pilihannya pada fungsi init. Terdapat fungsi
myKeyboard digunakan untuk menangkap interaksi dari keyboard. Dan juga terdapat
fungsi mouse untuk menangkap interaksi pada mouse.
2. Dari program nomor 1, ubahlah program sehingga posisi cahaya akan mengikuti posisi
pointer mouse. Sajikan screenshot dari 3 posisi pointer yang berbeda.
Nama Program : Rumah 3D
Compiler : Microsoft Visual C++ 2008 Express Edition
Source Code :
#include <glut.h>
glPushMatrix();
glColor3f(0.5f, 1.0f, 1.0f);
glTranslatef(-1,0.5,0);
glScalef(5.4,0.2,0.1);
glutSolidCube(1);
glPopMatrix();
glPushMatrix();
glColor3f(2.0f, 0.5f, 1.0f);
glTranslatef(-1,-0.2,0);
glScalef(5.4,0.8,0.1);
glutSolidCube(1);
glPopMatrix();
glPushMatrix();
glScalef(0.5,1.5,1);
glTranslatef(3,0,0);
glColor3f(0.0f, 0.5f, 0.5f);
glutSolidCube(1);
glPopMatrix();
glDisable(GL_COLOR_MATERIAL);
glPopMatrix();
}
void renderScene(void){
GLfloat LightPosition[] = {10.0f, 10.0f, 20.0f, 0.0f};
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glClearColor(0, 0, 0, 0);
LightPosition[0] = cx;
LightPosition[1] = cy;
glPushMatrix(); //tembok
glEnable(GL_COLOR_MATERIAL);
glColor3f(1, 1, 0.8);
glRotatef(50,0,1,0);
glutSolidCube(3);
glDisable(GL_COLOR_MATERIAL);
glPushMatrix(); //pagar
glRotatef(-180, 0, 1, 0);
glTranslatef(-2,0,1.5);
pagar();
glPopMatrix();
glPushMatrix();
glRotatef(-90,0,1,0);
glTranslatef(-2,0,-3.5);
pagar();
glPopMatrix();
glPushMatrix();
glTranslatef(-2,0,-3.5);
pagar();
glPopMatrix();
glPushMatrix();
glRotatef(-90,0,1,0);
glTranslatef(-2,0,1.5);
pagar();
glPopMatrix();
glPushMatrix(); //pintu
glEnable(GL_COLOR_MATERIAL);
glColor3f(0.0f, 0.5f, 1.0f);
glTranslatef(-0.6,-1,1.46);
glScalef(7,10,1);
glutSolidCube(0.1);
glDisable(GL_COLOR_MATERIAL);
glPopMatrix();
glPushMatrix(); //jendela
glEnable(GL_COLOR_MATERIAL);
glColor3f(0.0f, 0.5f, 1.0f);
glTranslatef(0.5,0.1,1.46);
glScalef(3,3,1);
glutSolidCube(0.1);
glDisable(GL_COLOR_MATERIAL);
glPopMatrix();
glPushMatrix();
glEnable(GL_COLOR_MATERIAL);
glColor3f(0.0f, 0.5f, 1.0f);
glTranslatef(0.9,0.1,1.46);
glScalef(3,3,1);
glutSolidCube(0.1);
glDisable(GL_COLOR_MATERIAL);
glPopMatrix();
glPushMatrix();
glEnable(GL_COLOR_MATERIAL);
glColor3f(0.0f, 0.5f, 1.0f);
glTranslatef(0.9,-0.3,1.46);
glScalef(3,3,1);
glutSolidCube(0.1);
glDisable(GL_COLOR_MATERIAL);
glPopMatrix();
glPushMatrix();
glEnable(GL_COLOR_MATERIAL);
glColor3f(0.0f, 0.5f, 1.0f);
glTranslatef(0.5,-0.3,1.46);
glScalef(3,3,1);
glutSolidCube(0.1);
glDisable(GL_COLOR_MATERIAL);
glPopMatrix();
glPopMatrix();
glPushMatrix(); //atap
glEnable(GL_COLOR_MATERIAL);
glColor3f(0.8,0,0);
glRotatef(5,0,1,0);
glTranslatef(0,1.5,0);
glScalef(3,1.3,3);
glutSolidOctahedron();
glDisable(GL_COLOR_MATERIAL);
glPopMatrix();
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 timer(int value){
glutPostRedisplay();
glutTimerFunc(50,timer,0);
}
void main (int argc, char **argv){
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH | GLUT_RGBA);
glutInitWindowPosition(100,100);
glutInitWindowSize(w,h);
glutCreateWindow("Xaphyra Aura Shava : Rumah 3D");
gluOrtho2D(-w/2,w/2,-h/2,h/2);
glutDisplayFunc(renderScene);
glutReshapeFunc(resize);
glutKeyboardFunc(myKeyboard);
glutMouseFunc(mouse);
glutMotionFunc(motion);
glutTimerFunc(1,timer,0);
init();
glutMainLoop();
}
Output :
Penjelasan :
Pada program ini menggunakan fungsi kubus solid dengan glutSolidCube (GLdouble
size); untuk membuat kerangka kubus yang sudah disediakan oleh glut. Dan juga
menggunakan fungsi glutSolidOctahedron(void); yang juga sudah disediakan oleh
glut. Kemudian memanggil fungsi renderScene ditambahkan fungsi posisi
pencahayaan dan juga rotasi yang menggunakan parameter. Dan fungsi init
memanggil fungsi pencahayaan dimana efek pencahayaan bersifat menyeluruh dan
menyebabkan semua obyek memiliki warna serupa. Agar warna tiap obyek 3d
berbeda dengan efek pencahayaan yang aktif. Fungsi di atas dapat diaktifkan setelah
glEnable(GL_COLOR_MATERIAL). Parameter face adalah variabel untuk
menentukan bagaimana material warna obyek 3D ditampilkan, pilihannya antara lain
GL_FRONT Sedangkan parameter mode adalah variabel untuk memilih material
warna jenis apa yang diaktifkan pilihannya pada fungsi init. Untuk mengubah posisi
cahaya sehingga mengikuti posisi pointer mouse yaitu dengan
glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); dan mengarahkan mouse pada
bidang, sehingga posisi cahaya berubah. Terdapat fungsi myKeyboard digunakan
untuk menangkap interaksi dari keyboard. Dan juga terdapat fungsi mouse untuk
menangkap interaksi pada mouse.
3. Lengkapi program di atas sehingga rumah dan sekitarnya dapat diputar untuk melihat sisi lain
rumah dan sekitarnya. Sajikan screenshot dari 3 sudut pandang yang berbeda. Tuliskan
program lengkapnya pada fungsi init dan render.
Nama Program : Rumah 3D
Compiler : Microsoft Visual C++ 2008 Express Edition
Source Code :
#include <glut.h>
glPushMatrix();
glColor3f(0.5f, 1.0f, 1.0f);
glTranslatef(-1,0.5,0);
glScalef(5.4,0.2,0.1);
glutSolidCube(1);
glPopMatrix();
glPushMatrix();
glColor3f(2.0f, 0.5f, 1.0f);
glTranslatef(-1,-0.2,0);
glScalef(5.4,0.8,0.1);
glutSolidCube(1);
glPopMatrix();
glPushMatrix();
glScalef(0.5,1.5,1);
glTranslatef(3,0,0);
glColor3f(0.0f, 0.5f, 0.5f);
glutSolidCube(1);
glPopMatrix();
glDisable(GL_COLOR_MATERIAL);
glPopMatrix();
}
void renderScene(void){
GLfloat LightPosition[] = {10.0f, 10.0f, 20.0f, 0.0f};
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glClearColor(0, 0, 0, 0);
LightPosition[0] = cx;
LightPosition[1] = cy;
glPushMatrix(); //tembok
glEnable(GL_COLOR_MATERIAL);
glColor3f(1, 1, 0.8);
glRotatef(50,0,1,0);
glutSolidCube(3);
glDisable(GL_COLOR_MATERIAL);
glPushMatrix(); //pagar
glRotatef(-180, 0, 1, 0);
glTranslatef(-2,0,1.5);
pagar();
glPopMatrix();
glPushMatrix();
glRotatef(-90,0,1,0);
glTranslatef(-2,0,-3.5);
pagar();
glPopMatrix();
glPushMatrix();
glTranslatef(-2,0,-3.5);
pagar();
glPopMatrix();
glPushMatrix();
glRotatef(-90,0,1,0);
glTranslatef(-2,0,1.5);
pagar();
glPopMatrix();
glPushMatrix(); //pintu
glEnable(GL_COLOR_MATERIAL);
glColor3f(0.0f, 0.5f, 1.0f);
glTranslatef(-0.6,-1,1.46);
glScalef(7,10,1);
glutSolidCube(0.1);
glDisable(GL_COLOR_MATERIAL);
glPopMatrix();
glPushMatrix(); //jendela
glEnable(GL_COLOR_MATERIAL);
glColor3f(0.0f, 0.5f, 1.0f);
glTranslatef(0.5,0.1,1.46);
glScalef(3,3,1);
glutSolidCube(0.1);
glDisable(GL_COLOR_MATERIAL);
glPopMatrix();
glPushMatrix();
glEnable(GL_COLOR_MATERIAL);
glColor3f(0.0f, 0.5f, 1.0f);
glTranslatef(0.9,0.1,1.46);
glScalef(3,3,1);
glutSolidCube(0.1);
glDisable(GL_COLOR_MATERIAL);
glPopMatrix();
glPushMatrix();
glEnable(GL_COLOR_MATERIAL);
glColor3f(0.0f, 0.5f, 1.0f);
glTranslatef(0.9,-0.3,1.46);
glScalef(3,3,1);
glutSolidCube(0.1);
glDisable(GL_COLOR_MATERIAL);
glPopMatrix();
glPushMatrix();
glEnable(GL_COLOR_MATERIAL);
glColor3f(0.0f, 0.5f, 1.0f);
glTranslatef(0.5,-0.3,1.46);
glScalef(3,3,1);
glutSolidCube(0.1);
glDisable(GL_COLOR_MATERIAL);
glPopMatrix();
glPopMatrix();
glPushMatrix(); //atap
glEnable(GL_COLOR_MATERIAL);
glColor3f(0.8,0,0);
glRotatef(5,0,1,0);
glTranslatef(0,1.5,0);
glScalef(3,1.3,3);
glutSolidOctahedron();
glDisable(GL_COLOR_MATERIAL);
glPopMatrix();
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 timer(int value){
glutPostRedisplay();
glutTimerFunc(50,timer,0);
}
void main (int argc, char **argv){
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH | GLUT_RGBA);
glutInitWindowPosition(100,100);
glutInitWindowSize(w,h);
glutCreateWindow("Xaphyra Aura Shava : Rumah 3D");
gluOrtho2D(-w/2,w/2,-h/2,h/2);
glutDisplayFunc(renderScene);
glutReshapeFunc(resize);
glutKeyboardFunc(myKeyboard);
glutMouseFunc(mouse);
glutMotionFunc(motion);
glutTimerFunc(1,timer,0);
init();
glutMainLoop();
}
Output :
Penjelasan :
Pada program ini menggunakan fungsi kubus solid dengan glutSolidCube (GLdouble
size); untuk membuat kerangka kubus yang sudah disediakan oleh glut. Dan juga
menggunakan fungsi glutSolidOctahedron(void); yang juga sudah disediakan oleh
glut. Kemudian memanggil fungsi renderScene ditambahkan fungsi posisi
pencahayaan dan juga rotasi yang menggunakan parameter. Dan fungsi init
memanggil fungsi pencahayaan dimana efek pencahayaan bersifat menyeluruh dan
menyebabkan semua obyek memiliki warna serupa. Agar warna tiap obyek 3d
berbeda dengan efek pencahayaan yang aktif. Fungsi di atas dapat diaktifkan setelah
glEnable(GL_COLOR_MATERIAL). Parameter face adalah variabel untuk
menentukan bagaimana material warna obyek 3D ditampilkan, pilihannya antara lain
GL_FRONT Sedangkan parameter mode adalah variabel untuk memilih material
warna jenis apa yang diaktifkan pilihannya pada fungsi init. Untuk mengubah posisi
cahaya sehingga mengikuti posisi pointer mouse yaitu dengan
glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); dan mengarahkan mouse pada
bidang, sehingga posisi cahaya berubah. Terdapat fungsi myKeyboard digunakan
untuk menangkap interaksi dari keyboard. Dan juga terdapat fungsi mouse untuk
menangkap interaksi pada mouse.
C. DAFTAR PUSTAKA
Universitas Negeri Malang, 2016. “Modul 7 (Lighting dan Material)”. Malang: Jurusan
Teknik Elektro FT Universitas Negeri Malang