transformasi bangun 3d dengan 10 vertex

15
www.digizoneku.com 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

Upload: bimo-adi-pradono

Post on 28-Nov-2014

985 views

Category:

Documents


5 download

DESCRIPTION

TUGAS MATA KULIAH GRAFIKA KOMPUTER (TEL 554)TRANSFORMAS BANGUN 3D DENGAN 10 VERTEXDisusun Oleh : Ivan Fathul Ihsan AridaJURUSAN TEKNIK ELEKTRO FAKULTAS TEKNIK UNIVERSITAS GADJAH MADA 20080www.digizoneku.comDalam 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 menentukN.B- Info cara mencegah dan mengobati berbagai penyakit (www.herbanesia.com)- info cara tambah tinggi badan, max usia 35th (www.smarttaller.com)- info cara turun berat badan (www.dietsehat911.com)- layanan internet cepat tanpa batas, tanpa quota, full speed 24/7 (www.digizoneku.com)- agen pulsa murah all operator (www.digizonecell.com)

TRANSCRIPT

Page 1: Transformasi Bangun 3D Dengan 10 Vertex

0 www.digizoneku.com

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

Page 2: Transformasi Bangun 3D Dengan 10 Vertex

1 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

Page 3: Transformasi Bangun 3D Dengan 10 Vertex

2 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)

Page 4: Transformasi Bangun 3D Dengan 10 Vertex

3 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;

Page 5: Transformasi Bangun 3D Dengan 10 Vertex

4 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;

Page 6: Transformasi Bangun 3D Dengan 10 Vertex

5 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;

Page 7: Transformasi Bangun 3D Dengan 10 Vertex

6 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

Page 8: Transformasi Bangun 3D Dengan 10 Vertex

7 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

Page 9: Transformasi Bangun 3D Dengan 10 Vertex

8 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); //Tampilkan objek yg telah dibentuk

end;

//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); //Fungsi yang digunakan untuk test pencarian

kedalaman

Page 10: Transformasi Bangun 3D Dengan 10 Vertex

9 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 : Integer;

begin

//inisialisasi Device-context (Media gambar nyata) dc

dc:=GetDC(Panel1.Handle);

// 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);

Page 11: Transformasi Bangun 3D Dengan 10 Vertex

10 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 // jika tombol ESC ditekan program keluar

Close;

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

Close; // Jika tombol Close ditekan, tutup aplikasi

end;

// --------- TRANSLATION ---------

// Translasi sumbu z

Page 12: Transformasi Bangun 3D Dengan 10 Vertex

11 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;

Page 13: Transformasi Bangun 3D Dengan 10 Vertex

12 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

Page 14: Transformasi Bangun 3D Dengan 10 Vertex

13 www.digizoneku.com

2. Tampilan Mode Garis: Lihat garis saja

3. Operasi Translasi sumbu X sebesar 10

Page 15: Transformasi Bangun 3D Dengan 10 Vertex

14 www.digizoneku.com

4. Operasi Scaling sumbu Y sebesar 3

5. Operasi Rotasi di sumbu Z dengan sudut 900