Implementasi Implementasi aplikasi grafika komputer untuk transformasi 3 dimensi

4.1.3. Implementasi Vektor

Transformasi membutuhkan operasi vektor. Operasi vektor yang digunakan pada aplikasi ini, yaitu: 1.) Mengubah koordinat 3 dimensi menjadi vektor 3 dimensi. Operasi ini dinyatakan dalam bentuk fungsi buatVektor .

function BuatVektor(x,y,z:real):Ttitik3d; var va:Ttitik3d; begin

va.posX:=x; va.posY:=y; va.posZ:=z; result:=va;

end;

2.) Menghitung panjang vektor. Operasi ini dinyatakan dalam bentuk fungsi PanjangVektor .

function PanjangVektor(va:Ttitik3d):real; begin

Result:=abs(sqrt(va.posx*va.posx+va.posy*va.posy+ va.posz*va.posz));

end;

3.) Normalisasi vektor. Operasi ini dinyatakan dalam bentuk fungsi Normalisasi .

function Normalisasi(va:Ttitik3d):Ttitik3d; var l:real; v:Ttitik3d; begin

l:=PanjangVektor(va); if l=0 then exit else begin

v.posx:=va.posx/l; v.posy:=va.posy/l; v.posz:=va.posz/l; result:=v;

end; end;

4.) Operasi dot product. Operasi ini dinyatakan dalam bentuk fungsi DotProduct .

function DotProduct(va,vb:Ttitik3d):real; var s:real; begin

s:=va.posx*vb.posx+va.posy*vb.posy+va.posz*vb.posz; result:=s;

end;

5.) Operasi cross product. Operasi ini dinyatakan dalam bentuk fungsi CrossProduct .

function CrossProduct(va,vb:Ttitik3d):Ttitik3d; var vs:Ttitik3d; begin

vs.posx:=(va.posy*vb.posz)-(va.posz*vb.posy); vs.posy:=(va.posz*vb.posx)-(va.posx*vb.posz); vs.posz:=(va.posx*vb.posy)-(va.posy*vb.posx); result:=vs;

end;

4.1.4. Implementasi Transformasi

Dalam mengimplementasikan transformasi diperlukan beberapa operasi seperti perkalian matriks, mengidentitaskan matriks, translasi, penskalaan, rotasi, dan shearing. Operasi-operasi tersebut dibuat dalam bentuk prosedur-prosedur seperti berikut.

a. Perkalian Matriks

Perkalian matriks dibutukan untuk melakukan transformasi geometri. Misalnya mengalikan matriks translasi dengan matriks penskalaan untuk transformasi berturut-turut. Operasi perkalian matriks dinyatakan dalam bentuk prosedur PerkalianMatriks .

procedure TTransformasi.PerkalianMatriks(Matriks1,Matriks2: Matriks4x4;var Matriks3:Matriks4x4); var

baris,kolom:byte; matriksTemp:Matriks4x4;

begin for baris:=0 to 3 do begin

for kolom:=0 to 3 do begin

matriksTemp[baris,kolom]:=Matriks1[baris,0]*Matriks2 [0,kolom]+ Matriks1[baris,1]*Matriks2[1,kolom]+

Matriks1[baris,2]*Matriks2[2,kolom]+ Matriks1[baris,3]*Matriks2[3,kolom];

end; end; for baris:=0 to 3 do

for kolom:=0 to 3 do Matriks3[baris,kolom]:=matriksTemp[baris,kolom]; end;

b. Mantriks Identitas

Matriks identitas digunakan untuk menolkan suatu matriks transformasi. Operasi MatriksIdentitas dinyatakan dalam bentuk prosedur MatriksIdentitas .

procedure TTransformasi.MatriksIdentitas(var m:Matriks4x4); procedure TTransformasi.MatriksIdentitas(var m:Matriks4x4);

end;

c. Translasi

Persamaan tranasformasi translasi yang terdapat pada persamaan 2.3 dan 2.4 dibuat ke dalam bentuk prosedur translasi di bawah ini. Prosedur ini digunakan untuk mentranslasikan suatu titik sebesar parameter x , y , dan z -nya.

procedure TTransformasi.Translasi(x,y,z:real); var matriksTranslasi:Matriks4x4; begin

MatriksIdentitas(MatriksTranslasi); MAtriksTranslasi[3,0]:=x; MAtriksTranslasi[3,1]:=y; MAtriksTranslasi[3,2]:=z; PerkalianMatriks(MAtriks,MAtriksTranslasi,MAtriks);

end;

d. Penskalaan

Persamaan transformasi penskalaan yang terdapat pada persamaan 2.5 dan

2.6 dibuat ke dalam bentuk prosedur penskalaan di bawah ini. Prosedur ini digunakan untuk menskalakan suatu titik sebesar parameter sx, sy , dan sz dengan titik acuan xc , xy , dan xz .

procedure TTransformasi.Penskalaan(sx,sy,sz,xc,yc,zc:real); var matriksPenskalaan:Matriks4x4; begin

MatriksIdentitas(matriksPenskalaan); Translasi(-xc,-yc,-zc); matriksPenskalaan[0,0]:=sx; matriksPenskalaan[1,1]:=sy; matriksPenskalaan[2,2]:=sz; PerkalianMatriks(Matriks,matriksPenskalaan,Matriks); Translasi(xc,yc,zc);

end; end;

Persamaan transformasi rotasi yang terdapat pada persamaan 2.6, 2.7, dan 2.8 serta pemahaman tentang subbab 2.1.6 maka dapat dibuat prosedur rotasi di bawah ini. Prosedur ini digunakan untuk merotasikan suatu titik sebesar parameter sudut dengan sumbu xr , yr , dan zr .

procedure TTransformasi.Rotasi(sudut:real;xr,yr,zr:real); var

alpha,betha,radian:real; ryb,rza,ryb_1,rza_1,ry:Matriks4x4; u,u1,u2,s:Ttitik3d;

begin MatriksIdentitas(ryb); MatriksIdentitas(rza); MatriksIdentitas(ry); MatriksIdentitas(ryb_1); MatriksIdentitas(rza_1); MatriksIdentitas(Matriks);

radian:=sudut*PI/180;

u1:=Normalisasi(BuatVektor(1,0,0)); u2:=Normalisasi(buatVektor(0,1,0)); s :=Normalisasi(BuatVektor(xr,yr,zr)); u :=BuatVektor(xr,0,zr); if PanjangVektor(u)=0 then betha:=0

//Sumbu putar berhimpit dengan sumbu Y else begin u:=normalisasi(u); betha:=arcCos(DotProduct(u1,u)); if u.posZ<0 then betha:=-betha;

end;

alpha:=arcCos(DotProduct(u2,s));

ryb[0,0]:=cos(betha);ryb[0,2]:=-sin(betha); ryb[2,0]:=sin(betha);ryb[2,2]:=cos(betha); //Ry(-betha) ryb[0,0]:=cos(betha);ryb[0,2]:=-sin(betha); ryb[2,0]:=sin(betha);ryb[2,2]:=cos(betha); //Ry(-betha)

rza[0,0]:=cos(alpha);rza[0,1]:=sin(alpha); rza[1,0]:=-sin(alpha);rza[1,1]:=cos(alpha); //Ry(-betha)*Rz(-alpha) PerkalianMatriks(MAtriks,rza,Matriks);

ry[0,0]:=cos(radian);ry[0,2]:=-sin(radian); ry[2,0]:=sin(radian);ry[2,2]:=cos(radian); //Ry(Degree) PerkalianMatriks(Matriks,ry,Matriks);

rza_1[0,0]:=cos(-alpha);rza_1[0,1]:=sin(-alpha); rza_1[1,0]:=-sin(-alpha);rza_1[1,1]:=cos(-alpha); //Rz(degree) PerkalianMAtriks(Matriks,rza_1,MAtriks);

ryb_1[0,0]:=cos(-betha);ryb_1[0,2]:=-sin(-betha); ryb_1[2,0]:=sin(-betha);ryb_1[2,2]:=cos(-betha); //Ry(betha) PerkalianMatriks(Matriks,ryb_1,MAtriks);

end;

f. Shearing

Persamaan transformasi shearing yang terdapat pada persamaan 2.9,

2.10, dan 2.11 dibuat ke dalam bentuk prosedur shearing di bawah ini. Prosedur ini digunakan untuk melakukan shearing pada suatu titik dengan sumbu sumbu , nilai referensi ref , dan nilai shearing shear .

Procedure TTransformasi.Shearing(sumbu:integer;ref,shear1,shear2:real ); var matriksShearing:Matriks4x4; begin

MatriksIdentitas(matriksShearing); if sumbu=1 then

begin matriksShearing[3,1]:=-shear1*ref; matriksShearing[3,2]:=-shear2*ref; begin matriksShearing[3,1]:=-shear1*ref; matriksShearing[3,2]:=-shear2*ref;

end; if sumbu=2 then begin

matriksShearing[3,0]:=-shear1*ref; matriksShearing[3,2]:=-shear2*ref; matriksShearing[1,0]:=shear1; matriksShearing[1,2]:=shear2;

end; if sumbu=3 then begin

matriksShearing[3,0]:=-shear1*ref; matriksShearing[3,1]:=-shear2*ref; matriksShearing[2,0]:=shear1; matriksShearing[2,1]:=shear2;

end; PerkalianMatriks(Matriks,matriksShearing,Matriks);

end;

g. Matriks Transformasi

Operasi matriks transformasi digunakan untuk mengalikan suatu titik 3 dimensi dengan matriks transformasi sehingga diperoleh titik hasil transformasinya. Operasi ini dinyatakan dalam bentuk prosedur Transform .

procedure TTransformasi.Transform(P:Ttitik3d; var Q:Ttitik3d); begin

Q.posX:=P.posX*Matriks[0,0]+P.posY*Matriks[1,0]+ P.posZ*MAtriks[2,0]+1*Matriks[3,0]; Q.posY:=P.posX*Matriks[0,1]+P.posY*Matriks[1,1]+ P.posZ*MAtriks[2,1]+1*Matriks[3,1]; Q.posZ:=P.posX*Matriks[0,2]+P.posY*Matriks[1,2]+ P.posZ*MAtriks[2,2]+1*Matriks[3,2];

end;

4.1.5. Implementasi Transformasi Menggunakan Mouse

Konversi koordinat 2 dimensi layar ke koordinat 3 dimensi OpenGL dilakukan oleh kelas Ttransformasi melalui prosedur ambilPos3d(X,Y:integer; Konversi koordinat 2 dimensi layar ke koordinat 3 dimensi OpenGL dilakukan oleh kelas Ttransformasi melalui prosedur ambilPos3d(X,Y:integer;

Procedure TTransformasi.ambilPos3d(X,Y:integer; var titik:TArTitik3D); var viewport : array[1..4] of Integer;

modelview: array[1..16] of Double; proyeksi : array[1..16] of Double; winZ : Single;

begin glGetDoublev(GL_MODELVIEW_MATRIX, @modelview); glGetDoublev(GL_PROJECTION_MATRIX,@proyeksi); glGetIntegerv(GL_VIEWPORT,@viewport); if Y=0 then Y:=1; glReadPixels(X,-Y,1,1,GL_DEPTH_COMPONENT,GL_FLOAT,@winZ); gluUnProject(X,viewport[4]Y,winZ,@modelview, @proyeksi,@viewport,titik[1],titik[2],titik[3]);

end;

Nilai koordinat yang diperoleh pada variabel titik akan digunakan untuk transformasi 3 dimensi menggunakan mouse.

Transformasi dengan mouse dilakukan dengan menggunakan 3 prosedur dari kelas Tform, yaitu Panel1MouseDown, Panel1MouseMove, dan Panel1MouseUp. Pada prosedur Panel1MouseDown, membuat variabel mouse Turun menjadi true agar transformasi pada prosedur Panel1MouseMode dapat dilakukan. Pada saat mouse bergerak, koordinat 2 dimensi layar dan 3 dimensi OpenGL diambil dengan perintah berikut:

Transform.ambilPos3d(X,Y,titikPro3D); dx:=titikPro3D[1]-awalX; dy:=titikPro3D[2]-awalY; dz:=titikPro3D[3]-awalZ; deltaX:=X-X2; deltaY:=Y-Y2;

Variabel X dan Y di atas diambil dari prosedur TFormUtama.Panel1MouseMove (Sender: TObject; Shift: TShiftState;X, Y: Integer) . Selanjutnya prosedur akan melakukan transformasi. Kode program untuk melakukan transformasi dapat dilihat pada lampiran A. Pada akhir prosedur ini dilakukan memberikan nilai posisi mouse sekarang ke poisisi mouse awal.

X2:=X; Y2:=Y; X2:=X; Y2:=Y;

Pada prosedur Panel1MouseUp variabel mouseTurun dibuat menjadi false agar transformasi menggunakan mouse menjadi tidak aktif.

4.1.6. Implementasi Benda Rumit

Aplikasi ini juga dapat menampilkan objek rumit, yaitu dengan memuat berkas berektensi obj dan menampilkan objeknya pada layar. Untuk memuat berkas berkestensi obj, penulis menggunakan berkas kode program yang dibuat

oleh Jan Horn [7] . Penggunaannya cukup dengan menambahkan klausa OBJLoader pada bagian uses (berkas OBJLoader ada pada direktori yang sama dengan

aplikasi). Berkas ini berfungsi seperti kodek yang membaca isi berkas obj dan menterjemahkannya ke OpenGL.

Dalam mengimplementasikan Obj Loader, penyusun membuat kelas baru yang merupakan turunan dari kelas Tgeometri. Kodenya dapat dilihat seperti di bawah ini:

TOBJLoader = class(Tgeometri) private

titikMin,titikMax:Ttitik3d; procedure hitungMinMax(i:integer); procedure gambarKotak;

public m:Tmodel; berkas:string; constructor create(fileObj:string); procedure Gambar;override;

end;

Pada saat objek dari kelas TOBJLoader diciptakan melalui konstruktor, berkas dimuat dengan perintah m:=LoadModel(berkas) . Objek tersebut di

simpan ke variabel m.

Constructor TOBJLoader.create(fileObj:string); var i:integer; begin

berkas:=fileObj; m:=LoadModel(berkas);

... End;

Untuk memgambar objek yang terdapat pada variabel m cukup dengan menggunakan perintah DrawModel(m) yang terdapat pada prosedur TOBJLoader.Gambar.

procedure TOBJLoader.Gambar; var i:integer; begin ...

DrawModel(m); ... end;

Semua fungsi-fungsi di atas dilakukan pada saat tombol gambar (sButton4) pada tab OBJ Loader ditekan. Kodenya seperti di bawah ini:

procedure TFormUtama.sButton4Click(Sender: TObject); Var ObjekBaru:Tgeometri;

begin if sOpenDialog1.execute then begin

ObjekBaru:=nil; ObjekBaru:=TOBJLoader.create(sOpenDialog1.FileName); DaftarGeometri.TambahGeometri(ObjekBaru);

end; end;

Hasil dari implentasi obj loader dapat dilihat pada gambar 4.10.

Gambar 4.10a Objek mobil dan bola menggunakan obj loader pada posisi awal.

Gambar 4.10b Objek mobil dan bola menggunakan obj loader pada posisi setelah rotasi (-30 o , 0, 1, 0).

Objek bola dan mobil dimuat menggunakan obj loader (gambar 4.10a). Objek bola dan mobil masing-masing terdiri dari 1761 dan 233 verteks, jauh lebih banyak dibandingkan kubus yang hanya memiliki 9 verteks. Keduanya kemudian di rotasi sebesar -30 o dengan sumbu putar Y dan hasilnya dapat dilihat pada gambar 4.10b.

4.2. Pengujian Validasi Fungsi Transformasi Aplikasi Pada subbab ini, transformasi-transformasi 3D pada aplikasi diuji. Pengujian dilakukan dengan membandingkan hasil transformasi aplikasi dengan hasil transformasi menggunakan perhitungan. Pengujian dilakukan pada objek geometri piramida yang memiliki 7 titik. Gambar 4.11 menunjukkan posisi awal piramida ketika dibuat pada aplikasi.

Gambar 4.11 Posisi awal piramida pada layar aplikasi.

Titik-titik penyusun piramida kemudian dibuat dalam bentuk tabel 4.1.

Tabel 4.1 Koordinat awal titik-titik piramida.

Titik Koordinat Awal

2 -0,50 -0,50 0,50

3 0,50 -0,50 0,50

4 0,50 -0,50 -0,50

5 -0,50 -0,50 -0,50

6 -0,50 -0,50 0,50

4.2.1. Pengujian Transformasi Translasi

Keadaan awal piramida seperti yang ditunjukkan pada gambar 4.12 dan tabel 4.1 akan ditranslasikan dengan t x =1, t y =1, dan t z =-1 (gambar4.11).

Gambar 4.11 Form untuk memasukkan nilai translasi.

Hasil yang diperoleh pada layar aplikasi seperti gambar 4.13 dengan koordinat baru pada tabel 4.2.

(a)

(b)

Gambar 4.13 Piramida: (a) sebelum translasi (1, 1, -1); (b) sesudah translasi (1, 1, -1).

a. Contoh Perhitungan Sebagai contoh perhitungan digunakan titik 2 pada piramida. Titik 2 memiliki koordinat awal (-0,50, -0,50, 0,50) ditranslasikan sebesar (1,00 1,00 - 1,00). Dengan menggunakan persamaan 2.3, 2.4, dan 2.5 maka:

x ' y ' z ' 1 ][ = x y z 1 ] ⋅

x ' y ' z ' 1 ][ = − 0 , 5 − 0 , 5 0 , 5 1 

[ x ' y ' z ' 1 ][ = − 0 , 5 + 1 − 0 , 5 + 1 0 , 5 + ( − 1 ) 1 ] [ x ' y ' z ' 1 ][ = 0 , 5 0 , 5 − 0 , 5 1 ]

Dengan cara perhitungan yang sama, untuk titik-titik piramida yang lain, titik-titik hasil translasinya dapat dilihat pada tabel 4.3.

b. Perbandingan antara hasil perhitungan dan hasil aplikasi Perbandingan antara hasil perhitungan dan hasil aplikasi dapat dilihat pada tabel 4.2. Hasil yang ditunjukkan aplikasi sama dengan hasil perhitungan. Ini menandakan aplikasi dapat melakukan translasi dengan tepat.

Tabel 4.2. Perbandingan antara hasil perhitungan dan hasil aplikasi untuk translasi (1,00, 1,00, -1,00);

Hasil Transformasi Titik

Koordinat

Awal

Aplikasi

Perhitungan

1,00 1,00 -1,00 1,00 1,00 -1,00

1,00 1,50 -1,00 1,00 1,50 -1,00

2 -0,50 -0,50 0,50 0,50 0,50 -0,50 0,50 0,50 -0,50

3 0,50 -0,50 0,50 1,50 0,50 -0,50 1,50 0,50 -0,50

4 0,50 -0,50 -0,50 1,50 0,50 -1,50 1,50 0,50 -1,50

5 -0,50 -0,50 -0,50 0,50 0,50 -1,50 0,50 0,50 -1,50

6 -0,50 -0,50 0,50 0,50 0,50 -0,50 0,50 0,50 -0,50

4.2.2. Pengujian Transformasi Penskalaan

Keadaan awal piramida seperti yang ditunjukkan pada gambar 4.11 dan Keadaan awal piramida seperti yang ditunjukkan pada gambar 4.11 dan

Gambar 4.15 Form untuk memasukkan nilai penskalaan.

Hasil yang diperoleh pada layar aplikasi seperti gambar 4.16 dengan koordinat baru pada tabel 4.3.

(a)

(b)

Gambar 4.16 Piramida: (a) sebelum penskalaan (2, 2, 2); (b) sesudah penskalaan (2, 2, 2).

a. Contoh Perhitungan Sebagai contoh perhitungan digunakan titik 2 pada piramida. Titik 2 memiliki koordinat awal (-0,50, -0,50, 0,50) diskalakan sebesar (2,00, 2,00, 2,00). Dengan menggunakan persamaan 2.8 maka:

 0 s y 0 [ 0 x ' y ' z ' 1 ][ = x y z 1 ]  ⋅

 0 2 0 [ 0 x ' y ' z ' 1 ][ = − , 5 − 0 , 5 0 , 5 1 ]  ⋅

[ x ' y ' z ' 1 ][ = − 0 , 5 ⋅ 2 − 0 , 5 ⋅ 2 0 , 5 ⋅ 2 1 ]

[ x ' y ' z ' 1 ][ = − 1 − 1 1 1 ]

Dengan cara perhitungan yang sama, untuk titik-titik piramida yang lain, titik-titik hasil penskalaannya dapat dilihat pada tabel 4.3.

b. Perbandingan antara hasil perhitungan dan hasil aplikasi Perbandingan antara hasil perhitungan dan hasil aplikasi dapat dilihat pada tabel 4.3. Hasil yang ditunjukkan aplikasi sama dengan hasil perhitungan. Ini menandakan aplikasi dapat melakukan penskalaan dengan tepat.

Tabel 4.3. Perbandingan antara hasil perhitungan dan hasil aplikasi untuk transformasi penskalaan (2,00 2,00 2,00);

Hasil Transformasi Titik

Koordinat

Awal

Aplikasi

Perhitungan

2 -0,50 -0,50 0,50 -1,00 -1,00 1,00 -1,00 -1,00 1,00

3 0,50 -0,50 0,50

1,00 -1,00 1,00

1,00 -1,00 1,00

4 0,50 -0,50 -0,50 1,00 -1,00 -1,00 1,00 -1,00 -1,00

5 -0,50 -0,50 -0,50 -1,00 -1,00 -1,00 -1,00 -1,00 -1,00

6 -0,50 -0,50 0,50 -1,00 -1,00 1,00 -1,00 -1,00 1,00

4.2.3. Pengujian Transformasi Rotasi

Keadaan awal piramida seperti yang ditunjukkan pada gambar 4.11 dan tabel 4.1 akan dirotasikan dengan sudut putar sebesar 30 o dan sumbu putar r y =1 (gambar 4.17).

Gambar 4.17 Form untuk memasukkan nilai rotasi.

Hasil yang diperoleh pada layar aplikasi seperti gambar 4.18 dengan koordinat baru pada tabel 4.4.

(a)

(b)

Gambar 4.18 Piramida: (a) sebelum rotasi (30 o , 0,00, 1,00, 0,00); (b) sesudah rotasi (30 o , 0,00, 1,00m 0,00).

a. Contoh Perhitungan Sebagai contoh perhitungan digunakan titik 2 pada piramida. Titik 2 memiliki koordinat awal (-0,50, -0,50, 0,50) dirotasikan dengan sudut 30 o dan sumbu r y =1. Dengan menggunakan persamaan 2.11, maka yang pertama dilakukan adalah menghitung panjang vektor koordinat awal.

Langkah kedua adalah vektor s diubah menjadi unit vektor dengan membagi vektor dengan panjang absolut vektor.

Langkah ketiga adalah mencari besar sudut alpha ( α ) yang dibentuk oleh vektor s Langkah ketiga adalah mencari besar sudut alpha ( α ) yang dibentuk oleh vektor s

α = arccos( u 2 • s )

α = arccos ( ( 0 1 0 )( • 0 1 0 ) )

α = arccos( 1 )

Langkah keempat adalah mencari besar sudut betha (β) yang dibentuk oleh vektor u (x, 0, z) dan u 1 (vektor searah sumbu x positif).

β = arccos( u 1 • u )

β = arccos ( ( 1 0 0 )( • ~ ~ ~ ) )

β = arccos(~) Karena vektor u bernilai 0 maka sudut β yang dibentuk oleh vektor u dan u 1 bernilai 0 o . Langkah kelima adalah memutar titik pada sumbu Y sehingga terletak di bidang XY.

 Cos ( β ) 0 − Sin ( β ) 0 

x ' y ' z ' 1 ][ = x y z 1  ]  ⋅

 Sin ( β ) 0 Cos ( β ) 0 

0 Cos 0 ( 0 ) 0 − Sin ( 0 ) 0 

x ' y ' z ' 1 ][ = − 0 , 5 − 0 , 5 0 , 5 1 ] ⋅

0 0  Sin ( 0 ) 0 Cos ( 0 ) 0  0 0  Sin ( 0 ) 0 Cos ( 0 ) 0 

[ x ' y ' z ' 1 ][ = − 0 , 5 − 0 , 5 0 , 5 1 ]

Langkah keenam adalah memutar titik pada sumbu z sehingga terletak di bidang di sumbu y.

 Cos ( α ) Sin ( α ) 0 0 

 − Sin ( α ) Cos ( α ) 0 [ 0 x ' y ' z ' 1 ][ = x y z 1 ⋅ ] 

0 Cos 0 ( 0 ) Sin ( 0 ) 0 0 

− Sin ( 0 ) Cos ( 0 ) 0 [ 0

x ' y ' z ' 1 ][ = − 0 , 5 − 0 , 5 0 , 5 1 

x ' y ' z ' 1 ][ = − 0 , 5 − 0 , 5 0 , 5 1 

[ x ' y ' z ' 1 ][ = − 0 , 5 − 0 , 5 0 , 5 1 ]

Langkah keenam adalah memutar titik pada sumbu z sebesar sudut yang ditentukan untuk transformasi rotasi.

 Cos ( θ ) 0 − Sin ( θ ) 0 

][  = x y z 1 ] ⋅

 Sin ( θ ) 0 Cos ( θ ) 0 

0 Cos 0 ( 30 ) 0 − Sin ( 30 ) 0 

0 1 0 [ 0 x ' y ' z ' 1 ][  = 0 , 5 −  − 0 , 5 0 , 5 1 ] ⋅

0 Sin 0 ( 30 ) 0 Cos ( 30 ) 0 

x ' y ' z ' 1 ][ = − 0 , 5 0 , 5 0 , 5 1 

[ x ' y ' z ' 1 ][ = 0 , 183 − 0 , 5 0 , 683 1 ]

Langkah ketujuh adalah memutar balik titik sebesar –α pada sumbu Z.  Cos ( − α ) Sin ( − α ) 0 0 

 − Sin ( − α ) Cos ( − α ) 0 x 0 ' y ' z ' 1 = x y z 1 ⋅ [  ][ ]

0 Cos 0 ( − 0 ) Sin ( − 0 ) 0 0 

− Sin ( − 0 ) Cos ( − 0 ) 0 [ 0

x ' y ' z ' 1 ][ = − 0 , 183 − 0 , 5 0 , 683 1 

x ' y ' z ' 1 ][ = − 0 , 183 − 0 , 5 0 , 683 1 

[ x ' y ' z ' 1 ][ = − 0 , 183 − 0 , 5 0 , 683 1 ]

Langkah kedelapan adalah memutar balik titik sebesar – β pada sumbu Y.  Cos ( − β ) 0 − Sin ( − β ) 0 

x ' y ' z ' 1 ][ = x y z 1  ]  ⋅

 Sin ( − β ) 0 Cos ( − β ) 0 

0 Cos 0 ( − 0 ) 0 − Sin ( − 0 ) 0 

x ' y ' z ' 1 ][ = − 0 , 183 − 0 , 5 0 , 683 1 ] ⋅

0 Sin 0 ( − 0 ) 0 Cos ( − 0 ) 0 

 0 1 0 [ 0 x ' y ' z ' 1 ][ = − 0 , 183 − 0 , 5 0 , 683 1 ]  ⋅

[ x ' y ' z ' 1 ][ = − 0 , 183 − 0 , 5 0 , 683 1 ]

Dengan cara perhitungan yang sama, untuk titik-titik piramida yang lain, titik-titik hasil penskalaannya dapat dilihat pada tabel 4.4.

b. Perbandingan antara hasil perhitungan dan hasil aplikasi Perbandingan antara hasil perhitungan dan hasil aplikasi dapat dilihat pada tabel 4.4. Hasil yang ditunjukkan aplikasi sama dengan hasil perhitungan. Ini menunjukkan aplikasi dapat melakukan rotasi dengan tepat.

Tabel 4.4. Perbandingan antara hasil perhitungan dan hasil aplikasi untuk transformasi rotasi (30 o 0,00 1,00 0,00).

Hasil Transformasi Titik

Koordinat

Awal

Aplikasi

Perhitungan

2 -0,50 -0,50 0,50 -0,18 -0,50 0,68 -0,18 -0,50 0,68

3 0,50 -0,50 0,50

0,68 -0,50 0,18

0,68 -0,50 0,18

4 0,50 -0,50 -0,50 0,18 -0,50 -0,68 0,18 -0,50 -0,68

5 -0,50 -0,50 -0,50 -0,68 -0,50 -0,18 -0,68 -0,50 -0,18

6 -0,50 -0,50 0,50 -0,18 -0,50 0,68 -0,18 -0,50 0,68

4.2.4. Pengujian Transformasi Shearing

Keadaan awal piramida seperti yang ditunjukkan pada gambar 4.11 dan tabel 4.1 akan dilakukan shearing dengan sumbu X, faktor shearing 1,00, dan titik referensi di X=1,00. (gambar 4.19).

Gambar 4.19 Form untuk memasukkan nilai shearing.

Hasil yang diperoleh pada layar aplikasi seperti gambar 4.20 dengan koordinat baru pada tabel 4.5.

(a)

(b)

Gambar 4.20 Piramida: (a) sebelum shearing (X 1,00 1,00); (b) sesudah shearing (X 1,00 1,00).

a. Contoh Perhitungan Sebagai contoh perhitungan digunakan titik 2 pada piramida. Titik 2 memiliki koordinat awal (-0,50 -0,50 0,50) dilakukan shearing dengan (X 1,00 1,00). Karena menggunakan sumbu X sebagai sumbu shearing maka persamaan yang digunakan adalah persamaan 2.15 (untuk sumbu lain persamaan yang digunakan menyesuaikan). Dengan demikian:

 1 Sh xy

Sh xz

x ' y ' z ' 1 ][ = x y z 1 ] ⋅

   0 − Sh xy ⋅ X ref − Sh xz ⋅ X ref 1  

 0 1 0 0 [  x ' y ' z ' 1 ][ = − 0 , 5 − 0 , 5 0 , 5 1 ] ⋅

[ x ' y ' z ' 1 ][ = − 0 , 5 − 2 , 0 − 1 , 0 1 ]

Dengan cara perhitungan yang sama, untuk titik-titik piramida yang lain, titik-titik hasil shearing-nya dapat dilihat pada tabel 4.5.

b. Perbandingan antara hasil perhitungan dan hasil aplikasi Perbandingan antara hasil perhitungan dan hasil aplikasi dapat dilihat pada tabel 4.5. Hasil yang ditunjukkan aplikasi sama dengan hasil perhitungan. Ini menandakan aplikasi dapat melakukan shearing dengan tepat.

Tabel 4.5 Perbandingan antara hasil perhitungan dan hasil aplikasi untuk transformasi shearing (X 1,00 1,00).

Koordinat Hasil Transformasi Titik

Awal

Aplikasi

Perhitungan

0 0,00 0,00 0,00 0,00 -1,00 -1,00 0,00 -1,00 -1,00

1 0,00 0,50 0,00 0,00 -0,50 -1,00 0,00 -0,50 -1,00

2 -0,50 -0,50 0,50 -0,50 -2,00 -1,00 -0,50 -2,00 -1,00

3 0,50 -0,50 0,50 0,50 -1,00 0,00 0,50 -1,00 0,00

4 0,50 -0,50 -0,50 0,50 -1,00 -1,00 0,50 -1,00 -1,00

5 -0,50 -0,50 -0,50 -0,50 -2,00 -2,00 -0,50 -2,00 -2,00

6 -0,50 -0,50 0,50 -0,50 -2,00 -2,00 -0,50 -2,00 -2,00

Dari semua pengujian yang dilakukan, hasil pengujian aplikasi dan perhitungan menunjukkan kesamaan. Jika hanya dari hasil tersebut, dapat dikatakan bahwa aplikasi dapat menjalankan fungsi-fungsi transformasi dengan tepat.