Anda di halaman 1dari 9

Bab 5.

Algoritma

Visualisasi 3D-Statis

Grafis 3D statis adalah tampilan dengan efek 3D tetapi tidak dapat


dimanipulasi pengguna misal obyek dilihat dari sisi yang berbeda
ataupun obyek yg dilihat berbeda. Hal ini terjadi karena nilai posisi
kamera kx,ky,kz maupun titik fokus (view reference point-VRP)
vrp_x,vrp_y,vrp_z dibuat konstanta.
Pada algoritma ini
untuk mengubah posisi kamera maupun
mengubah titik fokus harus mengubah nilai dari konstanta pada
variabel tersebut.
1. Deklarasikan obyek dalam koordinat dunia
Misal obyek berbentuk balok, maka tiap titik sudut
harus dideklaraiskan kooridinat dunianya (bisa dengan
satuan yang riil misal meter, kilometer dlsb.)
Contoh deklarasi balok sebagai berikut.
Sturtur data:
Baris Program : 2-12
Struct {
Int x; koordinat x
Int y; kooridnat y
Int z; kooridnat y
}s[20]; titik pokok/sudut ke
deklarasi/deskripsi/penjelasan posisi titik pokok
obyek balok:
s[1].x=0;s[1].y=0;s[1].z=250;
s[2].x=250;s[2].y=0;s[2].z=250;
s[3].x=250;s[3].y=250;s[3].z=250;
s[4].x=0;s[4].y=250;s[4].z=250;
s[5].x=0;s[5].y=0;s[5].z=0;
s[6].x=250;s[6].y=0;s[6].z=0;
s[7].x=250;s[7].y=250;s[7].z=0;
s[8].x=0;s[8].y=150;s[8].z=0;
deklarasi tsb untuk menggambarkan bentuk balok sebagai
berikut.
1

y
7

8
4

3
5

z
S[1].x menunjukkan koordinat x titik sudut 1
S[1].y menunjukkan koordinat y titik sudut 1
S[1].z menunjukkan koordinat z titik sudut 1
S[2].x menunjukkan koordinat x titik sudut 2, dan
seterusnya.
2. Tentukan letak kamera (View Plane Normal-VPN)
Baris Program : 17-19
Misal :
Kx=10;
Ky=100;
Kz=100;
Artinya posisi kamera di koordinat x=10, y=100,z=100
Posisi kamera ini dpaat diatur dengan menggunakan tombol
atau alat input lain
2

3. Tentukan fokus kamera(VRP-View Refference Point)


Baris Program : 27-29
Misal :
Vrp_X=50;vrp_y=50;vrp_z=50;
Artinya titik fokus pandang di koordinat x=50,y=50,z=50
Posisi fokus ini dpaat diatur dengan menggunakan tombol
atau alat input lain
4. Tentukan pusat proyeksi prespsktif
Baris Program : 36-39
5. Deklaraiskan matriks yang diperluken
Baris Program : 41-76
6. Lakukan operasi perkalian matrix
Baris Program : 77-105
7. Transformasikan koord obyek dalam koordinat dunia ke VPN
Baris Program : 107-111
8. Proyeksi perpektif ke bidang u-v
Baris Program : 112-117
9. Membuat nilai 1 pada matriks ordo ke 3
Baris Program : 119-122
10. Transformasi koordinat caertesian ke koordinat layar, karena
deskripsi obyek menggunakan koordinat cartesian, sementara
penampil koordinat layar
Baris Program : 126-130
11. Penggambaran obyek ke layar
Baris Program : 136-184
Kode Program untuk menghasilkan grafis 3D model rangka
adalah sebagai berikut.
void __fastcall TForm1::PaintBox1Paint(TObject *Sender)
{
1.
2.
3.
4.
5.
6.
7.
8.
9.

//menentukan tiitk-titik pokok oorrdinat obyek balok


s[1].x=0;s[1].y=0;s[1].z=250;
s[2].x=250;s[2].y=0;s[2].z=250;
s[3].x=125;s[3].y=500;s[3].z=125;
s[4].x=125;s[4].y=500;s[4].z=125;
s[5].x=0;s[5].y=0;s[5].z=0;
s[6].x=250;s[6].y=0;s[6].z=0;

10.
11.
12.
13.
14.
15.

s[7].x=125;s[7].y=500;s[7].z=125;
s[8].x=125;s[8].y=500;s[8].z=125;
//menetukan jujlkah obyek dan jumlkah titik sudut
int jumlah_obyek=1;
int max_titik=8;

16.
17.
18.
19.
20.
21.
22.
23.
24.

//------------------posisi kamera
float kx=0;
float ky=50;
float kz=350;
//---------------------------------float d=sqrt(kx*kx+ky*ky+kz*kz);
float dxn=kx/d;
float dyn=ky/d;
float dzn=kz/d;

25.
26.
27.
28.
29.
30.

// tiitk lenyap proyeksi perspektif


//--- fokus kamera atau titik pandang (VRP)
float vrp_x=0;
float vrp_y=0;
float vrp_z=0;
//-------------------------------

31.
32.
33.
34.
35.
36.
37.
38.

//float jarak =500;


float dxup=0;
float dyup=1;
float dzup=0;
//titik pusat proyeksi
float xc=0 ;
float yc=0 ;
float zc=-100;

39. //mennetukan batas bawah


40. int batasbawah=PaintBox1->ClientHeight;
41.
42.
43.
44.
45.
46.
47.
48.
49.

// matriks proyeksi perpektif


float perspek[4][4]=
{
//0 1 2 3
{-zc,0,0,0}, //0
{0,-zc,0,0}, //1
{xc,yc,-1,1},//2
{0,0,0,-zc} //3
};

50. // matriks translasi titik WRC ke VPN


51.
52.
53.
54.
55.
56.
57.
58.

float T[4][4]=
{
{1,0,0,0},
{0,1,0,0},
{0,0,1,0},
//
{-(kx*jarak-vrp_x),-(ky*jarak-vrp_y),-(kz*jarak-vrp_z),1}
{-(kx-vrp_x),-(ky-vrp_y),-(kz-vrp_z),1}
};

59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.

// putar sehiongga vektor n sesuai sumbu z


float v1=sqrt(dyn*dyn+dzn*dzn);
// rotasi sumbu x
float Rx[4][4]=
{
{1,0,0,0},
{0,-dzn/v1,-dyn/v1,0},
{0,dyn/v1,-dzn/v1,0},
{0,0,0,1}
};
// rorasu sumbu y;

70.
71.
72.
73.
74.
75.
76.

float Ry[4][4]=
{
{v1,0,-dxn,0},
{0,1,0,0},
{dxn,0,v1,0},
{0,0,0,1}
};

77. // mengalikan matriks Rx * Ry


78.
79.
80.
81.
82.

for (int i=0;i<=3;i++)


{
for (int k=0;k<=3;k++)
Rxy[i][k]=Rx[i][0] * Ry[0][k] + Rx[i][1] * Ry[1][k]+ Rx[i][2] * Ry[2][k]+ Rx[i][3] * Ry[3][k];
}

83. xup_vp=dxup*Rxy[0][0]+dyup*Rxy[1][0]+dzup*Rxy[2][0];
84. yup_vp=dxup*Rxy[0][1]+dyup*Rxy[1][1]+dzup*Rxy[2][1];
85. rup=sqrt(xup_vp*xup_vp+yup_vp*yup_vp);
86.
87.
88.
89.
90.
91.
92.

float Rz[4][4]=
{
{yup_vp/rup,xup_vp/rup,0,0},
{-xup_vp/rup,yup_vp/rup,0,0},
{0,0,1,0},
{0,0,0,1}
};

93.
94.
95.
96.
97.
98.

// perklaian matriks dxy * dz


for (int i=0;i<=3;i++)
{
for (int k=0;k<=3;k++)
Rxyz[i][k]=Rxy[i][0] * Rz[0][k] + Rxy[i][1] * Rz[1][k]+ Rxy[i][2] * Rz[2][k]+ Rxy[i][3] * Rz[3][k];
}

99. // perkalian matriks T dan Rxyz


100. for (int i=0;i<=3;i++)
101. {
102. for (int k=0;k<=3;k++)
103. TRxyz[i][k]=T[i][0] * Rxyz[0][k] + T[i][1] * Rxyz[1][k]+
104. T[i][2] * Rxyz[2][k]+ T[i][3] * Rxyz[3][k];
105. }
106. // transfoemasi titik obyek ke VPN

107. for (int i=1;i<=8;i++) // loop poligon


108. {
109. for (int k=0;k<=3;k++) // loop titik
110. vpn_k[i][k]=s[i].x*TRxyz[0][k] + s[i].y * TRxyz[1][k]+s[i].z* TRxyz[2][k] + 1* TRxyz[3][k];
111. }
112. //transfoemasi perpeksif
113. for (int i=1;i<=8;i++)
114. {
115. for (int k=0;k<=3;k++)
116. vpn_pers[i][k]=vpn_k[i][0] * perspek[0][k] + vpn_k[i][1] * perspek[1][k] + vpn_k[i][2]
*perspek[2][k]+ vpn_k[i][3] * perspek[3][k];
117. }
118. //membuat niali 1 pada matrix padaordo ke-4
119. for (int i=1;i<=max_titik;i++)
120. {
121. for (int k=0;k<=3;k++)
122. vpn_pers[i][k]=(int) vpn_pers[i][k]/vpn_pers[i][3];
123. }
124. int tengah=PaintBox1->ClientWidth/2;
125. // trabsformasi ke koordinat layar
126. for (int i=1;i<=max_titik;i++)
127. {
128. vpn_pers[i][0]=vpn_pers[i][0]+tengah;
129. vpn_pers[i][1]=batasbawah-vpn_pers[i][1]-50;
130. }
131. //mmebuat jendela paint box dengan warna dasa putih
132. PaintBox1->Canvas->Brush->Color=clWhite;
133. PaintBox1->Canvas->Rectangle(1,1,ClientWidth-1,ClientHeight-1);
134. //nggambar polyliner
135. //poligon 1
136. POINT t1[4];
//deklarasi variabel
137. t1[0]=Point(vpn_pers[1][0],vpn_pers[1][1]);
138. t1[1]=Point(vpn_pers[2][0],vpn_pers[2][1]);
139. t1[2]=Point(vpn_pers[3][0],vpn_pers[3][1]);
140. t1[3]=Point(vpn_pers[4][0],vpn_pers[4][1]);
141. t1[4]=Point(vpn_pers[1][0],vpn_pers[1][1]);
142. PaintBox1->Canvas->Polyline((TPoint*)t1,4);
143. //poligon 2 belakang
144. POINT t2[4];
//deklarasi variabel
145. t2[0]=Point(vpn_pers[5][0],vpn_pers[5][1]);
146. t2[1]=Point(vpn_pers[6][0],vpn_pers[6][1]);
147. t2[2]=Point(vpn_pers[7][0],vpn_pers[7][1]);
148. t2[3]=Point(vpn_pers[8][0],vpn_pers[8][1]);
149. t2[4]=Point(vpn_pers[5][0],vpn_pers[5][1]);
150. PaintBox1->Canvas->Polyline((TPoint*)t2,4);
151. //poligon 3 bawah
152. POINT t3[4];
//deklarasi variabel
153. t3[0]=Point(vpn_pers[1][0],vpn_pers[1][1]);
154. t3[1]=Point(vpn_pers[2][0],vpn_pers[2][1]);

155. t3[2]=Point(vpn_pers[6][0],vpn_pers[6][1]);
156. t3[3]=Point(vpn_pers[5][0],vpn_pers[5][1]);
157. t3[4]=Point(vpn_pers[1][0],vpn_pers[1][1]);
158. PaintBox1->Canvas->Polyline((TPoint*)t3,4);
159. //poligon 4 atas
160. POINT t4[4];
//deklarasi variabel
161. t4[0]=Point(vpn_pers[4][0],vpn_pers[4][1]);
162. t4[1]=Point(vpn_pers[3][0],vpn_pers[3][1]);
163. t4[2]=Point(vpn_pers[7][0],vpn_pers[7][1]);
164. t4[3]=Point(vpn_pers[8][0],vpn_pers[8][1]);
165. t4[4]=Point(vpn_pers[4][0],vpn_pers[4][1]);
166. PaintBox1->Canvas->Polyline((TPoint*)t4,4);
167. //poligon 5 kanan
168. POINT t5[4];
//deklarasi variabel
169. t5[0]=Point(vpn_pers[2][0],vpn_pers[2][1]);
170. t5[1]=Point(vpn_pers[6][0],vpn_pers[6][1]);
171. t5[2]=Point(vpn_pers[7][0],vpn_pers[7][1]);
172. t5[3]=Point(vpn_pers[3][0],vpn_pers[3][1]);
173. t5[4]=Point(vpn_pers[2][0],vpn_pers[2][1]);
174. PaintBox1->Canvas->Polyline((TPoint*)t5,4);
175.
176. //poligon 6 kiri
177. POINT t6[4];
//deklarasi variabel
178. t6[0]=Point(vpn_pers[1][0],vpn_pers[1][1]);
179. t6[1]=Point(vpn_pers[5][0],vpn_pers[5][1]);
180. t6[2]=Point(vpn_pers[8][0],vpn_pers[8][1]);
181. t6[3]=Point(vpn_pers[4][0],vpn_pers[4][1]);
182. t6[4]=Point(vpn_pers[1][0],vpn_pers[1][1]);
183. PaintBox1->Canvas->Polyline((TPoint*)t6,4);
184. }

Tambahkah kode pada file header (.h) sbb


(yg dicetak Bold cetak regular bawaan C++)

//-------------------------------------------------------------------------#ifndef rangkaH
#define rangkaH
//-------------------------------------------------------------------------#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
7

//-------------------------------------------------------------------------class TForm1 : public TForm


{
__published:
// IDE-managed Components
TPaintBox *PaintBox1;
void __fastcall PaintBox1Paint(TObject *Sender);
private: // User declarations
public:
// User declarations
__fastcall TForm1(TComponent* Owner);
float Rxy[4][4],Rx[4][4],xup_vp,yup_vp,rup,Rxyz[4][4];
float vpn_p[8][4],TRxyz[4][4],vpn_k[8][5];
float vpn_pers[8][4];
struct titik{
int x;
int y;
int z;
}s[50];
};
//---------------------------------------------------------------------extern
PACKAGE TForm1 *Form1;
//--------------------------------------------------------------------#endif

tambahkan kode pada file .cpp bagian atas


(yg dicetak Bold cetak regular bawaan C++)
//-------------------------------------------------------------------------#include <vcl.h>

#include <math.h>
#pragma hdrstop
#include "rangka.h"
//-------------------------------------------------------------------------#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//-------------------------------------------------------------------------__fastcall TForm1::TForm1(TComponent* Owner)

jalankan program diatas

Anda mungkin juga menyukai