transformasi bangun 3d dengan 10 vertex
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
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
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
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)
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;
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;
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;
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
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
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
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);
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
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;
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
13 www.digizoneku.com
2. Tampilan Mode Garis: Lihat garis saja
3. Operasi Translasi sumbu X sebesar 10
14 www.digizoneku.com
4. Operasi Scaling sumbu Y sebesar 3
5. Operasi Rotasi di sumbu Z dengan sudut 900