Enter your email address:

Delivered by

Uploud File di Ziddu dan dapat uang broo
Uploud File di Deposit Files

Kelompok 3 Transformasi 3D

Label: , ,

============================================
= 1. MOKHAMAD IRWAN ALIFI (076403020009)
= 2. SLAMET WAHYU UTOMO (076403020005)
= 3. IRWANTO (070403020031)
= 4. M. NURIL ANWAR (070403020013)
= 5. M. RIDHO SANTOSO (070403020020)
= 6. MIEISA PALUPI (086403020002)
= 7. DWI SUGI P. (076403020006)
= 8. ARIF ARDIASYAH (070403020016)
============================================
Transformasi pada obyek tiga dimensi
Pada obyek tiga dimensi dapat dilakukan 3 transformasi pokok yaitu penggeseran (translation), perputaran (rotasi) , pembesaran (scaling). Adapun jenis transformasi lain adalah pembebanan (shearing), dan pencerminan (mirroring). Didalam program, transformasi ini juga dapat dilakukan dengan mengubah persamaan menjadi operasi matriks 4x4. Adapun persamaan setiap transformasi adalah sebagai berikut.
1. Penggeseran (translation)
( x’, y’,z’ ) = ( Tx +x, Ty +y, Tz +z)
dengan x’,y’, z’ : koordinat hasil transformasi
x,y,z : koordinat titik awal
Tx,Ty, Tz : faktor penggeseran kearah x, y, z
2. Pembesaran (scaling)
( x’,y’,z’ ) = (Sx *x, Sy *y, Sz *z)
dengan Sx,Sy, Sz : faktor pembesaran kearah x, y, z
3. Perputaran (rotation)
a) terhadap sumbu x
( x’,y’, z’ ) = (x , y *cos q +z*sinq, - y *sinq+z*consq)
b) terhadap sumbu y
( x’,y’,z’ ) = ( x *cos q +z*sinq,y , - x *sinq+z*consq)
c) terhadap sumbu z
(x’,y’, z’ ) = ( x *cos q +y*sinq, - x*sinq+y*consq , z )
dengan q : sudut putar berlawanan arah jarum jam

Teknik penampilan obyek 3 dimensi

Pada sistem dua dimensi obyek gambar dua dimensi dapat langsung di aplikasikan pada layar karena memiliki dimensi yang sama, kalaupun ada perbedaan hanya pada arah sumbunya. Koordinat Cartesian memiliki sumbu y arah ke atas, sedangkan koordinat layar sumbu y ke arah bawah. Akan tetapi dengan sedikit modifikasi atau menggunakan fungsi bahasa pemrograman tertentu misalnya Borland C++ 4.0 keatas dengan fungsi terpasang, koordinat layar dapat disesuaikan dengan kordinat kartesian dengan sumbu y ke arah atas. Pada sistem tiga dimensi setiap titik memiliki 3 koordinat yaitu koordinat x, y, dan z, sedangkan layar hanya memiliki sumbu x dan y. Oleh karena itu diperlukan transformasi dari koordinat tiga dimensi atau disebut dengan koordinat dunia menjadi koordinat dua dimensi. Beberapa metode untuk menampilkan efek tiga dimensi pada layar dua dimensi selain metode kamera sintetis yaitu proyeksi paralel, dan proyeksi perspektif.

a. Proyeksi Paralel

Proyeksi paralel merupakan teknik dasar untuk penyajian obyek tiga dimensi pada layar dua dimensi, yang bertumpu pada 3 sudut pandang. Pandangan depan, pandangan samping dan pandangan atas. Contoh proyeksi paralel seperti pada gambar 1. Untuk menggambarkan proyeksi paralel dalam tiga dimensi diperlukan beberapa sudut pandang minimal atas, samping dan depan kemudian di proyeksikan dalam koordinat tiga dimensi sehingga seperti terlihat pada gambar

Proyeksi parallel merupakan teknik yang relatif sederhana tetapi gambar yang ditampilkan masih sulit untuk dibayangkan sebagai image tiga dimensi, seperti pada gambar 1. Untuk itu dikembangkan cara lain yaitu dengan teknik proyeksi perspektif seperti pada gambar 2.

b. Proyeksi Perspektif


Proyeksi perspektif adalah bentuk gambar tiga dimensi seperti yang dilihat pada kenyataan sesungguhnya seperti yang terlihat oleh mata manusia ataupun kamera. Teknik ini lebih menggambarkan keadaan yang sesungguhnya tetapi untuk obyek dalam bentuk gambar rangka (wire frame) untuk kedalaman tertentu dapat menimbulkan dualisme gambar. Misalnya bagian yang terkesan didalam kadang-kadang juga terkesan di luar.

c. Kamera sintetis

Metode pendekatan yang telah dibahas dengan teknik proyeksi diatas masih belum mampu menghasilkan efek 3 dimensi dengan baik. Pada proyeksi paralel yang terlihat oleh pengamat hanyalah bagian depan obyek sedang bagian yang lebih jauh untuk posisi x, dan y yang sama tak terlihat. Sedangkan pada proyeksi perspektif mata harus terletak pada sumbu koordinat z, yang berarti bidang pandang harus berimpit dengan bidang koordinat, misalnya xy. Dengan ketentuan ini maka penyajian obyek tiga dimensi menjadi terbatas. Untuk mengatasi hal tersebut sebelum diproyeksikan diperlukan proses transformasi rotasi sehingga suatu obyek dapat dipandang dari berbagai posisi, atas, bawah, samping dan lain sebagainya. Terdapat dua cara yang identik untuk memandang suatu obyek dari berbagai sisi yakni bidang pandang (view plane) pada posisi tetap, obyek diputar atau bidang pandang berputar sedangkan obyek tetap. Bila digunakan cara kedua dengan bidang pandang dianggap sebagai film dalam kamera, maka suatu obyek dapat di pandang dari berbagai sisi dengan menggerakkan dan memutar kamera. Metode ini sering disebut dengan metode kamera sitetis (synthetic camera) seperti pada gambar 3.


Contoh menggunakan Delphi 7

Screen Shoot



Script :



unit Main;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
OpenGL, MyOpenGL, Mesh, StdCtrls, ExtCtrls, ComCtrls,Transf3D;

type
TForm1 = class(TForm)
Panel1: TPanel;
GroupBox1: TGroupBox;
ETRZ: TEdit;
ETRY: TEdit;
ETRX: TEdit;
Trx: TLabel;
Label1: TLabel;
Label2: TLabel;
TranslasiBtn: TButton;
GroupBox2: TGroupBox;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
ESZ: TEdit;
ESY: TEdit;
ESX: TEdit;
SkalaBtn: TButton;
GroupBox3: TGroupBox;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
Label10: TLabel;
ERZ: TEdit;
ERY: TEdit;
ERX: TEdit;
RotasiBtn: TButton;
ESudut: TEdit;
VertexView: TListView;
Label6: TLabel;
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure TranslasiBtnClick(Sender: TObject);
procedure SkalaBtnClick(Sender: TObject);
procedure RotasiBtnClick(Sender: TObject);
procedure FormResize(Sender: TObject);
private
{ Private declarations }
ftrx, ftry, ftrz:real;
frx, fry, frz:real;
fsx,fsy,fsz:real;
fsudut:real;
fmode_transformasi:byte;
fKubus:TKubus;
fTransf:TTransf3D;
procedure AmbilVertex;
procedure TransformVertex;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

const
TRANSF_TRANSLASI = 0;
TRANSF_ROTASI = 1;
TRANSF_SKALA = 2;

procedure TForm1.TransformVertex;
var
index:integer;
vp,v:TVertex3D;
begin
for index:=0 to fKubus.VertexCount-1 do
begin
v:=fKubus.Vertex[index];
fTransf.Transform(v.vertex, vp.vertex);
fKubus.ChangeVertex(index,vp.vertex.x, vp.vertex.y, vp.vertex.z);
end;
end;

procedure TForm1.AmbilVertex;
var
index:integer;
item:TListItem;
begin
//bersihkan VertexView
VertexView.Items.Clear;
for index:=0 to fKubus.VertexCount-1 do
begin
item:=VertexView.Items.Add;
with fKubus do
begin
item.Caption:= Format('%2.2f',[Vertex[index].vertex.x]);
item.SubItems.Add(Format('%2.2f',[Vertex[index].vertex.y]));
item.SubItems.Add(Format('%2.2f',[Vertex[index].vertex.z]));
end;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
fKubus:=TKUbus.Create(true,true,1.0,1.0,0.0);
fKubus.ChangeColor(KUBUS_ATAS,1.0,0.0,0.0);
fTransf:=TTransf3D.Create;

ftrx:=0; ftry:=0; ftrz:=0;
frx:=0; fry:=0; frz:=0;
fsx:=0; fsy:=0; fsz:=0;
fmode_transformasi:=9;

glDC:=GetDC(Handle);
InitOpenGL(glDC);
Axis3D:=TAxis3D.Create;
glEnable(GL_DEPTH_TEST);
// glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);

glViewport(Panel1.Width,0,Width-Panel1.Width,Height-Memo1.Height);

glMatrixMode(GL_PROJECTION);
glLoadIdentity;

gluPerspective(45, (width - Panel1.Width)/height,1.0, 100.0);
gluLookAt(3.0, 2.0, 3.0,
0.0, 0.0, 0.0,
0.0, 1.0, 0.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity;
end;

procedure TForm1.FormPaint(Sender: TObject);
var
index:integer;
v,vp:TPoint3D;
begin
glClearCOlor(0.0, 0.0, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
{ glLoadIdentity;
case fmode_transformasi of
TRANSF_TRANSLASI : glTranslatef(ftrx,ftry,ftrz);
TRANSF_ROTASI : glRotatef(fsudut, frx, fry, frz);
TRANSF_SKALA : glScalef(fsx,fsy,fsz);
end;}

fKubus.Draw;
Axis3D.Draw;
glFlush;
//update daftar vertex
AmbilVertex;
end;

procedure TForm1.TranslasiBtnClick(Sender: TObject);
begin
ftrx:=StrToFloat(ETRX.Text);
ftry:=StrToFloat(ETRY.Text);
ftrz:=StrToFloat(ETRZ.Text);
fmode_transformasi:=TRANSF_TRANSLASI;
fTransf.ClearTransformation;
fTransf.Translation(ftrx,ftry,ftrz);
TransformVertex;
Repaint;
end;

procedure TForm1.SkalaBtnClick(Sender: TObject);
begin
fsx:=StrToFloat(ESX.Text);
fsy:=StrToFloat(ESY.Text);
fsz:=StrToFloat(ESZ.Text);
fmode_transformasi:=TRANSF_SKALA;
fTransf.ClearTransformation;
fTransf.Scaling(fsx,fsy,fsz,0,0,0);
TransformVertex;
Repaint;
end;

procedure TForm1.RotasiBtnClick(Sender: TObject);
begin
frx:=StrToFloat(ERX.Text);
fry:=StrToFloat(ERY.Text);
frz:=StrToFloat(ERZ.Text);
fsudut:=StrToFloat(ESudut.Text);
fmode_transformasi:=TRANSF_ROTASI;
fTransf.ClearTransformation;
fTransf.Rotation(fsudut,frx,fry,frz);
TransformVertex;
Repaint;
end;

procedure TForm1.FormResize(Sender: TObject);
begin
glViewport(Panel1.Width,0,Width-Panel1.Width,Height);

glMatrixMode(GL_PROJECTION);
glLoadIdentity;

gluPerspective(45, (width - Panel1.Width)/height,1.0, 100.0);
gluLookAt(8.0, 4.0, 9.0,
0.0, 0.0, 0.0,
0.0, 1.0, 0.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity;
Repaint;
end;

end.



Download Sample Program

Download Program Source





0 komentar:

Posting Komentar


ShoutMix chat widget