LAPORAN MODUL V
PRAKTIKUM GRAFIKA KOMPUTER
"OBJEK 3D"
Disusun untuk Memenuhi Matakuliah Praktikum Grafika Komputer
Yang Dibimbing oleh Bapak Heru Wahyu Herwanto
Disusun Oleh :
Ananda Putri Syaviri
130533608243
PTI Off B 2013
UNIVERSITAS NEGERI MALANG
FAKULTAS TEKNIK
JURUSAN TEKNIK ELEKTRO
PRODI PENDIDIKAN TEKNIK INFORMATIKA
APRIL 2015
Modul 5
"Object 3D"
A. Kompetensi Dasar
Memahami Inisialisasi dunia 3D.
Memahami Object 3D (Wired).
Memahami dasar menampilkan susunan objek 3D.
B. Latihan
1. Buatlah sebuah fungsi yang dapat membuat persegi. tampilkan objek
persegi tersebut pada layar dan berikan interaksi menggunakan
keyboard untuk memindahkan posisi objek pada KOORDINAT Z (panah bawah
untuk mendekat dan panah atas untukmenjauh). Tampilkan 2 screen shot
kondisi ketika objek 2D jauh dan dekat. Dan tampilkan programnya
(display function). Beri keterangan.
Sintaks:
#include
#include
float x=0, y=0, z=-10;
int w = 500, h = 500;
void drawQuad(int a, int b){
glColor3f(0,0,1);
glBegin(GL_QUADS);
glVertex2d(3, -3);
glVertex2d(-3, -3);
glVertex2d(-3, 3);
glVertex2d(3, 3);
glEnd();
}
void update(int value){
glutPostRedisplay();
glutTimerFunc(50, update, 0);
}
void render(void)
{
glClear(GL_COLOR_BUFFER_BIT " GL_DEPTH_BUFFER_BIT);
glClearColor(0,0,0,0);
glLoadIdentity();
glTranslatef(x,y,z);
drawQuad(1,1);
glutSwapBuffers();
}
void reshape (int w, int h)
{
glViewport (0, 0, (GLsizei)w, (GLsizei)h);
glLoadIdentity();
gluPerspective (45, (GLfloat)w / (GLfloat)h, 1.0, 300.0);
glMatrixMode (GL_MODELVIEW);
}
void init()
{
glClearColor (0.0f, 0.0f, 0.0f, 0.5f);
glEnable (GL_DEPTH_TEST);
glMatrixMode (GL_PROJECTION);
glDepthFunc (GL_LEQUAL);
glHint (GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
return;
}
void mySpecialKeyboard(int key, int x, int y){
switch(key){
case GLUT_KEY_UP:
z+=1;
break;
case GLUT_KEY_DOWN:
z-=1;
break;
}
}
void main(int argc, char **argv) {
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_DOUBLE " GLUT_RGBA " GLUT_DEPTH);
glutInitWindowPosition(100,100);
glutInitWindowSize(w,h);
glutCreateWindow("OBJEK 3D SYAVIRI");
glutTimerFunc(50, update, 0);
glutSpecialFunc(mySpecialKeyboard);
init();
glutDisplayFunc(render);
glutReshapeFunc (reshape);
gluOrtho2D(-w/2,w/2,-h/2,h/2);
glutMainLoop();
}
Hasil
Penjelasan
Program diatas menggunakan fungsi myspecialKeyboard yang digunakan untuk
mengubah bentuk dari objek yang dibangun pada program ini. Menggunakan
tombol navigasi key up dan key down, key up untuk meresize ukuran objek
menjadi lebih besar, sedangkan key down , merubah objke menjadi lebih
kecil. Fungsi untuk mendeklarasikan agar objke yang dibangun dapat bergerak
3D adalah fungsi init dan reshape , yang nantinya pengaplikasiannya akan
dipanggil pada fungsi utama, sehingga ketika program dijalankan , objek
dapat bergerak.
2. Buatlah sebuah program yang dapat menganimasikan objek
persegitersebut menggunakan tombol ("panah kiri" = rotasi berlawanan
arah jarum jam pada sumbu x, "panah kanan" = rotasi searah jarum jam
pada sumbu x, "panah atas" = rotasi searah jarum jam pada sumbu y,
"panah bawah" = rotasi berlawanan arah jarum jam pada sumbu y).
Sajikan screenshot hasil interaksi yang menunjukkan animasi rotasi-
rotasi tersebut dan tulis program pada fungsi display. Beri
keterangan.
Sintaks:
#include
#include
int w = 480;
int h = 480;
int tz ;
int x ;
int y ;
int z ;
float sudut;
void segiEmpat()
{
glBegin(GL_QUADS);
glVertex2d(0.5, -0.5);
glVertex2d(-0.5, -0.5);
glVertex2d(-0.5, 0.5);
glVertex2d(0.5, 0.5);
glEnd();
}
void renderScene(void)
{
glClear(GL_COLOR_BUFFER_BIT " GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glColor3f(0., 0., 1.);
glTranslatef(0,0,tz);
glRotatef(sudut,x,y,z);
segiEmpat();
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 mySpecialKeyboard (int key, int x, int y)
{
switch (key)
{
case GLUT_KEY_UP ://deteksi tombol panah atas
tz += 3;
break;
case GLUT_KEY_DOWN ://deteksi tombol panah atas
tz -= 3;
break;
}
}
void myKeyboard(unsigned char key, int a, int b)
{
if (key == 'x' )
{
sudut += 20;
x = 1;
y =0;
z =0;
}
else if (key == 'y' )
{
sudut += 20;
x = 0;
y =1;
z =0;
}
else if (key == 'z' )
{
sudut += 20;
x = 0;
y =0;
z =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(500,500);
glutCreateWindow("OBJEK 3D SYAVIRI");
glutReshapeFunc(resize);
init();
gluOrtho2D(-250.0, 250.0, -250, 250.0);
glutDisplayFunc(renderScene);
glutKeyboardFunc(myKeyboard);
glutSpecialFunc(mySpecialKeyboard);
glutTimerFunc(50,update,0);
glutMainLoop();
}
Hasil:
Penjelasan
Program diatas hampir sama seperti program sebelumnya, hanya saja ,
pergerakan objke terlihat lebih dinamis, dapat berotasi dan bertranslasi
pada sumbu x, y. Menggunakan specialkeyboard up, down, right, dan left akan
menggerakkan objek berdasarkan sumbu x dan y. Searah dan berlawa nan
jarumnya. Untuk pergerakannya 20 derajat tiap kali tombol keyboard x/y/z
ditekan.
3. Latihan 3 - Buatlah sebuah program dengan menggunakan fungsi WireCube
dimana tampilan wirecube dapat diputar (sumbu putar x, y, z)
menggunakan tombol keyboard 'a' = rotasi berlawanan arah jarum jam
pada sumbu x, 'd' = rotasi searah jarum jam pada sumbu x, 'w' =
rotasi searah jarum jam pada sumbu y, 's' = rotasi berlawanan arah
jarum jam pada sumbu y, 'e' = rotasi searah jarum jam pada sumbu z,
'q' = rotasi berlawanan arah jarum jam pada sumbu z.
Sintaks:
#include
#include
int w=400, h=400, z=-50;
int x1=0, y1=0, sudut=0, z1=0;
void renderScene(void){
glClear(GL_COLOR_BUFFER_BIT " GL_DEPTH_BUFFER_BIT);
glClearColor(1,1,1,1);
glLoadIdentity();
glTranslatef(0,0,z);
glRotatef(sudut,x1,y1,z1);
glColor3f(0,0,1);
glutWireCube(4);
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 myKeyboard(unsigned char key, int x, int y){
if (key == 'x') {
x1=1;
y1=0;
z1=0;
sudut+=5;
}
else if (key == 'y') {
y1=1;
x1=0;
z1=0;
sudut+=-5;
}
else if (key == 'z') {
y1=0;
x1=0;
z1=z;
sudut+=5;
}
}
void mySpecialKeyboard(int key, int x, int y){
switch(key){
case GLUT_KEY_UP : z-=5;
break;
case GLUT_KEY_DOWN : z+=5;
break;
}
}
void init(){
glClearColor(0,0,0,1);
glEnable(GL_DEPTH_TEST);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0,(GLdouble) w/(GLdouble) h, 1.0,300.0);
glMatrixMode(GL_MODELVIEW);
}
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("OBJEK 3D SYAVIRI");
gluOrtho2D(-w/2,w/2,-h/2,h/2);
glutDisplayFunc(renderScene);
glutReshapeFunc(resize);
glutKeyboardFunc(myKeyboard);
glutSpecialFunc(mySpecialKeyboard);
glutTimerFunc(1,timer,0);
init();
glutMainLoop();
}
Hasil
Penjelasan
Pada program diatas tidak menggunakan fungsi drawQuads, seperti program-
program sbeelumnya, tetapi menggunakan fungsi WireCube untuk membuat sebuah
kerangka kubus 3D, sehingga tidak ada pendeklarasian penggunaan glvertex
untuk membentuk sebuah objek. Menggunakan fungsi mykeyboard untuk
memberikan pergerakan pada objek yang bergerak terhadap sumbu x, y dan z
searah maupun berlawanan dengan arah jarum jam. Menggunakan fungsi
myspecialKeyboard juga untuk pergerakan objke , key up dan key down.
4. Buatlah sebuah program dengan menggunakan fungsi WireSphere, dimana
wire sphere dapat diputar pada sumbu z (searah dan berlawanan dengan
jarum jam) dengan keyboard(gunakan special key), ukuran wirespehre
dapat diperbesar dengan tombol panah atas, dan untuk memperkecil
dengan tombol panah bawah, dan radius wiresphere dapat diperbesar
dengan tombol panah kanan, dan untuk memperkecil menggunakan panah
kiri.
Sintaks:
#include
#include
int w=400, h=400, z=-50;
int x1=0, y1=0, sudut=0, z1=0;
void renderScene(void){
glClear(GL_COLOR_BUFFER_BIT " GL_DEPTH_BUFFER_BIT);
glClearColor(1,1,1,1);
glLoadIdentity();
glTranslatef(0,0,z);
glRotatef(sudut,x1,y1,z1);
glColor3f(0,0,1);
// glutWireCube(4);
glutWireSphere(50,50,50);
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 myKeyboard(unsigned char key, int x, int y){
if (key == 'x') {
x1=1;
y1=0;
z1=0;
sudut+=5;
}
else if (key == 'y') {
y1=1;
x1=0;
z1=0;
sudut+=-5;
}
else if (key == 'z') {
y1=0;
x1=0;
z1=z;
sudut+=5;
}
}
void mySpecialKeyboard(int key, int x, int y){
switch(key){
case GLUT_KEY_UP : z-=5;
break;
case GLUT_KEY_DOWN : z+=5;
break;
}
}
void init(){
glClearColor(0,0,0,1);
glEnable(GL_DEPTH_TEST);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0,(GLdouble) w/(GLdouble) h, 1.0,300.0);
glMatrixMode(GL_MODELVIEW);
}
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("OBJEK 3D SYAVIRI");
gluOrtho2D(-w/2,w/2,-h/2,h/2);
glutDisplayFunc(renderScene);
glutReshapeFunc(resize);
glutKeyboardFunc(myKeyboard);
glutSpecialFunc(mySpecialKeyboard);
glutTimerFunc(1,timer,0);
init();
glutMainLoop();
}
Hasil
Penjelasan
Sama seperti program sebelumnya, tidak menggunakan fungsi drawQuad,
melainkan menggunakan fungsi wireSphere yang merupakan kerangka 3D objek
bola. Untuk membangun garis garis pada bola, menggunakan parameter pada
fungsi wireSphere itu sendiri. Banyak- sedikitnya atau besar kecilnya objke
tergantung pada parameter yang digunakan.
5. Latihan 5 - Buatlah sebuah program dengan menggunakan fungsi WireCone
interaksi mengubah tinggi (panah atas, panah bawah) , alas (panah
kanan, panah kiri), potongan(a,d).
Sintaks :
#include
#include
int w = 480;
int h = 480;
int z = -150;
int sudut = 45;
int sumbux, sumbuy, sumbuz;
void wirecone (void){
glColor3f(0,0,1);
glLineWidth(2);
glutWireCone(40., 80, 40,20);
}
void renderScene(){
glClearColor(1,1,1,1);
glClear(GL_COLOR_BUFFER_BIT " GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(0,0,z);
glRotatef(sudut,sumbux,sumbuy,sumbuz);
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, 1300.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void init(){
glClearColor(0,0,0,1);
glEnable(GL_DEPTH_TEST);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0, (float) w/(float) h, 1.0, 1300.0);
glMatrixMode(GL_MODELVIEW);
}
void myKeyboard(unsigned char key, int x, int y){
if (key == 'a') z+=2;
else if (key == 's') z-=2;
else if (key == 'x') {sudut +=2; sumbux = 1; sumbuy = 0; sumbuz = 0;}
else if (key == 'y') {sudut +=2; sumbux = 0; sumbuy = 1; sumbuz = 0;}
else if (key == 'z') {sudut +=2; sumbux = 0; sumbuy = 0; sumbuz = 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(480,480);
glutCreateWindow("OBJEK 3D SYAVIRI");
gluOrtho2D(-320.,320.,-320.,320.);
glutTimerFunc(50, update, 0);
glutDisplayFunc(renderScene);
glutKeyboardFunc(myKeyboard);
glutReshapeFunc(resize);
init();
glutMainLoop();
}
Hasil:
Penjelasan
Program diatas menggunakan fungsi wirecone yang membentuk kerangka objek 3D
kerucut. Parameter wirecone menunjukkan alas, tinggi, slice, sedangkan
parameter terakhir langsung di inputkan tanpa deklarasi variabel. Untuk
animasi 3D pada program ini , sama seperti program- program sebelumnya,
scalef, translate, rotatef. Untuk scalef maka kerucut diatas akan semakin
mengecil/membesar tergantung keyboard yang digunakan, sesuai pendeklarasian
pada script. Untuk pendeklarasian pergerakan objke dideklarasikan pada
fungsi myKeyboard, jika menggunakan keyboard tertentu sesuai yang
dirumuskan, maka akan mengubah objek.
6. Buatlah sebuah program dengan menggunakan fungsi WireTorus, dengan
interaksi mengubah diameter dalam (panah atas, panah bawah) ,
diameter luar (panah kanan, panah kiri), dan jumlah ring(q,e).
Tampilkan screenshotnya dan beri keterangan.
Sintaks :
#include
#include
float x=0, y=0, z=-10;
int w = 320, h = 320, i, j, k, l;
int dlm = 2, lr=4, sisi=50, cincin=50;
void objek(void){
glColor3f(0,0,1);
glutWireTorus(1, 3, 50, 50);
}
void update(int value){
glutPostRedisplay();
glutTimerFunc(100, update, 0);
}
void myDisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT " GL_DEPTH_BUFFER_BIT);
glClearColor(1,1,1,1);
glLoadIdentity();
glTranslatef(x,y,z);
glRotatef(i,j,k,0);
objek();
glutSwapBuffers();
}
void reshape (int w, int h)
{
glViewport (0, 0, (GLsizei)w, (GLsizei)h);
glMatrixMode (GL_PROJECTION);
glLoadIdentity();
gluPerspective (60, (GLfloat)w / (GLfloat)h, 1.0, 100.0);
glMatrixMode (GL_MODELVIEW);
}
void init()
{
glShadeModel (GL_SMOOTH);
glClearColor (0.0f, 0.0f, 0.0f, 0.5f);
glClearDepth (1.0f);
glEnable (GL_DEPTH_TEST);
glDepthFunc (GL_LEQUAL);
glHint (GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
return;
}
void myKeyboard(unsigned char key, int x, int y)
{
if(key == 'a')
{
i+=10; j=1; k=0;
}
else if(key == 'b')
{
i+=10; j=0; k=1;
}
else if(key == 'c')
{
i+=10; j=1; k=1;
}
}
void mySpecialKeyboard(int key, int x, int y){
switch(key){
case GLUT_KEY_UP:
dlm+=1;
break;
case GLUT_KEY_DOWN:
dlm-=1;
break;
case GLUT_KEY_LEFT:
lr-=1;
break;
case GLUT_KEY_RIGHT:
lr-=-1;
break;
}
}
void main(int argc, char **argv) {
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_DOUBLE " GLUT_RGBA " GLUT_DEPTH);
glutInitWindowPosition(100,100);
glutInitWindowSize(w,h);
glutCreateWindow("OBJEK 3D SYAVIRI");
glutTimerFunc(50, update, 0);
glutKeyboardFunc(myKeyboard);
init();
glutDisplayFunc(myDisplay);
glutReshapeFunc (reshape);
gluOrtho2D(-w/2,w/2,-h/2,h/2);
glutMainLoop();
}
Hasil
Penjelasan
Program diatas menggunakan fungsi wire torus yang membentuk kerangka donat.
Parameter dari wire torus menunjukkan diamater dalam, diameter luar, dan
cincin untuk jumlah ring. Menggunakan fungsi mykeyboard dan specialKeuboard
untuk peregrakan objek. Untuk penggunaan parameter perlu diperhatika
karena semakin sedikit ring maka bentuk tidak akan terlihat bulat/ menjadi
bulat dan semakin kecil diameter dalamnya maka bentuknya tidak akan
terlihat jelas.
7. Buatlah sebuah program dengan menggunakan fungsi WireTeapot, dengan
interaksi rotasi pada 3 sumbu (searah dan berlawanan dengan arah
jarum jam) dan mengubah ukurannya dengan tombol panah atas dan panah
bawah.
Sintaks :
#include
#include
#include
float w=480, h=480;
float n=-10;
int sumbu=30;
int xx=0, yy=0, zz=0, s=2;
void display()
{
glClear(GL_COLOR_BUFFER_BIT " GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(0,0,n);
glRotatef(sumbu, xx,yy,zz);
glColor3f(0,0,1);
glutWireTeapot(s);
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(1.0,1.0,1.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')
{
sumbu+=10;
xx=1;
yy=0;
zz=0;
}
else if(key=='y')
{
sumbu+=10;
xx=0;
yy=1;
zz=0;
}
else if(key=='z')
{
sumbu+=10;
xx=0;
yy=0;
zz=1;
}
}
void Spesial(int key, int x, int y)
{
switch(key)
{
case GLUT_KEY_UP:
s++;
break;
case GLUT_KEY_DOWN:
s--;
break;
}
}
void timer(int value)
{
glutPostRedisplay();
glutTimerFunc(500,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("OBJEK 3D SYAVIRI");
gluOrtho2D(-w/2,w/2,-h/2,h/2);
glutDisplayFunc(display);
glutReshapeFunc(resize);
init();
glutTimerFunc(50,timer,0);
glutKeyboardFunc(myKeyboard);
glutSpecialFunc(Spesial);
glutMainLoop();
}
Hasil
Penjelasan
Program diatas menggunakan fungsi WireTeapot yang membentuk kerangka teko.
Untuk pergerakan objek menggunakan fungsi myKeyboard dan special, sehingga
objek akan berotasi, bertranslasi atau membesar/mengecil sesuai tombol yang
ditekan. Pergerakannya mengarah pada sumbu x dan y, kemudian arah putaran
searah dan berlawanan arah jarum jam.
C. Tugas Asistensi
1. Buatlah Fungsi untuk membuat balok 3D, dengan parameter input
fungsinya berupa panjang, lebar, dan tinggi yang dapat di ubah.
Sajikan source code dan screenshotnya.
Sintaks :
#include
#include
int w=640, h=640, z=-30;
int x1=0, y1=0, sudut=0, z1=0, skalaX=0, skalaY=0;
void balok (int a, int panjang, int lebar, int tinggi){
glPushMatrix();
glColor3f(0,1,0); //hijau
glScalef(panjang,tinggi,lebar);
glutWireCube(a);
glPopMatrix();
}
void renderScene(void){
glClear(GL_COLOR_BUFFER_BIT " GL_DEPTH_BUFFER_BIT);
glClearColor(1,1,1,1);
glLoadIdentity();
glTranslatef(0,0,z);
glRotatef(sudut,x1,y1,z1);
balok(3,4,3,3);
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 myKeyboard(unsigned char key, int x, int y){
if (key =='q') z-=3; //zoom out
else if (key == 'a') z+=3; //zoom in
else if (key == 'z') { //counter clockwise
x1=0;
y1=0;
z1=1;
sudut+=30;
}
else if (key == 'w') {//clockwise
y1=0;
x1=0;
z1=1;
sudut-=30;
}
}
void mySpecialKeyboard(int key, int x, int y){
switch(key){
case GLUT_KEY_UP:
x1=1;
y1=0;
z1=0;
sudut-=30;
break;
case GLUT_KEY_DOWN:
x1=1;
y1=0;
z1=0;
sudut+=30;
break;
case GLUT_KEY_RIGHT:
x1=0;
y1=1;
z1=0;
sudut+=30;
break;
case GLUT_KEY_LEFT:
x1=0;
y1=1;
z1=0;
sudut-=30;
break;
}
}
void init(){
glClearColor(0,0,0,1);
glEnable(GL_DEPTH_TEST);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0,(GLdouble) w/(GLdouble) h, 1.0,300.0);
glMatrixMode(GL_MODELVIEW);
}
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(320,240);
glutInitWindowSize(w,h);
glutCreateWindow("ASISTENSI 1 SYAVIRI");
gluOrtho2D(-w/2,w/2,-h/2,h/2);
glutDisplayFunc(renderScene);
glutReshapeFunc(resize);
glutKeyboardFunc(myKeyboard);
glutSpecialFunc(mySpecialKeyboard);
glutTimerFunc(1,timer,0);
init();
glutMainLoop();
}
Hasil
Penjelasan
Untuk membuat program diatas, pendeklarasian pembentukan objek dan
penggunaan animasi dideklarasikan pada fungsi renderScene. Program diatas
menggunakan fungsi balok dengan parameter panjang lebar tinggi dan
ketebalan garis. Terdapat pendeklarasian fungsi translate dan rotatef.
2. Buatlah Danbo 3 dimensi dengan interaksi memutar di 3 sumbu(searah
dan berlawanan dengan arah jarum jam). Sajikan source code dan
screenshotnya.
Sintaks:
#include
#include
#include
#include
int a=640, b=320, c=-30;
int a1=0, b1=0, sud=0, c1=0;
void myKeyboard(unsigned char key, int x, int y) {
if (key =='a') c+=3;
else if (key == 'b') c-=3;
else if (key == 'c') {
a1=0;b1=0;c1=1;
sud+=15;
}
else if (key == 'd') {
a1=1;b1=0;c1=0;
sud+=15;
}
else if (key == 'e') {
a1=1;b1=1;c1=0;
sud+=15;
}
}
void init() {
glClearColor(1,1,1,1);
glEnable(GL_DEPTH_TEST);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(30., (GLdouble)a/(GLdouble)b, 1., 300.);
glMatrixMode(GL_MODELVIEW);
}
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 Balok(double p, double l, double t) {
glScalef(p, t, l);
glutSolidCube(1);
}
void renderScene(void) {
glClear(GL_COLOR_BUFFER_BIT " GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glClearColor(0,0,1,0); //biru
glTranslatef(0, 0, c);
glRotatef(sud, a1, b1, c1);
glPushMatrix(); //badan
glColor3f(1, 0, 1);
Balok(10, 6, 9);
glPopMatrix();
glPushMatrix(); //kepala
glTranslatef(0, 9.5, 0);
glColor3f(0, 0.5, 1);
Balok(15, 8, 10);
glPopMatrix();
glPushMatrix(); //mata kiri
glTranslatef(-2.2, 9.6, 4.1);
glRotatef(90, 0, 1, 0);
glColor3f(0, 0, 0);
glutSolidSphere(1, 2, 30);
glPopMatrix();
glPushMatrix(); //mata kanan
glTranslatef(2.2, 9.6, 4.1);
glRotatef(90, 0, 1, 0);
glColor3f(0, 0, 0);
glutSolidSphere(1, 2, 30);
glPopMatrix();
glPushMatrix(); //hidung
glTranslatef(0, 6.5, 4.1);
glRotatef(90, 0, 1, 0);
glRotatef(-90, 1, 0, 0);
glColor3f(0, 0, 0);
glutSolidCone(1.5, 2, 2, 2);
glPopMatrix();
glPushMatrix(); //tangan kiri
glTranslatef(-6.5, -0.5, 2.5);
glRotatef(-45, 1, 0, 0);
glColor3f(0, 0.5, 1);
Balok(4, 4, 10);
glPopMatrix();
glPushMatrix(); //tangan kanan
glTranslatef(6.5, -0.5, -2.5);
glRotatef(45, 1, 0, 0);
glColor3f(0, 0.5, 1);
Balok(4, 4, 10);
glPopMatrix();
glPushMatrix(); //kaki kiri
glTranslatef(-2, -4, -0.5);
glRotatef(10, 1, 0, 0);
glColor3f(0, 0.5, 1);
Balok(4, 4, 8);
glPopMatrix();
glPushMatrix(); //kaki kiri
glTranslatef(2, -4, 0.5);
glRotatef(-10, 1, 0, 0);
glColor3f(0, 0.5, 1);
Balok(4, 4, 8);
glPopMatrix();
glutSwapBuffers();
}
void timer(int value) {
glutPostRedisplay();
glutTimerFunc(50,timer,0);
}
void main(int argc, char **argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DEPTH " GLUT_DOUBLE " GLUT_RGBA);
glutInitWindowPosition(320,240);
glutInitWindowSize(a,b);
glutCreateWindow("ASISTENSI 2 SYAVIRI");
gluOrtho2D(-a/2, a/2, -b/2, b/2);
glutDisplayFunc(renderScene);
glutTimerFunc(50, timer, 0);
glutKeyboardFunc(myKeyboard);
glutReshapeFunc(resize);
init();
glutMainLoop();
}
- Hasil
Penjelasan
Program diatas menggunakan fungsi balok yang didalamnya terdapat
pendeklarasian penggunakan scalef dan solidcube yang didalamnya menggunakan
parameter 1, yang dimaksudkan, nilai parameter pada setiap balok akan
berbeda kesolidannya tergantung dari parameter yang membangun balok itu
sendiri. Untuk membuat setiap anggota tubuh, menggunakan fungsi balok
dengan parameter berbeda sesuai keinginan dan kebutuhan dari bentuk objek
agar terlihat baik.
D. Kesimpulan
- Objek 3D merupakan perputaran dari 3 sumbu.
- Fungsi wire Cube digunakan untuk membuat kerangka balok secara
otomatis. Fungsi wiresphere untuk membuat kerangka bola. Fungsi wire
teapot untuk membuat kerangka teko. Fungsi wire torus untuk membuat
kerangka donat. Fungsi wire cone utnuk membuat kerangka kerucut.
- Gunakan fungsi glutSolid untuk dapat membuat objek menjadi berisi atau
membuat objek dengan full.
- Untuk pergerakan objek menggunakan fungsi rotate, dapat diatur jika
ingin membuat objek berputar searah atau berlawanan jarum jam. Untuk
putaran searah jarum jam maka maka deklarasikan sudutnya dengan
menggunakan operator (+) atau increment, sedangkan jika ingin
berlawanan maka menggunakan operator (-) atau decrement.
- Untuk dapat memudahkan dalam penulisan parameter, maka dapat
menggunakan pedneklarasian variable, sehingga tidak perlu menuliskan
secara berulang, cukup menuliskan variable yang digunakan, maka
nantinya program akan memanggil nilai dari variable tersebut.
E. Daftar Pustaka
Modul V praktikum Grafika Komputer, Jurusan Teknik Elektro, Fakultas
Teknik,Universitas Negri Malang.