laporan akhir fp grafkom rubik 31 des 09

46
JURUSAN TEKNIK INFORMATIKA FAKULTAS TEKNOLOGI INFORMASI INSTITUT TEKNOLOGI SEPULUH NOPEMBER SURABAYA LAPORAN AKHIR FINAL PROJECT GRAFIKA KOMPUTER (C) ”RUBIK KUBUS” Hari/ Tgl : Rabu/ 30 Desember 2009

Upload: fadliwdt

Post on 14-Jun-2015

469 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Laporan Akhir Fp Grafkom Rubik 31 Des 09

JURUSAN TEKNIK INFORMATIKAFAKULTAS TEKNOLOGI INFORMASI

INSTITUT TEKNOLOGI SEPULUH NOPEMBERSURABAYA

LAPORAN AKHIRFINAL PROJECT

GRAFIKA KOMPUTER (C)

”RUBIK KUBUS”

Hari/ Tgl : Rabu/ 30 Desember 2009

Oleh : Sabrina Tri Lestari 5106100045Fadli Widyantoro 5106100047Okky Rimbawan 5106100087Irma Arisyami F. 5106100102

Page 2: Laporan Akhir Fp Grafkom Rubik 31 Des 09

Dosen : Anny Yuniarti

Latar Belakang Masalah

Aplikasi final project ini mempunyai tema mengenai pembuatan sebuah aplikasi bebas

berbasiskan permainan dengan menggunakan fungsi-fungsi yang ada pada GLUT dan yang telah

dipelajari pada mata kuliah Grafika Komputer. Selain itu, memainkan “Rubik Kubus” versi

aplikasi/ software akan lebih menarik dan praktis, karena tidak perlu membeli rubik kubus

secara langsung.

Analisis Sistem

Permainan ini bernama “Rubik Kubus”. Aplikasi merupakan versi software dari permainan

rubik kubus yang sering dimainkan sekarang ini. Permainan ini merupakan single player. Rubik

kubus berukuran 3x3 dan memiliki 6 sisi dan warna. Setiap sisi memiliki 9 kubus kecil yang bisa

dipindah letaknya ke sisi lain. Jumlah total kubus kecil yang dapat dipindah adalah 54 kubus

kecil. Project ini mengadopsi rotasi/ perpindahan setiap kubus kecil dari sisi satu ke sisi lainnya.

Dengan mempertimbangkan konsep perpindahan 4 arah (kanan, kiri, atas, dan bawah), maka

orientasi awal pada permainan ini adalah kubus-kubus kecil dapat bergerak sesuai 4 arah

tersebut. Untuk menyelesaikan permainan, player harus menyusun kubus-kubus kecil hingga

rubik tersusun.

Fitur – Fitur

Yang membuat menarik dari project ini adalah selain dapat diputar per selection juga dapat

memutar kamera proyeksi ke rubik kubus, dan pergerakan yang dilakukan halus, serta dapat

melakukan shuffle .

Tools Control yang digunakan untuk menggerakkan rubik diantaranya adalah :

Tab : digunakan untuk berpindah atau mengganti selectionEnter : digunakan untuk memutar bagian kubus tertentu (selection tertentu)Back Space : digunakan untuk berputar kebalikan dari enterTombol ‘S’ pada keyboard : digunakan untuk melakukan shuffle sisi-sisi kubusDrag and Drop Tombol Mouse Kiri : digunakan untuk memutar kubus ke kanan, ke kiri, ke atas atau ke bawah

Sistem Secara Umum

Dalam permainan ini, player bersifat single player. Saat pertama kali memulai permainan,

warna sisi-sisi kubus masih satu warna. Agar warna pada sisi-sisi kubus menjadi teracak, maka

player dapat menekan tombol ‘S’ pada keyboard. Maka kubus-kubus yang ada akan teracak

secara otomatis, dan akan berhenti setelah melakukan 100 kali re-shuffle. Setelah itu, player

Grafika Komputer – Final Project – Rubik Kubus Hal. 2 dari 34 Halaman

Page 3: Laporan Akhir Fp Grafkom Rubik 31 Des 09

dapat memainkan rubik. Untuk mengubah sudut pandang rubik, rubik keseluruhan dapat

diputar dengan menggunakan Mouse (drag and drop tombol kiri mouse), sedangkan untuk

memutar bagian kubus tertentu per selection, digunakan tombol Tab pada keyboard. atau

Untuk memutar selection yang berlawanan arah dengan tombol Enter pada keyboard, tekan

tombol Back Space pada keyboard.

Desain Aplikasi

Desain interface

Gambar 1. Desain Interface Rubik Kubus

Fungsi GLUT yang digunakan diantaranya adalah :

o glViewport : untuk menentukan titik awal dan titik akhir (pixel tampilan)

o glMatrixMode : untuk mengaktifkan mode matrix

o gluPerspective : untuk mengatur perspektif

o glEnable : untuk mengaktifkan mode tertentu

o glClearColor : untuk mengatur warna background

o glLoadIDEntity

o gluLookAt : untuk mengatur posisi kamera

o glPushMatrix : untuk awal perhitungan matrix

o glLineWidth : untuk mengatur tebal garis vektor

o glColor3d : untuk mewarnai sisi kubus

o glScaled : untuk mengatur skala

o glTranslated : untuk mengatur translasi

o glutWireCube : untuk pembentuk rangka kubus selector

o glutSwapBuffers : untuk memperhalus menggunakan buffer

o glutKeyboardFunc : untuk menggunakan tombol keyboard berdasarkan

keyboard key

Grafika Komputer – Final Project – Rubik Kubus Hal. 3 dari 34 Halaman

Page 4: Laporan Akhir Fp Grafkom Rubik 31 Des 09

o glutGet(GLUT_ELAPSED_TIME) : untuk mengatur kecepatan waktu

Implementasi pada Aplikasi

Pada implementasi aplikasi, rubik kubus dibuat melalui garis-garis yang kemudian dibentuk ke dalam kotak-kotak (persegi), yang sisinya telah diwarnai. Selanjutnya, akan dibentuk menjadi kubus.

Pertama, dibentuk sisi kubus bagian bawah yang berwarna merah seperti ditunjukkan pada Gambar 2. Potongan code untuk menghasilkan sisi bawah pembentuk rubik kubus tersebut adalah sebagai berikut :

cube[i].side[0].r=0.8;cube[i].side[0].g=cube[i].side[0].b=0; cube[i].side[0].v[0].x=x-0.5;cube[i].side[0].v[0].y=y-0.5;cube[i].side[0].v[0].z=z-0.5;

cube[i].side[0].v[1].x=x+0.5;cube[i].side[0].v[1].y=y-0.5;cube[i].side[0].v[1].z=z-0.5;

cube[i].side[0].v[2].x=x+0.5;cube[i].side[0].v[2].y=y+0.5;cube[i].side[0].v[2].z=z-0.5;

cube[i].side[0].v[3].x=x-0.5;cube[i].side[0].v[3].y=y+0.5;cube[i].side[0].v[3].z=z-0.5;

Gambar 2. Sisi Bawah Pembentuk Rubik Kubus

Grafika Komputer – Final Project – Rubik Kubus Hal. 4 dari 34 Halaman

Page 5: Laporan Akhir Fp Grafkom Rubik 31 Des 09

Kemudian, dibentuk sisi kubus bagian atas yang berwarna oranye seperti ditunjukkan pada Gambar 3. Potongan code untuk menghasilkan sisi atas pembentuk rubik kubus tersebut adalah sebagai berikut :

cube[i].side[1].r=1;cube[i].side[1].g=0.75;cube[i].side[1].b=0;cube[i].side[1].v[0].x=x-0.5;cube[i].side[1].v[0].y=y-0.5;cube[i].side[1].v[0].z=z+0.5;

cube[i].side[1].v[1].x=x+0.5;cube[i].side[1].v[1].y=y-0.5;cube[i].side[1].v[1].z=z+0.5;

cube[i].side[1].v[2].x=x+0.5;cube[i].side[1].v[2].y=y+0.5;cube[i].side[1].v[2].z=z+0.5;

cube[i].side[1].v[3].x=x-0.5;cube[i].side[1].v[3].y=y+0.5;cube[i].side[1].v[3].z=z+0.5;

Gambar 3. Sisi Atas Pembentuk Rubik Kubus

Lalu, dibentuk sisi kubus bagian kiri yang berwarna abu-abu seperti ditunjukkan pada Gambar 4. Potongan code untuk menghasilkan sisi kiri pembentuk rubik kubus tersebut adalah sebagai berikut :

cube[i].side[2].r=cube[i].side[2].b=cube[i].side[2].g=.9;cube[i].side[2].v[0].x=x-0.5; cube[i].side[2].v[0].y=y-0.5;cube[i].side[2].v[0].z=z-0.5;

cube[i].side[2].v[1].x=x-0.5;cube[i].side[2].v[1].y=y-0.5;

Grafika Komputer – Final Project – Rubik Kubus Hal. 5 dari 34 Halaman

Page 6: Laporan Akhir Fp Grafkom Rubik 31 Des 09

cube[i].side[2].v[1].z=z+0.5;

cube[i].side[2].v[2].x=x-0.5;cube[i].side[2].v[2].y=y+0.5;cube[i].side[2].v[2].z=z+0.5;

cube[i].side[2].v[3].x=x-0.5;cube[i].side[2].v[3].y=y+0.5;cube[i].side[2].v[3].z=z-0.5;

Gambar 4. Sisi Kiri Pembentuk Rubik Kubus

Lalu, dibentuk sisi kubus bagian kanan yang berwarna kuning seperti ditunjukkan pada Gambar 5. Potongan code untuk menghasilkan sisi kanan pembentuk rubik kubus tersebut adalah sebagai berikut :

cube[i].side[3].r=cube[i].side[3].g=.95; cube[i].side[3].b=0;cube[i].side[3].v[0].x=x+0.5;cube[i].side[3].v[0].y=y-0.5;cube[i].side[3].v[0].z=z-0.5;

cube[i].side[3].v[1].x=x+0.5;cube[i].side[3].v[1].y=y-0.5;cube[i].side[3].v[1].z=z+0.5;

cube[i].side[3].v[2].x=x+0.5;cube[i].side[3].v[2].y=y+0.5;cube[i].side[3].v[2].z=z+0.5;

cube[i].side[3].v[3].x=x+0.5;cube[i].side[3].v[3].y=y+0.5;cube[i].side[3].v[3].z=z-0.5;

Grafika Komputer – Final Project – Rubik Kubus Hal. 6 dari 34 Halaman

Page 7: Laporan Akhir Fp Grafkom Rubik 31 Des 09

Gambar 5. Sisi Kanan Pembentuk Rubik Kubus

Lalu, dibentuk sisi kubus bagian belakang yang berwarna hijau seperti ditunjukkan pada Gambar 6. Potongan code untuk menghasilkan sisi belakang pembentuk rubik kubus tersebut adalah sebagai berikut :

cube[i].side[5].g=.6;cube[i].side[5].b=cube[i].side[5].r=0;cube[i].side[5].v[0].x=x-0.5;cube[i].side[5].v[0].y=y+0.5;cube[i].side[5].v[0].z=z-0.5;

cube[i].side[5].v[1].x=x-0.5;cube[i].side[5].v[1].y=y+0.5;cube[i].side[5].v[1].z=z+0.5;

cube[i].side[5].v[2].x=x+0.5;cube[i].side[5].v[2].y=y+0.5;cube[i].side[5].v[2].z=z+0.5;

cube[i].side[5].v[3].x=x+0.5;cube[i].side[5].v[3].y=y+0.5;cube[i].side[5].v[3].z=z-0.5;

Grafika Komputer – Final Project – Rubik Kubus Hal. 7 dari 34 Halaman

Page 8: Laporan Akhir Fp Grafkom Rubik 31 Des 09

Gambar 6. Sisi Belakang Pembentuk Rubik Kubus

Kemudian, dibentuk sisi kubus bagian depan yang berwarna biru seperti ditunjukkan pada Gambar 7. Potongan code untuk menghasilkan sisi depan pembentuk rubik kubus tersebut adalah sebagai berikut :

cube[i].side[4].b=1;cube[i].side[4].r=cube[i].side[4].g=0;cube[i].side[4].v[0].x=x-0.5;cube[i].side[4].v[0].y=y-0.5;cube[i].side[4].v[0].z=z-0.5;

cube[i].side[4].v[1].x=x-0.5;cube[i].side[4].v[1].y=y-0.5;cube[i].side[4].v[1].z=z+0.5;

cube[i].side[4].v[2].x=x+0.5;cube[i].side[4].v[2].y=y-0.5;cube[i].side[4].v[2].z=z+0.5;

cube[i].side[4].v[3].x=x+0.5;cube[i].side[4].v[3].y=y-0.5;cube[i].side[4].v[3].z=z-0.5;

Grafika Komputer – Final Project – Rubik Kubus Hal. 8 dari 34 Halaman

Page 9: Laporan Akhir Fp Grafkom Rubik 31 Des 09

Gambar 7. Sisi Depan Pembentuk Rubik Kubus

Selanjutnya, tepi-tepi tiap selection akan diberi border berwarna hitam seperti ditunjukkan pada Gambar 8. Potongan code untuk menghasilkan border tersebut adalah sebagai berikut :

for(int s=0;s<6;++s) {for(int v=0;v<4;++v) {

if(abs(cube[i].side[s].v[v].x)<1 && abs(cube[i].side[s].v[v].z)<1&& abs(cube[i].side[s].v[v].y)<1) {

cube[i].side[s].r=cube[i].side[s].g=cube[i].side[s].b=0;}

}}

Gambar 8. Border Tepi-Tepi Rubik Kubus

Grafika Komputer – Final Project – Rubik Kubus Hal. 9 dari 34 Halaman

Page 10: Laporan Akhir Fp Grafkom Rubik 31 Des 09

Lalu, untuk menampilkan kotak selector pada rubik kubus seperti ditunjukkan pada Gambar 9, potongan code-nya adalah sebagai berikut :

glPushMatrix();glLineWidth(3); //tebal garis vector kubus sampleglColor3d(0,0,0);

if(cMove < 3){glScaled(1.1,3.6,3.6); //di skala x,y,zglTranslated(cMove-1,0,0); //di translasi kan x,y,z

} else if(cMove >=3 && cMove<6) {glScaled(3.6,1.1,3.6);glTranslated(0,cMove-4,0);

} else if(cMove>=6) {glScaled(3.6,3.6,1.1);glTranslated(0,0,cMove-7);

}glutWireCube(1); //pmbentuk rangka kubus selectorglPopMatrix();

Gambar 9. Sisi Belakang Pembentuk Rubik Kubus

Selain itu, juga terdapat shuffle pada permainan rubik kubus ini, berikut adalah potongan code-nya :

if(key==SHUFFLE) {for(int i=0;i<100;++i) {

int r=rand()%6;char key;if(r==0) key=UP;else if(r==1) key=DOWN;else if(r==2) key=LEFT;else if(r==3) key=RIGHT;else if(r==4) key=FRONT;else if(r==5) key=BACK;Rubik.Move(key,true);

}return;

Grafika Komputer – Final Project – Rubik Kubus Hal. 10 dari 34 Halaman

Page 11: Laporan Akhir Fp Grafkom Rubik 31 Des 09

}

Dan juga terdapat code untuk mengatur penggunaan mouse pada permainan rubik kubus ini, berikut adalah potongan code-nya :

void onMove(int x,int y) {theta=(y-dragy)/(100+theta0); //sensitifitas mouse dan pergerakan mouse

sumbu yphi=(dragx-x)/(50+phi0); //sumbu x

if(theta<-1.5) theta=-1.5; //menahan sumbu-y ke atasif(theta>1.5) theta=1.5; //menahan sumbu-y ke bawahglutPostRedisplay();

}

Hasil Eksekusi

Tampilan awal permainan “Rubik Kubus” ditunjukkan pada Gambar 2. Untuk memulai permainan agar rubik kubus teracak susunan warnanya, ditunjukkan pada Gambar 3.

Gambar 10. Tampilan Awal Rubik Kubus

Grafika Komputer – Final Project – Rubik Kubus Hal. 11 dari 34 Halaman

Page 12: Laporan Akhir Fp Grafkom Rubik 31 Des 09

Gambar 11. Tampilan Rubik Kubus Setelah Dilakukan Shuffle

Setelah rubik menjadi seperti pada Gambar 3, rubik dapat diputar-putar per selection, dan kontrol rubik juga dapat dipindah seperti pada Gambar 4.

Gambar 12. Pergantian Selection Menjadi ke Tengah Rubik

Grafika Komputer – Final Project – Rubik Kubus Hal. 12 dari 34 Halaman

Page 13: Laporan Akhir Fp Grafkom Rubik 31 Des 09

Gambar 13. Pemutaran Selection Menggunakan Tombol Back Space

Selain itu, rubik juga dapat diputar per selection yang arahnya berlawanan dengan Gambar 5,seperti yang ditunjukkan pada Gambar 6.

Gambar 14. Pemutaran Selection Menggunakan Tombol Enter

Grafika Komputer – Final Project – Rubik Kubus Hal. 13 dari 34 Halaman

Page 14: Laporan Akhir Fp Grafkom Rubik 31 Des 09

Rubik juga dapat diputar secara keseluruhan, sehingga sudut pandangnya berubah, seperti yang ditunjukkan pada Gambar 7.

Gambar 15. Rubik Setelah Diputar dengan Mouse

Pada kelas matrix.cpp kami menggunakannya untuk mendefinisikan matrix row dikalikan kolom 3 x 3 yang akan dibentuk menggunakan kesatuan link pada kelas vector.cpp, side.cpp, cube.cpp dan rubik.cpp. Berikut potongan kode pada kelas matrix :

class matrix {public:

double m[3][3]; //[row][column]};

Setelah mendefinisikan matrix [row][column] kemudian kita membuat kelas vector.cpp. Dimana pada kelas vektor kami mendeklarasikan variabel vektor x, y, dan z yang bertipe double. Variabel-variabel tersebut kemudian diinisialisasikan x = 0, y = 0 dan z = 0. Kami menggunakan fungsi vektor operator + = (vektor p) yang mengembalikan nilai vektor sebelumnya. Berikut potongan kodenya :

vector operator+=(vector p){x+=p.x;y+=p.y;z+=p.z;return *this;

}

Untuk menghitung perputaran, kami menggunakan fungsi perkalian matrix m yang bertipe void. Kami juga mendefinisikan variabel xn, yn dan zn untuk digunakan pada fungsi ini. Variabel ini berisi sejumlah perkalian matrix. Berikut potongan programnya :

Grafika Komputer – Final Project – Rubik Kubus Hal. 14 dari 34 Halaman

Page 15: Laporan Akhir Fp Grafkom Rubik 31 Des 09

void Multiply(matrix m) {double xn,yn,zn; //var xn,yn,znxn=m.m[0][0]*x+m.m[1][0]*y+m.m[2][0]*z;yn=m.m[0][1]*x+m.m[1][1]*y+m.m[2][1]*z;zn=m.m[0][2]*x+m.m[1][2]*y+m.m[2][2]*z;x=xn;y=yn;z=zn;

}

Seperti halnya kelas vector.cpp memerlukan include kelas matrix.cpp, berikutnya kelas side. Kelas side ini memerlukan include kelas vector.cpp yang akan digunakan untuk pembentukan sisi dari kubus rubik. Setiap sisi kubus memiliki variabel array 1 sisi yang berisi 4 vector penyusun. Kami juga mendeklarasikan variabel warna yang bertipe double yaitu r g b (red, green, blue). Seperti berikut potongan programnya:

double r,g,b; //variabel warnavector v[4];

Fungsi void Draw yang berisi glColor3d(r,g,b) kami sertakan untuk mewarnai sisi-sisi kubus 3 dimensi. Untuk membuat 4 titik vektor menggunakan glVertex3d yang kemudian akan dikombinasikan dengan GL_QUADS untuk membuat persegi empat. Berikut potongan programnya :

void Draw() {glColor3d(r,g,b); //mewarnai sisi//GL_QUADSglBegin(GL_QUADS);

for(int i=0;i<4;++i) {//4 titik vektorglVertex3d(v[i].x, v[i].y, v[i].z); }

glEnd();}

Untuk menghitung perputaran matriks, menggunakan perkalian matrix m i =0, i < 4.

vector center() {vector ret;for(int i=0;i<4;++i)

ret+=v[i];return ret;

}void Multiply(matrix m) {

for(int i=0;i<4;++i)v[i].Multiply(m);

}

Setelah membentuk kelas side.cpp, kemudian membuat kelas cube.cpp yang mengincludkan side.cpp. Pada kelas ini kami mendefinisikan bahwa kubus memiliki 6 sisi.

side side[6];

Menggambar sisi kubus kami perlu memanggil kelas side.cpp dan dengan menggunakan fungsi Draw.

void Draw() {for(int i=0;i<6;++i) {

side[i].Draw(); //memanggil kelas sisi }

Grafika Komputer – Final Project – Rubik Kubus Hal. 15 dari 34 Halaman

Page 16: Laporan Akhir Fp Grafkom Rubik 31 Des 09

}

Dalam kelas ini menggunakan perkalian matriks untuk perputaran sisi-sisinya.

void Multiply(matrix m) {for(int i=0;i<6;++i)

side[i].Multiply(m);}

Kemudian kelas Rubik.cpp menggunakan include dari cube.cpp yang telah dibentuk tadi. Yang pada awalnya perlu mendefinisikan keyboard key yang tidak ditangkap oleh glutKeyboardFunc. Berikut yang didefinisikan antara lain :

#define UP '1'#define DOWN '2'#define LEFT '3'#define RIGHT '4'#define FRONT '5'#define BACK '6'#define UP2 'q'#define DOWN2 'w'#define LEFT2 'e'#define RIGHT2 'r'#define FRONT2 't'#define BACK2 'y'#define UP3 'a'#define DOWN3 's'#define LEFT3 'd'#define RIGHT3 'f'#define FRONT3 'g'#define BACK3 'h'

Kemudian kelas Rubik.cpp menggunakan include dari cube.cpp yang telah dibentuk tadi. Kelas rubik ini mendefinisikan bahwa terdapat 27 kubus kecil yang membentuk satu satuan kubus rubik besar. Dalam fungsi reset diperlukan perhitungan untuk menentukan koordinat, perhitungan tersebut terdapat dalam xi, yi dan zi dalam kondisi int i=0; i < 27.

int xi=i%3-1;

int yi=((i-xi)/3)%3-1;

int zi=((i-xi)/3)/3-1;

Untuk mengatur perbesaran titik-titik koordinat masing-masing vektor.

double x=xi*1.1;double y=yi*1.1;double z=zi*1.1;

Kemudian posisi masing-masing sisi didefinisikan bagian bawah, atas, kiri, kanan, belakang dan depan seperti pada gambar 2 dan seterusnya yang telah di jelaskan di bagian atas. Kemudian untuk memberikan kesan kubus kecil terpisah-pisah, kami mewarnai semua sisi yang berada di bagian dalam dengan warna hitam.

Grafika Komputer – Final Project – Rubik Kubus Hal. 16 dari 34 Halaman

Page 17: Laporan Akhir Fp Grafkom Rubik 31 Des 09

for(int s=0;s<6;++s) {for(int v=0;v<4;++v) {if(abs(cube[i].side[s].v[v].x)<1 && abs(cube[i].side[s].v[v].z)<1&& abs(cube[i].side[s].v[v].y)<1) {cube[i].side[s].r=cube[i].side[s].g=cube[i].side[s].b=0;

}}

Untuk menggambar kubus kecil-kecilfor(int i=0;i<27;i++) cube[i].Draw();

Untuk perpindahan, maka menggunakan fungsi Move yang bertipe void, dimana key bertipe char dan fast yang bertipe bool.

double ang=fast?3.14159265/10.0:3.14159265/50.0; digunakan dan berpengaruh terhadap kecepatan putar. Jika shuffle perputaran 10 kali lebih lambat, jika tidak shuffle maka perputaran bisa 50 kali lebih lambat. Dengan menggunakan switch case untuk memanggil masing-masing bagian serta menentukan nilai-nilai matrix.

switch(key) {case(LEFT):case(LEFT2):case(LEFT3):

m.m[0][0]=1;m.m[1][1]=cos(ang);m.m[1][2]=sin(ang);m.m[2][1]=-sin(ang);m.m[2][2]=cos(ang);break;

case(RIGHT):case(RIGHT2):case(RIGHT3):

m.m[0][0]=1;m.m[1][1]=cos(ang);m.m[1][2]=-sin(ang);m.m[2][1]=sin(ang);m.m[2][2]=cos(ang);break;

case(UP):case(UP2):case(UP3):

m.m[2][2]=1;m.m[0][0]=cos(ang);m.m[0][1]=-sin(ang);m.m[1][0]=sin(ang);m.m[1][1]=cos(ang);break;

case(DOWN):case(DOWN2):case(DOWN3):

m.m[2][2]=1;m.m[0][0]=cos(ang);m.m[0][1]=sin(ang);m.m[1][0]=-sin(ang);m.m[1][1]=cos(ang);break;

case(FRONT):case(FRONT2):case(FRONT3):

m.m[1][1]=1;m.m[0][0]=cos(ang);m.m[0][2]=sin(ang);

Grafika Komputer – Final Project – Rubik Kubus Hal. 17 dari 34 Halaman

Page 18: Laporan Akhir Fp Grafkom Rubik 31 Des 09

m.m[2][0]=-sin(ang);m.m[2][2]=cos(ang);break;

case(BACK):case(BACK2):case(BACK3):

m.m[1][1]=1;m.m[0][0]=cos(ang);m.m[0][2]=-sin(ang);m.m[2][0]=sin(ang);m.m[2][2]=cos(ang);break;

}

long t0=glutGet(GLUT_ELAPSED_TIME); digunakan untuk mengambil waktu sisa pada saat perputaran .

for(int t=0;t<(fast?5:25);++t) { for(int n=0;n<27;++n) { //dalam sekali putar ada 27

switch(key) {case(RIGHT):case(LEFT3):

if(cube[n].center().x>1) cube[n].Multiply(m);break;

case(LEFT):case(RIGHT3):

if(cube[n].center().x<-1) cube[n].Multiply(m);break;

case(LEFT2):case(RIGHT2):

if(cube[n].center().x>-1 && cube[n].center().x<+1) cube[n].Multiply(m);break;

case(UP):case(DOWN3):

if(cube[n].center().z>+1) cube[n].Multiply(m);break;

case(DOWN):case(UP3):

if(cube[n].center().z<-1) cube[n].Multiply(m);break;

case(UP2):case(DOWN2):

if(cube[n].center().z<+1 && cube[n].center().z>-1) cube[n].Multiply(m);break;

case(FRONT):case(BACK3):

if(cube[n].center().y<-1) cube[n].Multiply(m);break;

case(BACK):case(FRONT3):

if(cube[n].center().y>+1) cube[n].Multiply(m);break;

case(FRONT2):case(BACK2):

if(cube[n].center().y<+1 && cube[n].center().y>-1) cube[n].Multiply(m);break;

}}

Grafika Komputer – Final Project – Rubik Kubus Hal. 18 dari 34 Halaman

Page 19: Laporan Akhir Fp Grafkom Rubik 31 Des 09

Memanggil fungsi Draw() untuk menggambar ulang hasil koordinat yang baru. Dan menggunakan glutSwapBuffers() untuk memperhalus dengan memperlambat waktu menjadi 10 kali lebih lambat.

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);Draw(); glutSwapBuffers(); while(glutGet(GLUT_ELAPSED_TIME)<t0+t*10);

Kemudian membuat kelas main.cpp yang mana memerlukan kelas Rubik.cpp, include stdlib.h, stdio.h, GL/ glut .h dan cmath. Untuk fungsi kontrol rubik :

#define SHUFFLE 's' untuk shuffle kubus rubik#define SELECT '\t' tab#define SELECT2 '`'#define MOVE 13 Enter#define MOVE2 8 Backspace

Untuk fungsi drag and drop kemudian untuk mendefinisikan fungsi onShape :

Rubik Rubik;

double theta=0.35;double phi=0.25;int cMove=0;double theta0,phi0;int dragx,dragy;

void onShape(int x, int y) {glViewport(0,0,500,500);

glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(45,1,1,100); //fovy,aspect,near,far

glMatrixMode(GL_MODELVIEW);glEnable(GL_DEPTH_TEST);

}

Berikut ini adalah fungsi untuk memberikan warna back ground, meletakkan posisi kamera, memberikan tebal gari vektor kubus sample, translasi yang digunakan serta pembentukan kerangka kubu selector.

void onDraw() {glClearColor(0.8,0.8,0.8,0); //warna background abu2glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glLoadIdentity();gluLookAt(7*sin(phi)*cos(theta), -7*cos(phi)*cos(theta), 7*sin(theta),

0,0,0,0,0,1); //posisi kamera

printf("koordinat kamera: %f %f %f\n",7*sin(phi)*cos(theta), -7*cos(phi)*cos(theta), 7*sin(theta));

glPushMatrix();glLineWidth(3); //tebal garis vector kubus sampleglColor3d(0,0,0);

if(cMove < 3){glScaled(1.1,3.6,3.6); //di skala x,y,z

Grafika Komputer – Final Project – Rubik Kubus Hal. 19 dari 34 Halaman

Page 20: Laporan Akhir Fp Grafkom Rubik 31 Des 09

glTranslated(cMove-1,0,0); //di translasi kan x,y,z} else if(cMove >=3 && cMove<6) {

glScaled(3.6,1.1,3.6);glTranslated(0,cMove-4,0);

} else if(cMove>=6) {glScaled(3.6,3.6,1.1);glTranslated(0,0,cMove-7);

}glutWireCube(1); //pmbentuk rangka kubus selectorglPopMatrix();

Rubik.Draw();

glutSwapBuffers();}

Tiap perpindahan selector cMove brtambah 1 karena hanya ada 9 kali perpindahan selector.

void onKeyboard(unsigned char key,int x,int y) {if(key==SHUFFLE) {

for(int i=0;i<100;++i) {int r=rand()%6;char key;if(r==0) key=UP;else if(r==1) key=DOWN;else if(r==2) key=LEFT;else if(r==3) key=RIGHT;else if(r==4) key=FRONT;else if(r==5) key=BACK;Rubik.Move(key,true);

}return;

}if(key==SELECT) {

++cMove; //tiap perpindahan selector cMove brtambah 1cMove%=9; //karena cuma ada 9x perpindahan selectorglutPostRedisplay();return;

Setiap perpindahan selector mundur cMove brkurang 1.if(key==SELECT2) {

--cMove; //if(cMove<0) cMove=8; //klo minus kembali k cMove=8glutPostRedisplay();return;

}if(key==MOVE) {

if(cMove==0) Rubik.Move(LEFT,false);if(cMove==1) Rubik.Move(LEFT2,false);if(cMove==2) Rubik.Move(LEFT3,false);if(cMove==3) Rubik.Move(FRONT,false);if(cMove==4) Rubik.Move(FRONT2,false);if(cMove==5) Rubik.Move(FRONT3,false);if(cMove==6) Rubik.Move(DOWN,false);if(cMove==7) Rubik.Move(DOWN2,false);if(cMove==8) Rubik.Move(DOWN3,false);return;

}if(key==MOVE2){

if(cMove==0) Rubik.Move(RIGHT3,false);if(cMove==1) Rubik.Move(RIGHT2,false);if(cMove==2) Rubik.Move(RIGHT,false);if(cMove==3) Rubik.Move(BACK3,false);if(cMove==4) Rubik.Move(BACK2,false);

Grafika Komputer – Final Project – Rubik Kubus Hal. 20 dari 34 Halaman

Page 21: Laporan Akhir Fp Grafkom Rubik 31 Des 09

if(cMove==5) Rubik.Move(BACK,false);if(cMove==6) Rubik.Move(UP3,false);if(cMove==7) Rubik.Move(UP2,false);if(cMove==8) Rubik.Move(UP,false);return;

}

Berikut ini potongan program untuk mengatur sensitifitas mouse dan pergerakan mouse.

void onMove(int x,int y) {theta=(y-dragy)/(100+theta0); //sensitifitas mouse dan pergerakan mouse

sumbu yphi=(dragx-x)/(50+phi0); //sumbu x

if(theta<-1.5) theta=-1.5; //menahan sumbu-y ke atasif(theta>1.5) theta=1.5; //menahan sumbu-y ke bawahglutPostRedisplay();

}

void onClick(int b,int klik,int x,int y) {if(klik==GLUT_DOWN) {

theta0=theta; //temporaryphi0=phi; //temporarydragx=x; //temporarydragy=y; //temporary

}}

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

glutInit(&argc,argv);glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);glutInitWindowSize(500,500);glutCreateWindow("Rubik");

glutReshapeFunc(onShape);glutDisplayFunc(onDraw);glutKeyboardFunc(onKeyboard);glutMotionFunc(onMove);glutMouseFunc(onClick);

Rubik.Reset();

glutMainLoop();return 0;

}

Grafika Komputer – Final Project – Rubik Kubus Hal. 21 dari 34 Halaman

Page 22: Laporan Akhir Fp Grafkom Rubik 31 Des 09

Kesimpulan

Pembentukan object 3D yang dapat dibentuk dimulai dari vector, kemudian membentuk sisi dan menjadi kubus. Rubik terdiri dari 27 kubus kecil. Memutar object dengan menggunakan perhitungan matrix. Memutar kamera dengan menggunakan mouse drag and drop. Memperlambat pergerakan object.

Kesulitan yang kami alami dalam membuat project ini adalah dalam perhitungan sudut dengan menggunakan matriks pada saat memutar objek. Dalam memberi pencahayaan dan memutar object.

Dalam hal ini yang dapat pelajari dari project ini yaitu kita dapat membentuk kubus dari kumpulan vector dan sisi. Dan mengerti beberapa fungsi – fungsi glut yang digunakan dalam pembuatan project ini.

Daftar Pustaka

http://anny.its-sby.edu/

http://www.opengl.org/

Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009

http://www.experts-exchange.com/Programming/Languages/.NET/Visual_CSharp/ Q_22460524.html

Discussion Board OpenGL

http://www.planet-source-code.com/vb/scripts

http://www.astahost.com/info.php/Opengl-Tut_t5081.html

http://code.msdn.microsoft.com/RubiksCubeSolver

http://www.gamedev.net/community/forums

Grafika Komputer – Final Project – Rubik Kubus Hal. 22 dari 34 Halaman

Page 23: Laporan Akhir Fp Grafkom Rubik 31 Des 09

Lampiran

Source Code

main.cpp#include "stdlib.h"#include "GL/glut.h"#include "Rubik.cpp"

#define SHUFFLE 's'#define SELECT '\t' //tab#define SELECT2 '`'#define MOVE 13 //Enter#define MOVE2 8 //Backspace

Rubik Rubik;

double theta=0.35;double phi=0.25;int cMove=0;double theta0,phi0;int dragx,dragy;

void onShape(int x, int y) {glViewport(0,0,500,500);

glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(45,1,1,100); //fovy,aspect,near,far

glMatrixMode(GL_MODELVIEW);glEnable(GL_DEPTH_TEST);

}

void onDraw() {glClearColor(0.8,0.8,0.8,0);glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glLoadIdentity();gluLookAt(7*sin(phi)*cos(theta), -7*cos(phi)*cos(theta), 7*sin(theta),

0,0,0,0,0,1);

glPushMatrix();glLineWidth(3);glColor3d(0,0,0);

if(cMove < 3){glScaled(1.1,3.6,3.6);glTranslated(cMove-1,0,0);

} else if(cMove >=3 && cMove<6) {glScaled(3.6,1.1,3.6);glTranslated(0,cMove-4,0);

} else if(cMove>=6) {glScaled(3.6,3.6,1.1);glTranslated(0,0,cMove-7);

}glutWireCube(1);glPopMatrix();

Rubik.Draw();

glutSwapBuffers();}

void onKeyboard(unsigned char key,int x,int y) {if(key==SHUFFLE) {

for(int i=0;i<100;++i) {int r=rand()%6;char key;if(r==0) key=UP;else if(r==1) key=DOWN;

Grafika Komputer – Final Project – Rubik Kubus Hal. 23 dari 34 Halaman

Page 24: Laporan Akhir Fp Grafkom Rubik 31 Des 09

else if(r==2) key=LEFT;else if(r==3) key=RIGHT;else if(r==4) key=FRONT;else if(r==5) key=BACK;Rubik.Move(key,true);

}return;

}if(key==SELECT) {

++cMove;cMove%=9;glutPostRedisplay();return;

}if(key==SELECT2) {

--cMove;if(cMove<0) cMove=8;glutPostRedisplay();return;

}if(key==MOVE) {

if(cMove==0) Rubik.Move(LEFT,false);if(cMove==1) Rubik.Move(LEFT2,false);if(cMove==2) Rubik.Move(LEFT3,false);if(cMove==3) Rubik.Move(FRONT,false);if(cMove==4) Rubik.Move(FRONT2,false);if(cMove==5) Rubik.Move(FRONT3,false);if(cMove==6) Rubik.Move(DOWN,false);if(cMove==7) Rubik.Move(DOWN2,false);if(cMove==8) Rubik.Move(DOWN3,false);return;

}if(key==MOVE2){

if(cMove==0) Rubik.Move(RIGHT3,false);if(cMove==1) Rubik.Move(RIGHT2,false);if(cMove==2) Rubik.Move(RIGHT,false);if(cMove==3) Rubik.Move(BACK3,false);if(cMove==4) Rubik.Move(BACK2,false);if(cMove==5) Rubik.Move(BACK,false);if(cMove==6) Rubik.Move(UP3,false);if(cMove==7) Rubik.Move(UP2,false);if(cMove==8) Rubik.Move(UP,false);return;

}}

void onMove(int x,int y) {theta=(y-dragy)/100+theta0; //sensitifitas mousephi=(dragx-x)/50+phi0;

if(theta<-2) theta=-2;if(theta>2) theta=2;glutPostRedisplay();

}

void onClick(int b,int klik,int x,int y) {if(klik==GLUT_DOWN) {

theta0=theta;phi0=phi;dragx=x;dragy=y;

}}

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

glutInit(&argc,argv);glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);glutInitWindowSize(500,500);glutCreateWindow("Rubik");

glutReshapeFunc(onShape);glutDisplayFunc(onDraw);glutKeyboardFunc(onKeyboard);glutMotionFunc(onMove);glutMouseFunc(onClick);

Grafika Komputer – Final Project – Rubik Kubus Hal. 24 dari 34 Halaman

Page 25: Laporan Akhir Fp Grafkom Rubik 31 Des 09

Rubik.Reset();

glutMainLoop();return 0;

}

cube.cpp

//pembentukan masing2 kubus

#include "side.cpp"

class cube {public:

side side[6];

void Draw() {for(int i=0;i<6;++i) {

side[i].Draw();}

}

vector center() {vector ret;for(int i=0;i<6;++i)

ret+=side[i].center();return ret;

}

void Multiply(matrix m) {for(int i=0;i<6;++i)

side[i].Multiply(m);}

};

matrix.cpp

class matrix {public:

double m[3][3]; //[row][column]};

Rubik.cpp

#include "cube.cpp"#include <cmath>

#define UP '1'#define DOWN '2'#define LEFT '3'#define RIGHT '4'#define FRONT '5'#define BACK '6'#define UP2 'q'#define DOWN2 'w'#define LEFT2 'e'#define RIGHT2 'r'#define FRONT2 't'#define BACK2 'y'#define UP3 'a'#define DOWN3 's'#define LEFT3 'd'#define RIGHT3 'f'#define FRONT3 'g'#define BACK3 'h'

Grafika Komputer – Final Project – Rubik Kubus Hal. 25 dari 34 Halaman

Page 26: Laporan Akhir Fp Grafkom Rubik 31 Des 09

class Rubik {public:

cube cube[27];

void Reset() {for(int i=0;i<27;++i) {

int xi=i%3-1;int yi=((i-xi)/3)%3-1;int zi=((i-xi)/3)/3-1;double x=xi*1.1;double y=yi*1.1;double z=zi*1.1;

//bawahcube[i].side[0].r=0.8;cube[i].side[0].g=cube[i].side[0].b=0; //(r,g,b)=(0.8,0,0)=merahcube[i].side[0].v[0].x=x-0.5;cube[i].side[0].v[0].y=y-0.5;cube[i].side[0].v[0].z=z-0.5;

cube[i].side[0].v[1].x=x+0.5;cube[i].side[0].v[1].y=y-0.5;cube[i].side[0].v[1].z=z-0.5;

cube[i].side[0].v[2].x=x+0.5;cube[i].side[0].v[2].y=y+0.5;cube[i].side[0].v[2].z=z-0.5;

cube[i].side[0].v[3].x=x-0.5;cube[i].side[0].v[3].y=y+0.5;cube[i].side[0].v[3].z=z-0.5;

//Atascube[i].side[1].r=1;cube[i].side[1].g=0.75;cube[i].side[1].b=0; //(r,g,b)=(1, 0.75, 0)=orencube[i].side[1].v[0].x=x-0.5;cube[i].side[1].v[0].y=y-0.5;cube[i].side[1].v[0].z=z+0.5;

cube[i].side[1].v[1].x=x+0.5;cube[i].side[1].v[1].y=y-0.5;cube[i].side[1].v[1].z=z+0.5;

cube[i].side[1].v[2].x=x+0.5;cube[i].side[1].v[2].y=y+0.5;cube[i].side[1].v[2].z=z+0.5;

cube[i].side[1].v[3].x=x-0.5;cube[i].side[1].v[3].y=y+0.5;cube[i].side[1].v[3].z=z+0.5;

//Left //(r,g,b)=(0.9,0.9,0.9)=10% greycube[i].side[2].r=cube[i].side[2].b=cube[i].side[2].g=.9;cube[i].side[2].v[0].x=x-0.5; cube[i].side[2].v[0].y=y-0.5;cube[i].side[2].v[0].z=z-0.5;

cube[i].side[2].v[1].x=x-0.5;cube[i].side[2].v[1].y=y-0.5;cube[i].side[2].v[1].z=z+0.5;

cube[i].side[2].v[2].x=x-0.5;cube[i].side[2].v[2].y=y+0.5;cube[i].side[2].v[2].z=z+0.5;

cube[i].side[2].v[3].x=x-0.5;cube[i].side[2].v[3].y=y+0.5;cube[i].side[2].v[3].z=z-0.5;

//Rightcube[i].side[3].r=cube[i].side[3].g=.95;

//(r,g,b)=(0.95,0.95,0)=kuning

Grafika Komputer – Final Project – Rubik Kubus Hal. 26 dari 34 Halaman

Page 27: Laporan Akhir Fp Grafkom Rubik 31 Des 09

cube[i].side[3].b=0;cube[i].side[3].v[0].x=x+0.5;cube[i].side[3].v[0].y=y-0.5;cube[i].side[3].v[0].z=z-0.5;

cube[i].side[3].v[1].x=x+0.5;cube[i].side[3].v[1].y=y-0.5;cube[i].side[3].v[1].z=z+0.5;

cube[i].side[3].v[2].x=x+0.5;cube[i].side[3].v[2].y=y+0.5;cube[i].side[3].v[2].z=z+0.5;

cube[i].side[3].v[3].x=x+0.5;cube[i].side[3].v[3].y=y+0.5;cube[i].side[3].v[3].z=z-0.5;

//Backcube[i].side[5].g=.6; //(r,g,b)=(0,0.6,0)=ijocube[i].side[5].b=cube[i].side[5].r=0;cube[i].side[5].v[0].x=x-0.5;cube[i].side[5].v[0].y=y+0.5;cube[i].side[5].v[0].z=z-0.5;

cube[i].side[5].v[1].x=x-0.5;cube[i].side[5].v[1].y=y+0.5;cube[i].side[5].v[1].z=z+0.5;

cube[i].side[5].v[2].x=x+0.5;cube[i].side[5].v[2].y=y+0.5;cube[i].side[5].v[2].z=z+0.5;

cube[i].side[5].v[3].x=x+0.5;cube[i].side[5].v[3].y=y+0.5;cube[i].side[5].v[3].z=z-0.5;

//Frontcube[i].side[4].b=1; //(r,g,b)=(0,0,1)=birucube[i].side[4].r=cube[i].side[4].g=0;cube[i].side[4].v[0].x=x-0.5;cube[i].side[4].v[0].y=y-0.5;cube[i].side[4].v[0].z=z-0.5;

cube[i].side[4].v[1].x=x-0.5;cube[i].side[4].v[1].y=y-0.5;cube[i].side[4].v[1].z=z+0.5;

cube[i].side[4].v[2].x=x+0.5;cube[i].side[4].v[2].y=y-0.5;cube[i].side[4].v[2].z=z+0.5;

cube[i].side[4].v[3].x=x+0.5;cube[i].side[4].v[3].y=y-0.5;cube[i].side[4].v[3].z=z-0.5;

for(int s=0;s<6;++s) {for(int v=0;v<4;++v) {

if(abs(cube[i].side[s].v[v].x)<1 && abs(cube[i].side[s].v[v].z)<1&& abs(cube[i].side[s].v[v].y)<1) {

cube[i].side[s].r=cube[i].side[s].g=cube[i].side[s].b=0;}

}}

}}

void Draw() {for(int i=0;i<27;i++) cube[i].Draw();

}

void Move(char key, bool fast) {

Grafika Komputer – Final Project – Rubik Kubus Hal. 27 dari 34 Halaman

Page 28: Laporan Akhir Fp Grafkom Rubik 31 Des 09

matrix m;for(int i=0;i<3;++i) {

for(int j=0;j<3;++j) {m.m[i][j]=0;

}}

double ang=fast?3.14159265/10.0:3.14159265/50.0;

switch(key) {case(LEFT):case(LEFT2):case(LEFT3):

m.m[0][0]=1;m.m[1][1]=cos(ang);m.m[1][2]=sin(ang);m.m[2][1]=-sin(ang);m.m[2][2]=cos(ang);break;

case(RIGHT):case(RIGHT2):case(RIGHT3):

m.m[0][0]=1;m.m[1][1]=cos(ang);m.m[1][2]=-sin(ang);m.m[2][1]=sin(ang);m.m[2][2]=cos(ang);break;

case(UP):case(UP2):case(UP3):

m.m[2][2]=1;m.m[0][0]=cos(ang);m.m[0][1]=-sin(ang);m.m[1][0]=sin(ang);m.m[1][1]=cos(ang);break;

case(DOWN):case(DOWN2):case(DOWN3):

m.m[2][2]=1;m.m[0][0]=cos(ang);m.m[0][1]=sin(ang);m.m[1][0]=-sin(ang);m.m[1][1]=cos(ang);break;

case(FRONT):case(FRONT2):case(FRONT3):

m.m[1][1]=1;m.m[0][0]=cos(ang);m.m[0][2]=sin(ang);m.m[2][0]=-sin(ang);m.m[2][2]=cos(ang);break;

case(BACK):case(BACK2):case(BACK3):

m.m[1][1]=1;m.m[0][0]=cos(ang);m.m[0][2]=-sin(ang);m.m[2][0]=sin(ang);m.m[2][2]=cos(ang);break;

}

long t0=glutGet(GLUT_ELAPSED_TIME); //mengambil waktu sisafor(int t=0;t<(fast?5:25);++t) {

for(int n=0;n<27;++n) {switch(key) {

case(RIGHT):case(LEFT3):

if(cube[n].center().x>1) cube[n].Multiply(m);break;

case(LEFT):case(RIGHT3):

Grafika Komputer – Final Project – Rubik Kubus Hal. 28 dari 34 Halaman

Page 29: Laporan Akhir Fp Grafkom Rubik 31 Des 09

if(cube[n].center().x<-1) cube[n].Multiply(m);break;

case(LEFT2):case(RIGHT2):

if(cube[n].center().x>-1 && cube[n].center().x<+1) cube[n].Multiply(m);

break;case(UP):case(DOWN3):

if(cube[n].center().z>+1) cube[n].Multiply(m);break;

case(DOWN):case(UP3):

if(cube[n].center().z<-1) cube[n].Multiply(m);break;

case(UP2):case(DOWN2):

if(cube[n].center().z<+1 && cube[n].center().z>-1) cube[n].Multiply(m);

break;case(FRONT):case(BACK3):

if(cube[n].center().y<-1) cube[n].Multiply(m);break;

case(BACK):case(FRONT3):

if(cube[n].center().y>+1) cube[n].Multiply(m);break;

case(FRONT2):case(BACK2):

if(cube[n].center().y<+1 && cube[n].center().y>-1) cube[n].Multiply(m);

break;}

}glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);Draw();glutSwapBuffers();while(glutGet(GLUT_ELAPSED_TIME)<t0+t*10); //waktu diperlambat 10x

}}

};

side.cpp

//pembentukan sisi=side

#include "GL/glut.h"#include "vector.cpp"

class side{public:

double r,g,b;vector v[4];

void Draw() {glColor3d(r,g,b);glBegin(GL_QUADS);

for(int i=0;i<4;++i) {glVertex3d(v[i].x, v[i].y, v[i].z); }

glEnd();}

vector center() {vector ret;for(int i=0;i<4;++i)

ret+=v[i];return ret;

}

void Multiply(matrix m) {for(int i=0;i<4;++i)

v[i].Multiply(m);}

};

Grafika Komputer – Final Project – Rubik Kubus Hal. 29 dari 34 Halaman

Page 30: Laporan Akhir Fp Grafkom Rubik 31 Des 09

vector.cpp

#include "matrix.cpp"

class vector {public:

double x,y,z;

vector() : x(0), y(0), z(0) {}

vector operator+=(vector p){x+=p.x;y+=p.y;z+=p.z;return *this;

}

void Multiply(matrix m) {double xn,yn,zn;xn=m.m[0][0]*x+m.m[1][0]*y+m.m[2][0]*z;yn=m.m[0][1]*x+m.m[1][1]*y+m.m[2][1]*z;zn=m.m[0][2]*x+m.m[1][2]*y+m.m[2][2]*z;x=xn;y=yn;z=zn;

}};

Grafika Komputer – Final Project – Rubik Kubus Hal. 30 dari 34 Halaman

Page 31: Laporan Akhir Fp Grafkom Rubik 31 Des 09

Perhitungan Koordinat Vektor

vektorfor(int i=0;i<27;++i) {

int xi=i%3-1;int yi=((i-xi)/3)%3-1;int zi=((i-xi)/3)/3-1;double x=xi*1.1;double y=yi*1.1;double z=zi*1.1;

i xi yi zi x y z0 -1 -1 -1 -1,1 -

1,1-1,1

1 0 -1 -1 0 -1,1

-1,1

2 1 -1 -1 1,1 -1,1

-1,1

3 -1 0 -1 -1,1 0 -1,14 0 0 -1 0 0 -1,15 1 0 -1 1,1 0 -1,16 -1 1 -1 -1,1 1,1 -1,17 0 1 -1 0 1,1 -1,18 1 1 -1 1,1 1,1 -1,19 -1 -1 0 -1,1 -

1,10

10 0 -1 0 0 -1,1

0

11 1 -1 0 1,1 -1,1

0

12 -1 0 0 -1,1 0 013 0 0 0 0 0 014 1 0 0 1,1 0 015 -1 1 0 -1,1 1,1 016 0 1 0 0 1,1 017 1 1 0 1,1 1,1 018 -1 -1 1 -1,1 -

1,11,1

19 0 -1 1 0 -1,1

1,1

20 1 -1 1 1,1 -1,1

1,1

21 -1 0 1 -1,1 0 1,122 0 0 1 0 0 1,123 1 0 1 1,1 0 1,124 -1 1 1 -1,1 1,1 1,125 0 1 1 0 1,1 1,126 1 1 1 1,1 1,1 1,1

bottom top

x y z x y z x y z x y z0 -1,6 -0,6 -1,6 -0,6 -0,6 -1,6 -1,6 -0,6 -0,6 -0,6 -0,6 -0,6

-1,6 -1,6 -1,6 -0,6 -1,6 -1,6 -1,6 -1,6 -0,6 -0,6 -1,6 -0,61 -0,5 -0,6 -1,6 0,5 -0,6 -1,6 -0,5 -0,6 -0,6 0,5 -0,6 -0,6

-0,5 -1,6 -1,6 0,5 -1,6 -1,6 -0,5 -1,6 -0,6 0,5 -1,6 -0,62 0,6 -0,6 -1,6 1,6 -0,6 -1,6 0,6 -0,6 -0,6 1,6 -0,6 -0,6

0,6 -1,6 -1,6 1,6 -1,6 -1,6 0,6 -1,6 -0,6 1,6 -1,6 -0,63 -1,6 0,5 -1,6 -0,6 0,5 -1,6 -1,6 0,5 -0,6 -0,6 0,5 -0,6

-1,6 -0,5 -1,6 -0,6 -0,5 -1,6 -1,6 -0,5 -0,6 -0,6 -0,5 -0,64 -0,5 0,5 -1,6 0,5 0,5 -1,6 -0,5 0,5 -0,6 0,5 0,5 -0,6

-0,5 -0,5 -1,6 0,5 -0,5 -1,6 -0,5 -0,5 -0,6 0,5 -0,5 -0,6

Grafika Komputer – Final Project – Rubik Kubus Hal. 31 dari 34 Halaman

Page 32: Laporan Akhir Fp Grafkom Rubik 31 Des 09

5 0,6 0,5 -1,6 1,6 0,5 -1,6 0,6 0,5 -0,6 1,6 0,5 -0,60,6 -0,5 -1,6 1,6 -0,5 -1,6 0,6 -0,5 -0,6 1,6 -0,5 -0,6

6 -1,6 1,6 -1,6 -0,6 1,6 -1,6 -1,6 1,6 -0,6 -0,6 1,6 -0,6-1,6 0,6 -1,6 -0,6 0,6 -1,6 -1,6 0,6 -0,6 -0,6 0,6 -0,6

7 -0,5 1,6 -1,6 0,5 1,6 -1,6 -0,5 1,6 -0,6 0,5 1,6 -0,6-0,5 0,6 -1,6 0,5 0,6 -1,6 -0,5 0,6 -0,6 0,5 0,6 -0,6

8 0,6 1,6 -1,6 1,6 1,6 -1,6 0,6 1,6 -0,6 1,6 1,6 -0,60,6 0,6 -1,6 1,6 0,6 -1,6 0,6 0,6 -0,6 1,6 0,6 -0,6

9 -1,6 -0,6 -0,5 -0,6 -0,6 -0,5 -1,6 -0,6 0,5 -0,6 -0,6 0,5-1,6 -1,6 -0,5 -0,6 -1,6 -0,5 -1,6 -1,6 0,5 -0,6 -1,6 0,5

10 -0,5 -0,6 -0,5 0,5 -0,6 -0,5 -0,5 -0,6 0,5 0,5 -0,6 0,5-0,5 -1,6 -0,5 0,5 -1,6 -0,5 -0,5 -1,6 0,5 0,5 -1,6 0,5

11 0,6 -0,6 -0,5 1,6 -0,6 -0,5 0,6 -0,6 0,5 1,6 -0,6 0,50,6 -1,6 -0,5 1,6 -1,6 -0,5 0,6 -1,6 0,5 1,6 -1,6 0,5

12 -1,6 0,5 -0,5 -0,6 0,5 -0,5 -1,6 0,5 0,5 -0,6 0,5 0,5-1,6 -0,5 -0,5 -0,6 -0,5 -0,5 -1,6 -0,5 0,5 -0,6 -0,5 0,5

13 -0,5 0,5 -0,5 0,5 0,5 -0,5 -0,5 0,5 0,5 0,5 0,5 0,5-0,5 -0,5 -0,5 0,5 -0,5 -0,5 -0,5 -0,5 0,5 0,5 -0,5 0,5

14 0,6 0,5 -0,5 1,6 0,5 -0,5 0,6 0,5 0,5 1,6 0,5 0,50,6 -0,5 -0,5 1,6 -0,5 -0,5 0,6 -0,5 0,5 1,6 -0,5 0,5

15 -1,6 1,6 -0,5 -0,6 1,6 -0,5 -1,6 1,6 0,5 -0,6 1,6 0,5-1,6 0,6 -0,5 -0,6 0,6 -0,5 -1,6 0,6 0,5 -0,6 0,6 0,5

16 -0,5 1,6 -0,5 0,5 1,6 -0,5 -0,5 1,6 0,5 0,5 1,6 0,5-0,5 0,6 -0,5 0,5 0,6 -0,5 -0,5 0,6 0,5 0,5 0,6 0,5

17 0,6 1,6 -0,5 1,6 1,6 -0,5 0,6 1,6 0,5 1,6 1,6 0,50,6 0,6 -0,5 1,6 0,6 -0,5 0,6 0,6 0,5 1,6 0,6 0,5

18 -1,6 -0,6 0,6 -0,6 -0,6 0,6 -1,6 -0,6 1,6 -0,6 -0,6 1,6-1,6 -1,6 0,6 -0,6 -1,6 0,6 -1,6 -1,6 1,6 -0,6 -1,6 1,6

19 -0,5 -0,6 0,6 0,5 -0,6 0,6 -0,5 -0,6 1,6 0,5 -0,6 1,6-0,5 -1,6 0,6 0,5 -1,6 0,6 -0,5 -1,6 1,6 0,5 -1,6 1,6

20 0,6 -0,6 0,6 1,6 -0,6 0,6 0,6 -0,6 1,6 1,6 -0,6 1,60,6 -1,6 0,6 1,6 -1,6 0,6 0,6 -1,6 1,6 1,6 -1,6 1,6

21 -1,6 0,5 0,6 -0,6 0,5 0,6 -1,6 0,5 1,6 -0,6 0,5 1,6-1,6 -0,5 0,6 -0,6 -0,5 0,6 -1,6 -0,5 1,6 -0,6 -0,5 1,6

22 -0,5 0,5 0,6 0,5 0,5 0,6 -0,5 0,5 1,6 0,5 0,5 1,6-0,5 -0,5 0,6 0,5 -0,5 0,6 -0,5 -0,5 1,6 0,5 -0,5 1,6

23 0,6 0,5 0,6 1,6 0,5 0,6 0,6 0,5 1,6 1,6 0,5 1,60,6 -0,5 0,6 1,6 -0,5 0,6 0,6 -0,5 1,6 1,6 -0,5 1,6

24 -1,6 1,6 0,6 -0,6 1,6 0,6 -1,6 1,6 1,6 -0,6 1,6 1,6-1,6 0,6 0,6 -0,6 0,6 0,6 -1,6 0,6 1,6 -0,6 0,6 1,6

25 -0,5 1,6 0,6 0,5 1,6 0,6 -0,5 1,6 1,6 0,5 1,6 1,6-0,5 0,6 0,6 0,5 0,6 0,6 -0,5 0,6 1,6 0,5 0,6 1,6

26 0,6 1,6 0,6 1,6 1,6 0,6 0,6 1,6 1,6 1,6 1,6 1,60,6 0,6 0,6 1,6 0,6 0,6 0,6 0,6 1,6 1,6 0,6 1,6

left right

x y z x y z x y z x y z0 -1,6 -0,6 -1,6 -1,6 -0,6 -0,6 -0,6 -0,6 -1,6 -0,6 -0,6 -0,6

-1,6 -1,6 -1,6 -1,6 -1,6 -0,6 -0,6 -1,6 -1,6 -0,6 -1,6 -0,61 -0,5 -0,6 -1,6 -0,5 -0,6 -0,6 0,5 -0,6 -1,6 0,5 -0,6 -0,6

-0,5 -1,6 -1,6 -0,5 -1,6 -0,6 0,5 -1,6 -1,6 0,5 -1,6 -0,62 0,6 -0,6 -1,6 0,6 -0,6 -0,6 1,6 -0,6 -1,6 1,6 -0,6 -0,6

0,6 -1,6 -1,6 0,6 -1,6 -0,6 1,6 -1,6 -1,6 1,6 -1,6 -0,63 -1,6 0,5 -1,6 -1,6 0,5 -0,6 -0,6 0,5 -1,6 -0,6 0,5 -0,6

-1,6 -0,5 -1,6 -1,6 -0,5 -0,6 -0,6 -0,5 -1,6 -0,6 -0,5 -0,64 -0,5 0,5 -1,6 -0,5 0,5 -0,6 0,5 0,5 -1,6 0,5 0,5 -0,6

-0,5 -0,5 -1,6 -0,5 -0,5 -0,6 0,5 -0,5 -1,6 0,5 -0,5 -0,65 0,6 0,5 -1,6 0,6 0,5 -0,6 1,6 0,5 -1,6 1,6 0,5 -0,6

0,6 -0,5 -1,6 0,6 -0,5 -0,6 1,6 -0,5 -1,6 1,6 -0,5 -0,66 -1,6 1,6 -1,6 -1,6 1,6 -0,6 -0,6 1,6 -1,6 -0,6 1,6 -0,6

Grafika Komputer – Final Project – Rubik Kubus Hal. 32 dari 34 Halaman

Page 33: Laporan Akhir Fp Grafkom Rubik 31 Des 09

-1,6 0,6 -1,6 -1,6 0,6 -0,6 -0,6 0,6 -1,6 -0,6 0,6 -0,67 -0,5 1,6 -1,6 -0,5 1,6 -0,6 0,5 1,6 -1,6 0,5 1,6 -0,6

-0,5 0,6 -1,6 -0,5 0,6 -0,6 0,5 0,6 -1,6 0,5 0,6 -0,68 0,6 1,6 -1,6 0,6 1,6 -0,6 1,6 1,6 -1,6 1,6 1,6 -0,6

0,6 0,6 -1,6 0,6 0,6 -0,6 1,6 0,6 -1,6 1,6 0,6 -0,69 -1,6 -0,6 -0,5 -1,6 -0,6 0,5 -0,6 -0,6 -0,5 -0,6 -0,6 0,5

-1,6 -1,6 -0,5 -1,6 -1,6 0,5 -0,6 -1,6 -0,5 -0,6 -1,6 0,510 -0,5 -0,6 -0,5 -0,5 -0,6 0,5 0,5 -0,6 -0,5 0,5 -0,6 0,5

-0,5 -1,6 -0,5 -0,5 -1,6 0,5 0,5 -1,6 -0,5 0,5 -1,6 0,511 0,6 -0,6 -0,5 0,6 -0,6 0,5 1,6 -0,6 -0,5 1,6 -0,6 0,5

0,6 -1,6 -0,5 0,6 -1,6 0,5 1,6 -1,6 -0,5 1,6 -1,6 0,512 -1,6 0,5 -0,5 -1,6 0,5 0,5 -0,6 0,5 -0,5 -0,6 0,5 0,5

-1,6 -0,5 -0,5 -1,6 -0,5 0,5 -0,6 -0,5 -0,5 -0,6 -0,5 0,513 -0,5 0,5 -0,5 -0,5 0,5 0,5 0,5 0,5 -0,5 0,5 0,5 0,5

-0,5 -0,5 -0,5 -0,5 -0,5 0,5 0,5 -0,5 -0,5 0,5 -0,5 0,514 0,6 0,5 -0,5 0,6 0,5 0,5 1,6 0,5 -0,5 1,6 0,5 0,5

0,6 -0,5 -0,5 0,6 -0,5 0,5 1,6 -0,5 -0,5 1,6 -0,5 0,515 -1,6 1,6 -0,5 -1,6 1,6 0,5 -0,6 1,6 -0,5 -0,6 1,6 0,5

-1,6 0,6 -0,5 -1,6 0,6 0,5 -0,6 0,6 -0,5 -0,6 0,6 0,516 -0,5 1,6 -0,5 -0,5 1,6 0,5 0,5 1,6 -0,5 0,5 1,6 0,5

-0,5 0,6 -0,5 -0,5 0,6 0,5 0,5 0,6 -0,5 0,5 0,6 0,517 0,6 1,6 -0,5 0,6 1,6 0,5 1,6 1,6 -0,5 1,6 1,6 0,5

0,6 0,6 -0,5 0,6 0,6 0,5 1,6 0,6 -0,5 1,6 0,6 0,518 -1,6 -0,6 0,6 -1,6 -0,6 1,6 -0,6 -0,6 0,6 -0,6 -0,6 1,6

-1,6 -1,6 0,6 -1,6 -1,6 1,6 -0,6 -1,6 0,6 -0,6 -1,6 1,619 -0,5 -0,6 0,6 -0,5 -0,6 1,6 0,5 -0,6 0,6 0,5 -0,6 1,6

-0,5 -1,6 0,6 -0,5 -1,6 1,6 0,5 -1,6 0,6 0,5 -1,6 1,620 0,6 -0,6 0,6 0,6 -0,6 1,6 1,6 -0,6 0,6 1,6 -0,6 1,6

0,6 -1,6 0,6 0,6 -1,6 1,6 1,6 -1,6 0,6 1,6 -1,6 1,621 -1,6 0,5 0,6 -1,6 0,5 1,6 -0,6 0,5 0,6 -0,6 0,5 1,6

-1,6 -0,5 0,6 -1,6 -0,5 1,6 -0,6 -0,5 0,6 -0,6 -0,5 1,622 -0,5 0,5 0,6 -0,5 0,5 1,6 0,5 0,5 0,6 0,5 0,5 1,6

-0,5 -0,5 0,6 -0,5 -0,5 1,6 0,5 -0,5 0,6 0,5 -0,5 1,623 0,6 0,5 0,6 0,6 0,5 1,6 1,6 0,5 0,6 1,6 0,5 1,6

0,6 -0,5 0,6 0,6 -0,5 1,6 1,6 -0,5 0,6 1,6 -0,5 1,624 -1,6 1,6 0,6 -1,6 1,6 1,6 -0,6 1,6 0,6 -0,6 1,6 1,6

-1,6 0,6 0,6 -1,6 0,6 1,6 -0,6 0,6 0,6 -0,6 0,6 1,625 -0,5 1,6 0,6 -0,5 1,6 1,6 0,5 1,6 0,6 0,5 1,6 1,6

-0,5 0,6 0,6 -0,5 0,6 1,6 0,5 0,6 0,6 0,5 0,6 1,626 0,6 1,6 0,6 0,6 1,6 1,6 1,6 1,6 0,6 1,6 1,6 1,6

0,6 0,6 0,6 0,6 0,6 1,6 1,6 0,6 0,6 1,6 0,6 1,6

front backx y z x y z x y z x y z

0 -0,6 -1,6 -1,6 -0,6 -1,6 -0,6 -0,6 -0,6 -1,6 -0,6 -0,6 -0,6-1,6 -1,6 -1,6 -1,6 -1,6 -0,6 -1,6 -0,6 -1,6 -1,6 -0,6 -0,6

1 0,5 -1,6 -1,6 0,5 -1,6 -0,6 0,5 -0,6 -1,6 0,5 -0,6 -0,6-0,5 -1,6 -1,6 -0,5 -1,6 -0,6 -0,5 -0,6 -1,6 -0,5 -0,6 -0,6

2 1,6 -1,6 -1,6 1,6 -1,6 -0,6 1,6 -0,6 -1,6 1,6 -0,6 -0,60,6 -1,6 -1,6 0,6 -1,6 -0,6 0,6 -0,6 -1,6 0,6 -0,6 -0,6

3 -0,6 -0,5 -1,6 -0,6 -0,5 -0,6 -0,6 0,5 -1,6 -0,6 0,5 -0,6-1,6 -0,5 -1,6 -1,6 -0,5 -0,6 -1,6 0,5 -1,6 -1,6 0,5 -0,6

4 0,5 -0,5 -1,6 0,5 -0,5 -0,6 0,5 0,5 -1,6 0,5 0,5 -0,6-0,5 -0,5 -1,6 -0,5 -0,5 -0,6 -0,5 0,5 -1,6 -0,5 0,5 -0,6

5 1,6 -0,5 -1,6 1,6 -0,5 -0,6 1,6 0,5 -1,6 1,6 0,5 -0,60,6 -0,5 -1,6 0,6 -0,5 -0,6 0,6 0,5 -1,6 0,6 0,5 -0,6

6 -0,6 0,6 -1,6 -0,6 0,6 -0,6 -0,6 1,6 -1,6 -0,6 1,6 -0,6-1,6 0,6 -1,6 -1,6 0,6 -0,6 -1,6 1,6 -1,6 -1,6 1,6 -0,6

7 0,5 0,6 -1,6 0,5 0,6 -0,6 0,5 1,6 -1,6 0,5 1,6 -0,6-0,5 0,6 -1,6 -0,5 0,6 -0,6 -0,5 1,6 -1,6 -0,5 1,6 -0,6

Grafika Komputer – Final Project – Rubik Kubus Hal. 33 dari 34 Halaman

Page 34: Laporan Akhir Fp Grafkom Rubik 31 Des 09

8 1,6 0,6 -1,6 1,6 0,6 -0,6 1,6 1,6 -1,6 1,6 1,6 -0,60,6 0,6 -1,6 0,6 0,6 -0,6 0,6 1,6 -1,6 0,6 1,6 -0,6

9 -0,6 -1,6 -0,5 -0,6 -1,6 0,5 -0,6 -0,6 -0,5 -0,6 -0,6 0,5-1,6 -1,6 -0,5 -1,6 -1,6 0,5 -1,6 -0,6 -0,5 -1,6 -0,6 0,5

10 0,5 -1,6 -0,5 0,5 -1,6 0,5 0,5 -0,6 -0,5 0,5 -0,6 0,5-0,5 -1,6 -0,5 -0,5 -1,6 0,5 -0,5 -0,6 -0,5 -0,5 -0,6 0,5

11 1,6 -1,6 -0,5 1,6 -1,6 0,5 1,6 -0,6 -0,5 1,6 -0,6 0,50,6 -1,6 -0,5 0,6 -1,6 0,5 0,6 -0,6 -0,5 0,6 -0,6 0,5

12 -0,6 -0,5 -0,5 -0,6 -0,5 0,5 -0,6 0,5 -0,5 -0,6 0,5 0,5-1,6 -0,5 -0,5 -1,6 -0,5 0,5 -1,6 0,5 -0,5 -1,6 0,5 0,5

13 0,5 -0,5 -0,5 0,5 -0,5 0,5 0,5 0,5 -0,5 0,5 0,5 0,5-0,5 -0,5 -0,5 -0,5 -0,5 0,5 -0,5 0,5 -0,5 -0,5 0,5 0,5

14 1,6 -0,5 -0,5 1,6 -0,5 0,5 1,6 0,5 -0,5 1,6 0,5 0,50,6 -0,5 -0,5 0,6 -0,5 0,5 0,6 0,5 -0,5 0,6 0,5 0,5

15 -0,6 0,6 -0,5 -0,6 0,6 0,5 -0,6 1,6 -0,5 -0,6 1,6 0,5-1,6 0,6 -0,5 -1,6 0,6 0,5 -1,6 1,6 -0,5 -1,6 1,6 0,5

16 0,5 0,6 -0,5 0,5 0,6 0,5 0,5 1,6 -0,5 0,5 1,6 0,5-0,5 0,6 -0,5 -0,5 0,6 0,5 -0,5 1,6 -0,5 -0,5 1,6 0,5

17 1,6 0,6 -0,5 1,6 0,6 0,5 1,6 1,6 -0,5 1,6 1,6 0,50,6 0,6 -0,5 0,6 0,6 0,5 0,6 1,6 -0,5 0,6 1,6 0,5

18 -0,6 -1,6 0,6 -0,6 -1,6 1,6 -0,6 -0,6 0,6 -0,6 -0,6 1,6-1,6 -1,6 0,6 -1,6 -1,6 1,6 -1,6 -0,6 0,6 -1,6 -0,6 1,6

19 0,5 -1,6 0,6 0,5 -1,6 1,6 0,5 -0,6 0,6 0,5 -0,6 1,6-0,5 -1,6 0,6 -0,5 -1,6 1,6 -0,5 -0,6 0,6 -0,5 -0,6 1,6

20 1,6 -1,6 0,6 1,6 -1,6 1,6 1,6 -0,6 0,6 1,6 -0,6 1,60,6 -1,6 0,6 0,6 -1,6 1,6 0,6 -0,6 0,6 0,6 -0,6 1,6

21 -0,6 -0,5 0,6 -0,6 -0,5 1,6 -0,6 0,5 0,6 -0,6 0,5 1,6-1,6 -0,5 0,6 -1,6 -0,5 1,6 -1,6 0,5 0,6 -1,6 0,5 1,6

22 0,5 -0,5 0,6 0,5 -0,5 1,6 0,5 0,5 0,6 0,5 0,5 1,6-0,5 -0,5 0,6 -0,5 -0,5 1,6 -0,5 0,5 0,6 -0,5 0,5 1,6

23 1,6 -0,5 0,6 1,6 -0,5 1,6 1,6 0,5 0,6 1,6 0,5 1,60,6 -0,5 0,6 0,6 -0,5 1,6 0,6 0,5 0,6 0,6 0,5 1,6

24 -0,6 0,6 0,6 -0,6 0,6 1,6 -0,6 1,6 0,6 -0,6 1,6 1,6-1,6 0,6 0,6 -1,6 0,6 1,6 -1,6 1,6 0,6 -1,6 1,6 1,6

25 0,5 0,6 0,6 0,5 0,6 1,6 0,5 1,6 0,6 0,5 1,6 1,6-0,5 0,6 0,6 -0,5 0,6 1,6 -0,5 1,6 0,6 -0,5 1,6 1,6

26 1,6 0,6 0,6 1,6 0,6 1,6 1,6 1,6 0,6 1,6 1,6 1,60,6 0,6 0,6 0,6 0,6 1,6 0,6 1,6 0,6 0,6 1,6 1,6

Grafika Komputer – Final Project – Rubik Kubus Hal. 34 dari 34 Halaman