Anda di halaman 1dari 15

TUGAS MATA KULIAH GRAFIKA KOMPUTER (TEL 554)

TRANSFORMAS BANGUN 3D DENGAN 10 VERTEX

Disusun Oleh : Ivan Fathul Ihsan Arida

JURUSAN TEKNIK ELEKTRO FAKULTAS TEKNIK UNIVERSITAS GADJAH MADA 2008


0
www.digizoneku.com

Dalam tugas kali ini, kami menggunakan bahasa pemrograman Delphi karena dalam Borland Delphi 7 sudah tersedia library untuk openGL sehingga memudahan kami untuk membuat objek 3D dan mentransformasikannya. Dalam membuat objek 3D, kita membuat rancangannya terlebih dahulu dan menentukan koordinatnya. Berikut ini adalah rancangan objek 3D kami :

permukaan-1

permukaan-2

permukaan-3

permukaan-4

1
www.digizoneku.com

Jika keempat permukaan tersebut digabung, maka kurang lebih akan membentuk sebuah bangun ruang seperti di bawah ini :

Setelah itu kami menentukan koordinat titik-titik vertex bangun tersebut : 1. Titik A ( -0.5, -0.5, 0.5) 2. Titik B ( 0.5, -0.5, 0.5) 3. Titik C ( 0.5, -0.5, -0.5) 4. Titik D ( -0.5, -0.5, -0.5); 5. Titik E ( -0.5, 0.5, 0.5); 6. Titik F ( 0.5, 0.5, 0.5) 7. Titik G ( 0.5, 0.5, -0.5) 8. Titik H ( -0.5, 0.5, -0.5) 9. Titik I ( 0.0, 1.0, 0.0) 10. Titik J ( 0.0, -1.0, 0.0)

2
www.digizoneku.com

Setelah selesai mendesain, tahap selanjutnya adalah membuat proyek dengan Delphi sehingga akan didapatkan kode program sebagai berikut :
unit Trans3D;

interface

uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, OpenGL, ExtCtrls, StdCtrls, ComCtrls, Spin;

type TForm1 = class(TForm) Panel1: TPanel; Button1: TButton; Translasi: TGroupBox; SpinEditX: TSpinEdit; Sumbux: TLabel; Sumbuz: TLabel; Sumbuy: TLabel; SpinEditY: TSpinEdit; SpinEditZ: TSpinEdit; GroupBox1: TGroupBox; rot_sbx: TCheckBox; rot_sby: TCheckBox; rot_sbz: TCheckBox; GroupBox2: TGroupBox; Label1: TLabel; Label2: TLabel; Label3: TLabel; sklz: TSpinEdit; skly: TSpinEdit; sklx: TSpinEdit; GroupBox3: TGroupBox; CheckBox1: TCheckBox; Label7: TLabel; sdt: TSpinEdit; Label8: TLabel; Label10: TLabel;

3
www.digizoneku.com

Label11: TLabel; Label12: TLabel; Label13: TLabel; Label14: TLabel; GroupBox4: TGroupBox; ptrx: TCheckBox; ptry: TCheckBox; ptrz: TCheckBox; procedure FormCreate(Sender: TObject); procedure Panel1Resize(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure FormKeyPress(Sender: TObject; var Key: Char); procedure Button1Click(Sender: TObject); procedure SpinEditZChange(Sender: TObject); procedure SpinEditYChange(Sender: TObject); procedure SpinEditXChange(Sender: TObject); procedure sklxChange(Sender: TObject); procedure sklyChange(Sender: TObject); procedure sklzChange(Sender: TObject); procedure CheckBox1Click(Sender: TObject); procedure sdtChange(Sender: TObject);

//deklarasi private private glrc : HGLRC; //deklarasi glrc sebagai rendering-context dc : HDC; //deklarasi dc sebagai device-context

ElapsedTime, AppStart, LastTime: DWord; //variabel-variabel untuk waktu procedure glDraw; //procedure untuk menggambar dalam openGL procedure Idle(Sender: TObject; var Done: Boolean);

//deklarasi public public end;

var Form1: TForm1;

//inialisasi variabel x,y,z untuk translasi z: Integer = -100; x: Integer = 0; y: Integer = 0;

4
www.digizoneku.com

//inisialisasi variabel untuk rotasi theta:integer=0; sbx:Real=0.0; sby:Real=0.0; sbz:Real=0.0;

//inisialisasi variabel untuk animasi bangun xptr:Real=0.0; yptr:Real=0.0; zptr:Real=0.0;

//inisialisasi variabel untuk scaling sclx:Integer=1; scly:Integer=1; sclz:Integer=1;

implementation

{$R *.DFM}

//Procedure glDraw untuk menggambar objek pada scene procedure TForm1.glDraw(); begin

glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);

glLoadIdentity();

//Perintah translasi dalam openGL glTranslatef(x/10,y/10,z/10);

//Perintah scaling dalam openGL glScalef(sclx,scly,sclz);

//Animasi //--rotasi if (ptrx.Checked or ptry.Checked or ptrz.Checked) then begin if ptrx.Checked then

xptr := 1.0 else xptr:=0;

5
www.digizoneku.com

if

ptry.Checked then

yptr := 1.0 else yptr:=0;

if

ptrz.Checked then

zptr := 1.0 else zptr:=0; glRotatef(ElapsedTime/10,xptr,yptr,zptr); end;

//Rotasi if (rot_sbx.Checked or rot_sby.Checked or rot_sbz.Checked) then begin if rot_sbx.Checked then

sbx := 1.0 else sbx:=0;

if

rot_sby.Checked then

sby := 1.0 else sby:=0;

if

rot_sbz.Checked then

sbz := 1.0 else sbz:=0;

//Perintah rotasi dalam openGL glRotatef(theta,sbx,sby,sbz); end;

//Menggambar Bangun 3D dengan 10 buah vertex (1 kubus diantara 2 limas segiempat) //pertama buat KUBUS glBegin(GL_QUADS); //setiap 4 titik akan dibentuk segiempat

//SISI-1 glColor3f(1.0,1.0,0.0); //setting warna glVertex3f( 0.5, 0.5, 0.5); //titik F glVertex3f( -0.5, 0.5, 0.5); //titik E glVertex3f( -0.5, -0.5, 0.5); //titik A glVertex3f( 0.5, -0.5, 0.5); //titik B

6
www.digizoneku.com

//SISI-2 glColor3f(0.3,1.0,0.3); //setting warna glVertex3f( 0.5, 0.5, -0.5); //titik G glVertex3f( 0.5, 0.5, 0.5); //titik F glVertex3f( 0.5, -0.5, 0.5); //titik B glVertex3f( 0.5, -0.5, -0.5); //titik C

//SISI-3 glColor3f(1.0,0.0,0.0); //setting warna glVertex3f( -0.5, 0.5, -0.5); //titik H glVertex3f( 0.5, 0.5, -0.5); //titik G glVertex3f( 0.5, -0.5, -0.5); //titik C glVertex3f( -0.5, -0.5, -0.5); //titik D

//SISI-4 glColor3f(0.9,0.9,0.9); //setting warna glVertex3f( -0.5, 0.5, 0.5); //titik E glVertex3f( -0.5, 0.5, -0.5); //titik H glVertex3f( -0.5, -0.5, -0.5); //titik D glVertex3f( -0.5, -0.5, 0.5); //titik A // Akhir penggambaran KUBUS glEnd();

//kedua buat LIMAS di atas dan di bawah KUBUS glBegin(GL_TRIANGLES); //Setiap tiga titik akan dibentuk segitiga //sisi ATAS-1 di atas SISI-1 kubus glColor3f(1.0,0.0,0.0); //setting warna glVertex3f( 0.0, 1.0, 0.0); //titik I glVertex3f( -0.5, 0.5, 0.5); //titik E glVertex3f( 0.5, 0.5, 0.5); //titik F //ATAS-2 di atas SISI-2 kubus glColor3f(0.0,1.0,1.0); //setting warna glVertex3f( 0.0, 1.0, 0.0); //titik I glVertex3f( 0.5, 0.5, 0.5); //titik F glVertex3f( 0.5, 0.5, -0.5); //titik G //ATAS-3 di atas SISI-3 kubus glColor3f(1.0,1.0,0.0); //setting warna glVertex3f( 0.0, 1.0, 0.0); //titik I glVertex3f( 0.5, 0.5, -0.5); //titik G glVertex3f( -0.5, 0.5, -0.5); //titik H //ATAS-4 di atas SISI-4 kubus

7
www.digizoneku.com

glColor3f(1.0,0.8,0.8); //setting warna glVertex3f( 0.0, 1.0, 0.0); //titik I glVertex3f( -0.5, 0.5, -0.5); //titik H glVertex3f( -0.5, 0.5, 0.5); //titik E //BAWAH-1 di bawah SISI-1 kubus glColor3f(0.0,1.0,0.0); //setting warna glVertex3f( 0.0, -1.0, 0.0); //titik J glVertex3f( -0.5, -0.5, 0.5); //titik A glVertex3f( 0.5, -0.5, 0.5); //titik B //BAWAH-2 di bawah SISI-1 kubus glColor3f(1.0,0.8,0.8); //setting warna glVertex3f( 0.0, -1.0, 0.0); //titik J glVertex3f( 0.5, -0.5, 0.5); //titik B glVertex3f( 0.5, -0.5, -0.5); //titik C //BAWAH-3 di bawah SISI-1 kubus glColor3f(0.9,0.9,0.9); //setting warna glVertex3f( 0.0, -1.0, 0.0); //titik J glVertex3f( 0.5, -0.5, -0.5); //titik C glVertex3f( -0.5, -0.5, -0.5); //titik D //BAWAH-4 di bawah SISI-1 kubus glColor3f(0.0,1.0,1.0); //setting warna glVertex3f( 0.0, -1.0, 0.0); //titik J glVertex3f( -0.5, -0.5, -0.5); //titik D glVertex3f( -0.5, -0.5, 0.5); //titik A

//Akhir penggambaran Limas glEnd();

SwapBuffers(wglGetCurrentDC); end;

//Tampilkan objek yg telah dibentuk

//Inisialisasi openGL procedure glInit(); begin glClearColor(0.0, 0.0, 0.0, 0.0); //Setting warna background glShadeModel(GL_SMOOTH); //mengaktifkan Smooth Color Shading glClearDepth(1.0); //Mengatur kedalaman buffer glEnable(GL_DEPTH_TEST); //Test untuk mencari nilai kedalaman glDepthFunc(GL_LESS); kedalaman //Fungsi yang digunakan untuk test pencarian

8
www.digizoneku.com

glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); end;

//Form dan inisialisasi Window openGL procedure TForm1.FormCreate(Sender: TObject); var dfp : TPIXELFORMATDESCRIPTOR; fp begin //inisialisasi Device-context (Media gambar nyata) dc dc:=GetDC(Panel1.Handle); : Integer;

// Format Pixel dfp.nSize:=sizeof(dfp); dfp.nVersion:=1; dfp.dwFlags:=PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER or 0; dfp.iPixelType:=PFD_TYPE_RGBA; dfp.cColorBits:=32;

fp :=ChoosePixelFormat(dc, @dfp); SetPixelFormat(dc, fp, @dfp);

//insialisasi Rendering-context (Media gambar abstrak) glrc glrc :=wglCreateContext(dc);

//Mengaitakan Device-context dc dan Rendering-context glrc wglMakeCurrent(dc,glrc);

// Pemanggilan fungsi glInit glInit; Panel1Resize(sender); AppStart :=GetTickCount(); Application.OnIdle := Idle; end;

//Procedure ketika aplikasi ditutup procedure TForm1.FormDestroy(Sender: TObject); begin wglMakeCurrent(0,0); //Lepaskan Rendering-Context ketika aplikasi ditutup wglDeleteContext(glrc);

9
www.digizoneku.com

end;

//Procedure ketika aplikasi idle procedure TForm1.Idle(Sender: TObject; var Done: Boolean); begin Done := FALSE;

LastTime :=ElapsedTime; ElapsedTime :=GetTickCount() - AppStart; ElapsedTime :=(LastTime + ElapsedTime) DIV 2;

glDraw(); SwapBuffers(DC); end;

//Procedure Reset GL Scene procedure TForm1.Panel1Resize(Sender: TObject); begin glViewport(0, 0, Panel1.Width, Panel1.Height); glMatrixMode(GL_PROJECTION); glLoadIdentity();

gluPerspective(45.0, Panel1.Width/Panel1.Height, 1.0, 500.0);

glMatrixMode(GL_MODELVIEW); end;

//Procedure untuk menanggapi penekanan tombol procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char); begin if Key = #27 then Close; end; // jika tombol ESC ditekan program keluar

procedure TForm1.Button1Click(Sender: TObject); begin Close; end; // Jika tombol Close ditekan, tutup aplikasi

// --------- TRANSLATION // Translasi sumbu z

---------

10
www.digizoneku.com

procedure TForm1.SpinEditZChange(Sender: TObject); begin z:=SpinEditZ.Value; glDraw; end;

// Translasi sumbu y procedure TForm1.SpinEditYChange(Sender: TObject); begin y:=SpinEditY.Value; glDraw; end;

// Translasi sumbu x procedure TForm1.SpinEditXChange(Sender: TObject); begin x:=SpinEditX.Value; glDraw; end;

// --------- SCALE // Scaling sumbu x

------------------

procedure TForm1.sklxChange(Sender: TObject); begin sclx:=sklx.Value; glDraw; end;

// Scaling sumbu y procedure TForm1.sklyChange(Sender: TObject); begin scly:=skly.Value; glDraw; end;

// Scaling sumbu z procedure TForm1.sklzChange(Sender: TObject); begin sclz:=sklz.Value; glDraw; end;

11
www.digizoneku.com

// --------- ROTASI // Ubah sudut rotasi

------------------

procedure TForm1.sdtChange(Sender: TObject); begin theta:=sdt.Value; glDraw; end;

// Mode Polygon procedure TForm1.CheckBox1Click(Sender: TObject); begin if CheckBox1.Checked then glPolygonmode(GL_FRONT_AND_BACK, GL_LINE) else glPolygonmode(GL_FRONT_AND_BACK, GL_FILL); glDraw(); end;

end.

Berikut ini adalah gambar-gambar beberapa penggunaan program : 1. Program baru dibuka, belum dilakukan operasi apapun

12
www.digizoneku.com

2. Tampilan Mode Garis: Lihat garis saja

3. Operasi Translasi sumbu X sebesar 10

13
www.digizoneku.com

4. Operasi Scaling sumbu Y sebesar 3

5. Operasi Rotasi di sumbu Z dengan sudut 900

14
www.digizoneku.com