5
Perancangan dan pembuatan perangkat lunak ini menggunakan berbagai teknologi sehingga menjadi suatu kesatuan. Teknologi yang dipakai dalam implementasi perangkat lunak antara lain proyeksi, OpenGL, Quartz, MacOSX Tiger, Cocoa framework serta Xcode compiler. Berikut akan dijabarkan satu persatu mengenai teknologi pendukung pembuatan perangkat lunak ini.
2.1. Proyeksi
Secara umum, proyeksi adalah proses mengubah titik dalam sebuah sistem koordinat sebuah n-dimensi menjadi sistem koordinat lain dalam n-dimensi yang lebih kecil. Sebagai contoh, sistem koordinat 3 dimensi diubah menjadi sistem koordinat 2 dimensi. Dalam perancangan dan pembuatan perangkat lunak ini dibatasi pada proyeksi dari 3 dimensi menjadi 2 dimensi. Proyeksi dari sebuah obyek 3 dimensi didefinisikan dengan garis proyeksi (atau disebut projector) yang bersumber dari sebuah titik proyeksi, lalu melewati setiap titik pada obyek dan memotong sebuah bidang proyeksi guna membentuk proyeksi tersebut.
Tipe proyeksi yang akan dipakai dalam perancangan dan pembuatan perangkat lunak ini dikenal sebagai planar geometric projection karena proyeksi dilakukan pada sebuah bidang datar dan bukan pada permukaan cekung serta menggunakan proyeksi lurus dan bukan proyeksi cekung. Proyeksi planar dapat dibagi menjadi dua bagian dasar: perspective dan parallel. Perbedaan antara kedua proyeksi tersebut terletak pada hubungan antara titik tengah proyeksi dengan bidang proyeksi. Suatu proyeksi dikatakan perspective jika antara titik tengah proyeksi dengan bidang proyeksi mempunyai jarak hingga atau finite.
Sedangkan jarak antara titik tengah proyeksi dengan bidang proyeksi tak hingga atau infinite maka proyeksi tersebut dikatakan parallel.
Gambar 2.1. Perbedaan antara perspective dan parallel projection
Pada gambar 2.1. kedua perbedaan antara kedua proyeksi nampak jelas.
Sebuah proyeksi disebut parallel projection apabila titik tengah proyeksi berjarak tak hingga sehingga membuat projectors menjadi parallel. Dalam mendefinisikan sebuah perspective projection, kita harus menentukan titik tengah proyeksi; untuk sebuah parallel projection kita menentukan arah dari proyeksi. Titik tengah proyeksi mempunyai bentuk koordinat (x, y, z, 1). Arah dari proyeksi adalah sebuah vektor, sehingga dapat dikalkulasi dengan mengurangkan dua titik d = (x, y, z, 1) – (x’, y’, z’, 1) = (a, b, c, 0).
Efek visual dari sebuah perspective projection mirip dengan sistem fotografi dan sistem pengelihatan manusia atau dikenal sebagai perspective foreshortening. Besar ukuran perspective projection dari sebuah obyek bervariasi dengan jarak antara obyek dengan titik tengah proyeksi. Meskipun perspective projection dari sebuah obyek tampak realistik, tapi kurang efektif untuk menampilkan bentuk asli dan pengukuran secara tepat obyek tersebut. Jarak obyek dari titik tengah proyeksi tidak dapat diambil dari proyeksi, sudut hanya bisa dipakai oleh bidang-bidang obyek yang menghadap parallel bidang proyeksi.
Parallel projection tidak menampilkan obyek serealistik perspective projection, namun proyeksi ini dapat dipakai untuk mendapatkan ukuran pasti dan garis parallel tetap parallel.
Gambar 2.2. Bagan Pembagian Proyeksi
2.1.1. Perspective Projections
Perspective projection adalah proyeksi yang menampilkan obyek 3 dimensi secara realistik dan natural. Dengan membandingkan bidang pandang dari sebuah perspective projection dengan tampilan yang terlihat dari lensa sebuah kamera, maka prinsip dasar dari perspective projection dapat dengan mudah dipahami. Layaknya tampilan dari sebuah kamera, garis-garis dalam sebuah perspective projection yang tidak parallel terhadap bidang proyeksi berkumpul pada satu titik yang disebut vanishing point. Pada saat mata atau posisi kamera dekat pada obyek, perspective foreshortening terjadi dengan jarak obyek terlihat lebih kecil dalam bidang pandang daripada obyek dengan jarak sama namun lebih dekat.
Pada metode ini obyek akan terlihat semakin kecil jika jarak dari pengamat bertambah besar. Seperti dijabarkan pada gambar 2.2, jenis-jenis perspective projection adalah :
1. 1-point perspective
2. 2nd kind of vanishing points 3. 3rd kind of vanishing points
Tiap-tiap jenis proyeksi berbeda pada orientasi bidang pandang dan jumlah vanishing points yang dimiliki obyek.
2.1.1.1. 1-Point Perspective
Dalam sebuah 1-point perspective, garis pada sebuah obyek 3 dimensi berkumpul pada sebuah vanishing point sedangkan garis yang parallel sumbu koordinat lain tetap horisontal atau vertikal dalam bidang pandang.
Gambar 2.3. Contoh Proyeksi 1-Point Perspective
2.1.1.2. 2nd Kind of Vanishing Points
Sebuah 2 point perspective memproyeksikan sebuah obyek pada bidang pandang sehingga garis-garis pada obyek tersebut parallel pada dua sumbu koordinat besar (sumbu x, sumbu y) dan berkumpul pada dua vanishing point yang berbeda. Untuk menciptakan sebuah 2-point perspective, bidang pandang di set parallel pada sebuah principal axis daripada di set pada sebuah bidang.
Gambar 2.4. Contoh Proyeksi 2nd Kind of Vanishing Points
2.1.1.3. 3rd Kind of Vanishing Points
Sebuah 3-point perspective mempunyai tiga vanishing point. Dalam kasus ini bidang pandang tidak parallel pada sumbu koordinat besar manapun.
Untuk menempatkan bidang pandang, tiap komponen pada bidang pandang normal diberikan nilai yang bukan nol sehingga bidang pandang berpotongan tiga sumbu koordinat besar. Vanishing points sering digunakan oleh pelukis untuk menonjolkan fitur atau meningkatkan efek dramatis (Hill, 1990). Namun metode ini jarang sekali digunakan.
Gambar 2.5. Multiview Drawing
2.1.2. Parallel Projections
Parallel projection dikategorikan menjadi dua tipe bergantung pada arah proyeksi dan normal bidang proyeksi. Pada proyeksi orthographic arah proyeksi dan normal bidang proyeksi adalah sama atau bertolak belakang satu dengan yang lain, sehingga arah proyeksi adalah normal terhadap bidang proyeksi. Berikut adalah gambar multiview drawing yang akan diimplementasikan dalam perangkat lunak ini.
2.2. Perhitungan Planar Geometric Projections
Pada bagian ini akan dibahas tentang perhitungan matematika dari planar geometric projections. Guna mempermudah perhitungan maka bidang
proyeksi perspektif berada pada z = d dan bidang proyeksi parallel berada pada z=0. Setiap proyeksi dapat didefinisikan dengan sebuah matrix 4x4 karena dengan menggunakan matrix, matrix proyeksi dapat digabungkan dengan matrix transformasi, sehingga dua operasi yang berbeda dapat dijadikan satu (transformasi lalu proyeksi). Dengan bidang proyeksi pada jarak d dari origin dan sebuah titik P yang akan diproyeksikan pada bidang proyeksi, maka didapatkan perbandingan:
xp
d = x z; yp
d = y
z (2.1)
Mengalikan kedua sisi dengan d akan didapatkan : xp= d x
z = x
z d
, yp= d y z = y
z d
(2.2) Berikut gambaran dari persamaan diatas:
Gambar 2.6. Perspective Projection
Jarak d adalah faktor skala yang diaplikasikan pada xp dan yp. Pembagian dengan z mengakibatkan objek yang lebih jauh pada proyeksi perspektif menjadi lebih kecil. Transformasi pada persamaan (2.2) dapat dituliskan dengan matrix 4x4 sebagai :
Mper=
1 0 0 0 0 1 0 0 0 0 1 0 0 0 1
d 0
(2.3)
Sebuah rumus alternatif untuk proyeksi perspektif adalah menempatkan bidang proyeksi pada z = 0 dan titik tengah proyeksi pada z = -d sehingga didapatkan persamaan:
xp
d = x
z + d, yp
d = y
z + d (2.4)
kemudian dikalikan dengan d, maka didapatkan:
xp= d x z + d = x
z
( )
d + 1, yp=d y z + d = y
z
( )
d + 1 (2.5)Berikut gambaran persamaan diatas:
Gambar 2.7. Alternate Perspective Projection
Matrix proyeksi dari alternate perspective projection menjadi:
M'per=
1 0 0 0 0 1 0 0 0 0 0 0 0 0 1
d 1
(2.6)
Proyeksi Orthographic pada bidang proyeksi z = 0 menjadikan arah dari proyeksi dama dengan bidang normal proyeksi, yaitu sumbu z. sehingga titik P diproyeksikan sebagai:
xp= x, yp= y, zp= 0 (2.7)
Proyeksi diwakili dengan matrix:
Mort=
1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1
(2.8)
2.3. Implementasi Planar Geometric Projections
Implementasi planar geometric projections membutuhkan beberapa parameter yang digunakan dalam perhitungan. Bidang proyeksi yang selanjutnya akan disebut bidang pandang didefinisikan oleh sebuah titik pada bidang disebut View Reference Point (VRP) dan sebuah normal pada bidang yang disebut View- Plane Normal (VPN). Kemudian kita mendifinisikan sebuah window pada view plane dengan memberikan nilai maksimum dan minimum window coordinates pada dua sumbu orthogonal. Sumbu tersebut adalah bagian dari sistem 3D viewing-reference coordinate (VRC). Origin dari sistem VRC adalah VRP. Salah satu sumbu VRC adalah VPN dan disebut sumbu n. Sumbu kedua sistem VRC adalah view up vector (VUP) yang menentukan arah sumbu v pada view plane dan sumbu terakhir ada sumbu u. Titik tengah proyeksi dan arah proyeksi (DOP) didefinisikan sebagai sebuah projection reference point (PRP). Variabel yang lain adalah front clipping planes (F) dan back clipping planes (B) dimana nilai F > B.
VRP, VPN, VUP digabungkan untuk membentuk view orientation matrix yang digunakan untuk merubah posisi di world coordinates menjadi posisi di sistem VRC.
Langkah-langkah implementasi planar geometric projections adalah sebagai berikut :
1. Ubah Koordinat 3D menjadi koordinat homogeneous.
2. Normalisasi titik-titik yang telah diubah pada langkah satu dengan normalizing transformation Npar untuk proyeksi paralel atau Nper untuk proyeksi perspektif.
3. Bagi tiap komponen hasil normalisasi dengan W untuk mengembalikan titik tersebut kembali menjadi koordinat 3D.
4. Lakukan clipping pada titik-titik 3D terhadap parallel-projection atau perspective-projection canonical view volume yang sesuai.
5. Ubah koordinat 3D menjadi koordinat homogeneous
6. Lakukan proyeksi paralel dengan menggunakan Mort atau proyeksi perspektive dengan menggunakan Mper
7. Translasi dan skala titik kedalam koordinat alat menggunakan rumus Mvv3dv
8. Bagi tiap komponen hasil perhitungan langkah (7) dengan W dari koordinat homogeneous menjadi koordinat 2D.
Secara umum gambaran dari langkah-langkah diatas adalah sebagai berikut:
Gambar 2.8. General Proses
2.3.1. Mengubah koordinat 3D menjadi koordinat Homogeneous
Langkah mengubah koordinat 3D menjadi koordinat homogeneous dilakukan dengan cara menambah variabel W yang bernilai 1 pada semua titik- titik koordinat 3D. Sehingga titik 3D yang semula berbentuk (x, y, z) dirubah menjadi (x, y, z, w) dengan nilai W = 1. Untuk mengubah koordinat homogeneous menjadi koordinat 3D cukup dengan menghilangkan variabel W dan membagi semua komponen koordinat homogeneous dengan variabel W. Titik
pada koordinat homogeneous (x, y, z, w) dirubah menjadi koordinat 3D yaitu
(x/w, y/w, z/w).
2.3.2. Transformasi Npar atau Nper
Sebelum dilakukannya proses clipping terhadap canonical view volumes perlu diadakan perhitungan guna mencari nilai Npar dan Nper yang akan mengubah parallel atau perspective projection view volume menjadi parallel dan perspective canonical view volume. Pada implementasi proyeksi disini parallel-projection view volume didefinisikan oleh 6 bidang yaitu :
x = -1, x = 1, y = -1, y = 1, z = 0, z = -1 (2.9) sedangkan untuk perspective-projection view volume didefinisikan oleh bidang:
x = z, x = -z, y = z, y = -z, z = -zmin, z = -1 (2.10) Berikut gambar dari parallel dan perspective canonical view volume :
Gambar 2.9. Canonical View Volumes
2.3.2.1.Parallel Projection
Matrix Npar digunakan pada proyeksi parallel untuk mengubah view volume pada world coordinate menjadi canonical view volume yang didefinikan sebagai :
x = -1, x = 1, y = -1, y = 1, z = 0, z = -1 (2.11)
Titik-titik yang telah ditransformasi Npar akan diclip dengan canonical view volume kemudian hasilnya diproyeksikan pada bidang z = 0, dan akhirnya ditransformasi ke viewport untuk ditampilkan. Langkah-langkah transformasi yang membuat Npar adalah sebagai berikut :
1. Translasi VRP ke origin
2. Rotasi VRC sehingga sumbu n (VPN) sejajar dengan sumbu z, sumbu u sejajar sumbu x, dan sumbu v sejajar dengan sumbu y
3. Memotong sehingga arah proyeksi sejajar dengan sumbu z
4. Mengubah titik-titik objek menjadi parallel-projection canonical view volume Langkah pertama dilakukan dengan translasi T(-VRP). Row vector dari matrix rotasi pada langkah kedua adalah unit vector yang rotasi oleh R menjadi sumbu x, y dan z. VPN dirotasi kearah sumbu z :
Rz= VPN
VPN (2.12)
Sumbu u yang tegak lurus pada VUP dan VPN adalah cross-product dari vektor unit sepanjang VUP dan Rz (searah dengan VPN), dirotasi pada sumbu x, sehingga :
Rx = VUP Rz
VUP Rz (2.13)
Begitu pula dengan sumbu v yang tegak lurus dengan Rz dan Rx dirotasi pada sumbu y menjadi :
Ry = Rz Rx (2.14)
Dari ketiga persamaan diatas dibentuklah matrix rotasi R :
R =
r
1xr
2xr
3x 0r
1yr
2yr
3y 0r
1zr
2zr
3z 00 0 0 1
(2.15)
r1x adalah elemen pertama dari Rx dan seterusnya.
Untuk langkah ketiga dilakukan dengan membuat arah proyeksi (DOP) sejajar dengan sumbu z. DOP adalah vektor dari PRP ke tengah window (CW), dan PRP adalah dalam sistem VRC. Dua langkah transformasi pertama mengubah VRC
menjadi sistem world-coordinate, sehingga PRP juga berada pada sistem world coordinate. Sehingga DOP adalah CW – PRP :
DOP = dopx dopy dopz 0
, CW =
umax+ umin vmax+ v2 min
20 1
, PRP = prpu prpv prpn 0
(2.16)
kemudian
DOP = CW PRP = umax+ umin
2
vmax+ vmin
2 0 1
T
prp
[
u prpv prpn 1]
T (2.17)Pemotongan dapat dilakukan dengan matrix :
SHpar= SHxy(shpar,shypar) =
1 0 shxpar 0 0 1 shypar 0
0 0 1 0
0 0 0 1
(2.18)
dengan koefisien shxpar dan shypar didapat dari : shxpar= dopx
dopz, shypar= dopy
dopz (2.19)
untuk proyeksi orthographic, dopx = dopy = 0, sehingga shxpar = shypar = 0 dan matrix pemotong menjadi matrix identitas.
Langkah terakhir pada proses ini adalah mengubah view volume yang telah dipotong menjadi canonical view volume. Hal ini dapat dilakukan dengan dengan translasi bagian depan tengah view volume ke origin kemudian scaling ke ukuran 2 x 2 x 1 dari canonical view volume. Transformasi yang dilakukan adalah sebagai berikut :
Tpar= T umax+ umin
2 , vmax+ vmin 2 , F
(2.20)
Spar= S 2
umax umin, 2
vmax vmin, 1 F B
(2.21)
Dari semua persamaan diatas maka matrix pembentuk Npar didapat dari :
Npar= Spar Tpar SHpar R T VRP
( )
(2.22)Npar mengubah arbitrary parallel-projection view volume menjadi parallel- projection canonical view volume sehingga membuat output primitives dapat diclip terhadap parallel-projection canonical view volume.
2.3.2.2.Perspective Projection
Matrix Nper digunakan pada proyeksi perspektif. Matrix Nper mengubah posisi di world coordinate sehingga view volume menjadi perspective projection canonical view volume. Langkah selanjutnya adalah melakukan clipping pada canonical view volume dan akhirnya hasil clipping akan diproyeksikan pada view plane dengan menggunakan matrix Mper. Langkah-langkah untuk membentuk matrix Nper adalah sebagai berikut :
1. Translasi VRP ke origin
2. Rotasi VRC sehingga sumbu n (VPN) menjadi sumbu z, sumbu u menjadi sumbu x, dan sumbu v menjadi sumbu y
3. Translasi center of projection (COP) pada PRP pada origin 4. Memotong garis tengah view volume sehingga menjadi sumbu z 5. Mengubah view volume menjadi canonical perspective view volume.
Langkah pertama dan langkah kedua sama seperti yang dilakukan pada proyeksi paralel:
R T(VRP) (2.23) Langkah ketiga adalah translasi center of projection (COP) ke origin hal ini
diperlukan untuk canonical perspective view volume. COP didapatkan relatif pada VRP dalam VRC oleh :
PRP = ( prpu, prpv, prpn) (2.24)
VRC telah ditransformasi menjadi world-coordinate pada langkah 1 dan 2 sehingga spesifikasi COP dalam VRC juga terdapat pada world coordinate. Hal ini membuat translasi pada langkah ketiga menjadi:
T(PRP) (2.25) Pada langkah keempat, tujuan pemotongan adalah untuk mengubah garis tengah
dari view volume menjadi sejajar dengan sumbu –z. Garis tengah dari view volume terletak pada PRP sampai CW (Center of Window). Sehingga arah proyeksi sama dengan proyeksi paralel, yaitu:
CW PRP (2.26) Karena alasan diatas matrix SHpar sama seperti pada proyeksi paralel. Setelah
pemotongan dilakukan batas window pada bidang proyeksi menjadi:
umax umin
2 x umax umin
2 (2.27)
vmax vmin
2 y vmax vmin
2 (2.28)
VRP sebelum langah ketiga terletak pada origin, setelah langkah ketiga dan langkah keempat dilakukan VRP menjadi VRP’ :
VRP'= SHpar T(PRP) 0 0 0 1
[ ]
T (2.29)komponen z dari VRP’, disebut vrp’z, sama dengan –prpn, karenan pemotongan (x,y) SHpar tidak berpengaruh pada koordinat z.
Langkah terakhir adalah scaling pada ketiga sumbu untuk membuat canonical view volume:
x = z, x = -z, y = z, y = -z, z = -zmin, z = -1 (2.30) Scaling dilakukan dalam dua langkah. Langkah pertama adalah scaling window sehingga tinggi dan lebarnya menjadi setengah dari –vrp’z :
2 vrp'z umax umin
( )
,2 vrp'z vmax vmin
( )
(2.31)Untuk langkah kedua ketiga sumbu discaling secara seragam sehingga back clipping plane pada:
z = vrpz'+B (2.32)
menjadi bidang z = -1. Faktor scaling untuk langkah kedua ini adalah:
1 vrpz'+B
( )
(2.33)Dengan menggabungkan kedua langkah diatas akan didapatkan persamaan berikut:
Sper= S 2vrpz' umax umin
( ) (
vrpz'+B)
,2vrpz' vmax vmin
( ) (
vrpz'+B)
,1 vrpz'+B
(2.34) Mengaplikasikan scaling pada z mengubah posisi bidang proyeksi dan bidang clipping menjadi posisi baru:
zproj= vrpz'
vrpz'+B, zmin= vrpz'+F
vrpz'+B, zmax= vrpz'+B
vrpz'+B= 1 (2.35) Sebagai kesimpulan, matrix Nper yang mengubah perspective-projection view
volume menjadi perspective-projection canonical view volume didapatkan dari:
Nper= Sper SHpar T PRP
( )
R T VRP( )
(2.36)2.3.3. Clipping terhadap canonical view
Canonical view volume adalah unit cube untuk proyeksi paralel dan truncated right regular pyramid untuk proyeksi perspektif. Algoritma clipping Cohen-Sutherland dan Cyrus-Beck dapat diperluas untuk titik-titik 3D. Berikut algoritma yang dipakai untuk clipping canonical view pada perangkat lunak yang dikembangkan:
function CLIPt (denom,num:real; var tE,tL:real):boolean;
var t:real;
accept:boolean; {accept will be returned as value of Clipt;
accept line until find otherwise}
begin
accept := true;
if denom > 0 then {PE intersection}
begin
t := num/denom; {Value of t at the intersection}
if t > tL then {tE and tL crossover}
accept := false {so prepare to reject the line}
else if t > tE then {A new tE has been found}
tE := t end
else if denom < 0 then {PL intersection}
begin
t := num/denom; {Value of t at the intersection}
if t < tE then {tE and tL crossover}
accept := false {so prepare to reject the line}
else if t < tL then {A new tL has been found}
tL := t end
else
if num > 0 then
accept := false; {Line on outside of edge}
CLIPt := accept end; {CLIPt}
procedure Clip3D (var x0,y0,z0,x1,y1,z1,zmin:real;
var accept:boolean);
var tmin,tmax:real; dx,dy,dz:real;
begin {Clip3D}
accept := false;
tmin := 0;
tmax := 1;
dx := x1-x0;
dz := z1-z0;
if CLIPt(-dx-dz,x0+z0,tmin,tmax) then if CLIPt(dx-dz,-x0+z0,tmin,tmax) then
begin
dy := y1-y0;
if CLIPt(dy-dz,-y0+z0,tmin,tmax) then if CLIPt(-dy-dz,y0+z0,tmin,tmax) then
if CLIPt(-dz,z0-zmin,tmin,tmax) then if CLIPt(dz,-z0-1,tmin,tmax) then
begin
accept := true;
if tmax < 1 then begin
x1 := x0+tmax*dx;
y1 := y0+tmax*dy;
z1 := z0+tmax*dz;
end;
if tmin > 0 then begin
x0 := x0+tmin*dx;
y0 := y0+tmin*dy;
z0 := z0+tmin*dz;
end;
end;
end;
end {Clip3D}
2.3.4. Mapping titik pada Viewport
Output primitives telah di-clipped dalam normalized projection coordinate system yang disebut 3D coordinate system. Akibat dari proses normalisasi tersebut koordinat dari semua output primitives akan berada dalam view volume -1 x 1, -1 y 1, -1 z 0. Dalam pembuatan perangkat lunak ini koordinat (0,0) layar akan terletak di pojok kiri bawah. Sebagai contoh pada sebuah layar yang mempunyai resolusi horisontal sebesar 1024 dan resolusi vertikal sebesar 800, bidang tampilan yaitu: 0 x 799, 0 y 799. Titik dalam layar ditampilkan dengan mengabaikan koordinat z-nya. Sehingga titik (0.5, 0.75, 0.46) akan ditampilkan pada koordinat layar di (400,599). Koordinat z pada setiap output primitive digunakan untuk menentukan titik-titik yang terlihat dan titik- titik yang tertutup oleh primitive yang lebih besar dari z. Mapping dari cannonical parallel projection view volume pada 3D viewport dapat dilakukan dengan 3
proses. Langkah pertama yaitu mentranslasi canonical parallel projection view volume ke koordinat (-1, -1, -1). Langkah selanjutnya adalah men-skala view volume tersebut sebesar ukuran 3D viewport dengan mengunakan rumus :
S Xv. max Xv. min
2 ,Yv. max Yv. min
2 ,Zv. max Zv. min
2
(2.37)
Akhirnya view volume yang telah di scalling ditranslasi ke pojok kanan bawah dari viewport dengan translasi:
T x
(
v. min, yv. min,zv. min)
(2.38)Sehingga mapping pada viewport dapat dilakukan dengan persamaan:
Mvv3dv = T x( v. min, yv. min,zv. min) S xv. max xv. min
2 ,yv. max yv. min
2 ,zv. max zv. min 1
T 1,1,1( ) (2.39)
2.4. OpenGL
OpenGL (Open Graphics Library) adalah adalah suatu API (Application Programming Interface) untuk berbagai macam bahasa pemrograman yang dapat digunakan untuk membuat aplikasi 3D Computer Graphics maupun 2D Computer Graphics. Interface OpenGL mencakup 250 fungsi yang dapat digunakan untuk membuat aplikasi 3D Computer Graphics mulai dari yang sederhana hingga yang amat kompleks.
OpenGL adalah suatu interface program untuk mengakses fungsi-fungsi yang disediakan oleh driver suatu hardware graphics card untuk komputer. Jadi OpenGL memanfaatkan graphics card untuk melakukan perhitungan seperti rendering, shading, lightning, rotation, translation, yang bila tanpa adanya OpenGL, fungsi-fungsi harus dibuat secara manual dengan rumus-rumus matematika yang sudah dijelaskan di atas. Dengan perhitungan yang dilakukan secara hardware oleh graphics card, hasilnya adalah sesuatu yang lebih cepat dan lebih bagus untuk digunakan dalam pembuatan aplikasi 3D.
OpenGL sebenarnya merupakan pengembangan dari IRIS GL interface.
Kode IRIS GL hanya mendukung akses pada fungsi yang ada pada hardware saja, sehingga bila suatu aplikasi membutuhkan misalnya texture mapping, tetapi hardware tidak mendukungnya, maka IRIS GL tidak dapat menjalankan aplikasi
itu. OpenGL merupakan pengembangan lebih lanjut dari IRIS GL agar dapat mengatasi masalah seperti itu dengan menyediakan fungsi misalnya texture mapping secara software sehingga aplikasi tetap dapat berjalan.
OpenGL dibuat untuk dapat mendukung banyak bahasa pemrograman, diantaranya adalah Java, Fortran, Pike, Perl, Ada, Phyton, Delphi, Visual Basic, Visual C++, dan masih banyak lagi. OpenGL juga didukung oleh berbagai macam sistem operasi seperti Windows, UNIX dan MacOS.
OpenGL didesain khusus untuk menjadi program yang hanya dapat menampilkan output, yaitu menyediakan fungsi-fungsi rendering. Inti interface OpenGL tidak menyediakan konsep sistem windows, audio, printing, keyboard mouse, atau input devices yang lain. Kode program OpenGL dapat dikatakan berdiri sendiri tanpa campur tangan sistem operasi.
Fungsi-fungsi openGL yang akan digunakan dalam perancangan dan pembuatan perangkat lunak hanya sebatas penggambaran saja, dan digunakan hanya untuk mendapatkan gambaran yang jelas tentang objek original yang sedang diproyeksikan. Fungsi openGL yang dipakai antara lain adalah gluOrtho2d(); glMatrixMode(); glVertex3D(); glClearColor().
2.5. Quartz
Quartz adalah dasar dari kemampuan grafis dua dimensi dari Cocoa.
Quartz menyediakan berbagai macam kemampuan grafis termasuk management warna, path-based drawing, transparency dan anti-aliasing. Quartz pada dasarnya adalah dua buah perangkat lunak dalam Mac OSX yaitu Quartz Compositor dan Quartz 2D. Quartz Compositor adalah servis sistem dasar yang mengatur penggambaran graphical user interface ke layar dari berbagai macam sumber seperti Quartz 2D, QuickTime, OpenGL, dan QuickDraw. Quartz 2D adalah sebuah Application Programming Interface (API) yang digunakan untuk menggambar dan memanipulasi grafik dua dimensi.
Sistem koordinat yang dipakai oleh Quartz 2D diimplementasikan pada sebuah instance dari NSView. Setiap view mempunyai sistem koordinatnya
masing-masing. Secara default, titik (0,0) terletak di pojok kiri bawah dari view dan semakin keatas maka nilai y akan semakin besar serta semakin ke kanan maka nilai x akan semakin besar. Sistem koordinat ini tidak terikat pada jenis-jenis output tertentu, melainkan digambarkan dalam istilah points (satu unit sama dengan 1/72 inchi dan satu point equivalen dengan satu pixel layar). Sistem koordinat dalam Quartz menggunakan tipe data NSPoint. Tipe data ini mempunyai member variabel X dan Y serta diperlukan oleh tipe data NSBezierPath sebagai parameter.
Tipe data yang akan digunakan dalam pembuatan perangkat lunak disini adalah NSBezierPath. Tipe data ini menyimpan titik-titik dan garis-garis yang akan digambar ke layar. Dengan menggunakan perintah [garis stroke]; maka titik dan garis yang telah didefinisikan dalam instance variabel garis akan ditampilkan ke layar.
2.6. Object-oriented Programming
Masalah utama dalam pemrograman makin meningkat dan program yang besar menimbulkan kompleksitas. Hal ini memungkinkan program akan memiliki kesalahan, sehingga biaya akan besar disebabkan oleh perangkat lunak yang salah.
Pemrograman berorientasi objek menawarkan cara baru yang baik untuk mengatasi kesulitan tersebut.
Gagasan dasar pemrograman berorientasi objek adalah menggabungkan data dengan fungsi. Dalam objective-C fungsi objek disebut member function yang dapat memanggil suatu anggota untuk mengakses suatu objek. Fungsi ini mengakses data data dan mengembalikan nilai. Data dan fungsi terbungkus pada suatu entri tunggal, data terlindung dari akses yang dilakukan oleh fungsi lain yang tidak dikehendaki.
Pada saat memecahkan suatu masalah dengan pemrograman berorientasi objek, tidak dipikirkan bagaimana pemecahan masalah tersebut dapat diimplementasikan kedalam fungsi tetapi perhatian lebih ditujukan pada pemecahan masalah menjadi objek. Dalam pemrograman berorientasi pada objek perlu diperhatikan apa saja yang dapat menjadi objek.
2.7. Cocoa Framework
Framework adalah sekumpulan kelas yang dikompilasi menjadi sebuah library dan dapat digunakan untuk merancang dan mengimplementasi perangkat lunak tanpa harus menulis kembali kode yang sama berulang-ulang. Cocoa adalah sekumpulan kelas atau framework dan API untuk membuat aplikasi serta tools di sistem operasi Mac OSX. Cocoa dibagi menjadi dua framework inti: foundation framework dan application kit. Foundation framework menyediakan kumpulan kelas guna mendefinisikan tipe data, akses ke servis sistem operasi, threading, messaging dan lain-lain. Application kit adalah kumpulan kelas yang berhubungan dengan graphical user interface (GUI). Application kit menyediakan akses ke komponen aqua interface standard seperti menu, tombol, combo box dan lain-lain.
Cocoa menggunakan banyak design pattern. Design pattern adalah deskripsi dari implementasi object-oriented programming umum. Perancangan dan pengembangan perangkat lunak yang efektif membutuhkan ketepatan penggunaan design tersebut dalam cocoa. Beberapa design pattern yang ada dalam cocoa antara lain: delegation, singleton, notification, model-view- controller, target/action, responder chain, key-value coding. Berikut akan dijabarkan satu persatu mengenai design pattern tersebut diatas.
2.7.1. Delegation
Pada pattern ini sebuah objek berperilaku seperti objek lain yang didelegasikan. Delegasi digunakan untuk mengubah perilaku dari sebuah objek yang didelegasikan. Hal ini dilakukan dengan cara menulis ulang metode-metode yang ada pada objek yang didelegasikan. Delegasi meminimalisasi kebutuhan untuk men-subclass objek guna memperluas fungsionalitas objek tersebut.
2.7.2. Singleton
Pattern ini menjaga agar tidak terjadi duplikasi instance suatu objek dalam sistem. Metode singleton adalah sebuah konstruktor objek yang membuat sebuah instance dari sebuah kelas serta menjaga referensi ke objek tersebut.
Setelah konstruktor dipanggil akan memberikan nilai kembalian berupa objek itu sendiri, daripada menciptakan objek baru.
2.7.3. Notification
Notifikasi menyediakan sebuah mekanisme distribusi informasi tentang event yang terjadi dalam sebuah aplikasi. Notifikasi adalah alternatif dari messaging dengan tujuan komunikasi antar objek. Messaging membutuhkan pengirim pesan mengetahui penerima pesan pada saat pesan tersebut dikirim.
Sistem notifikasi dengan efektif memilah pesan pengirim dan pesan penerima.
Pengirim mengirimkan pesan ke sebuah notification centre lalu pesan tersebut dikirim ke objek yang disebut observer yang berminat menerima pesan dari pengirim.
2.7.4. Model-View-Controller
Pattern ini memilah sebuah aplikasi menjadi unit-unit logikal. Model pattern menangani data-data dari aplikasi. View pattern bertanggung jawab untuk menampilkan data dari model pattern untuk user. Controller pattern bertugas sebagi penghubung antara model pattern dan view pattern. Tugas dari controller pattern adalah mengambil data dari model kemudian diteruskan ke view agar dapat ditampilkan. Jika view dapat menerima input dari user secara interaktif, controller akan menterjemahkan action dan menginstruksikan data model untuk merespon action tersebut.
2.7.5. Target/action
Application kit menggunakan pattern ini untuk memisahkan user interface dari kode yang dijalankan pada saat user mengaktifkan kontrol tersebut.
Pada pattern ini, sebuah kontrol menyimpan referensi ke sebuah target objek yang menerima action message. Action message ini disimpan dalam bentuk selector dalam sebuah instance variable dari control objek. Pada saat user mengaktifkan kontrol, action message dikirim ke target.
2.7.6. Responder Chain
Responder chain adalah sekumpulan objek NSResponder yang berhubungan. Responder chain memungkinkan objek untuk dapat merespon sebuah event atau action. Pada saat sebuah event atau action muncul, responder chain mengirim pesan ke first responder, dimana first responder ini diberikan kesempatan untuk merespon pertama kali event atau action tersebut. Jika first responder tidak dapat merespon maka pesan tersebut akan diteruskan ke objek responder berikutnya yang ada dalam rantai. Hal ini dilakukan terus sampai ada objek yang dapat merespon pesan tersebut atau akhir dari responder chain.
2.7.7. Key-value coding
Key-value coding memungkinkan programmer mengakses properti dari objek secara langsung dengan menggunakan keys. Meskipun key-value coding dapat mengakses instance variable secara langsung, key-value coding mencoba menggunakan accessor methods untuk mengakses sebuah properti. Dengan adanya key-value coding ini user, tidak perlu lagi menuliskan kode untuk accessor methods. Hal ini akan dilakukan secara otomatis oleh cocoa.
2.8. Objective-C
Objective-C adalah bahasa yang sangat dinamis, bahasa object-oriented yang berbasis pesan. Objective-C memiliki fitur-fitur seperti dynamic dispatch, dynamic typing dan dynamic loading sehingga mensupport design pattern yang digunakan oleh cocoa. Objective-C merupakan ekstensi dari bahasa C sehingga kode-kode dan librari yang ditulis dalam bahasa C dapat digabung dengan aplikasi berbasis cocoa tanpa harus mengubah design awal dari pengembangan perangkat lunak berbahasa C. Berikut akan dijabarkan satu persatu tentang objective-C.
2.8.1. Objects
Hal yang paling mendasar dalam semua bahasa object-oriented adalah objek. Sebuah entiti yang menghubungkan data dengan operasi-operasi yang dapat dilakukan pada data tersebut. Objective-C menyediakan sebuah tipe data umum yaitu id. Id didefinisikan sebagai pointer terhadap sebuah data objek yang
memungkinkan seorang programmer untuk dapat bekerja dengan objek. Sebuah objek dapat dideklarasikan dalam kode sebagai berikut:
id anObject;
Untuk semua konstruktor dari object-oriented berbasis objective-C termasuk nilai kembalian dari metode, id menjadi nilai kembalian yang default.
Tipe id memberikan kebebasan kepada programmer untuk mendefinisikan tipe data yang abstrak, meskipun programmer tersebut tidak tahu pasti tipe data yang didefinisikan. Id hanya memberikan sedikit informasi tentang suatu objek dan hanya menandakan bahwa objek tersebut adalah entiti dalam sebuah sistem yang dapat merespon pesan. Perilaku seperti ini dikenal sebagai dynamic typing, mengijinkan sistem untuk mencari kelas milik objek dan mengirim pesan pada metode.
Objective-C juga mendukung static typing, yaitu mendefinisikan sebuah variabel dengan menggunakan pointer ke tipe kelasnya sendiri, contoh:
NSObject *object;
Deklarasi varibel seperti diatas menghemat waktu pengecekan kompilasi. Tetapi tidak seperti bahasa pemrograman lain, static typing pada objective-C hanya dipakai pada saat kompilasi. Pada runtime, semua objek dianggap sebagai tipe id guna menjaga dinamisme dalam sistem.
2.8.2. Messaging
Message atau pesan adalah sebuah request untuk melakukan tindakan tertentu. Objek dalam objective-C berjumlah banyak, independen, entiti abstrak dalam ruang lingkup sebuah program. Objek ini bukanlah kontainer pasif untuk perilaku tertentu ataupun koleksi data dan fungsi yang dapat diaplikasikan ke data tersebut. Objective-C mengijinkan pesan apapun diteruskan ke objek apapun.
Objek diharapkan merespon pada runtime dengan perilaku yang sesuai. Kejadian seperti ini disebut dynamic binding. Pada saat sebuah objek menerima sebuah pesan pada runtime, objek tersebut dapat melakukan satu dari tiga hal dibawah ini:
• Melakukan fungsi yang diminta jika objek tersebut dapat melaksanakan fungsi tersebut.
• Meneruskan pesan pada objek lain yang mungkin tahu bagaimana melakukan aksi yang diminta.
• Memberikan peringatan yang menyatakan bahwa objek tidak tahu bagaimana merespon pesan.
Objek tahu bagaimana meneruskan pesan tanpa harus mengetahui bagaimana cara objek lain bekerja.
Struktur pesan dalam objective-C diapit dalam sebuah kurung siku dengan susunan objek penerima pesan diikuti pesan yang akan dikirim serta argumen jika ada. Sebagai contoh pesan dapat diekspresikan sebagai “kirimkan pesan play ke objek yang diidentifikasikan oleh variabel iPod”.
[iPod play];
Argumen dalam pesan ditulis setelah titik dua setelah nama pesan. Contoh: untuk mengubah volume dari objek iPod kita mengirim pesan sebagai berikut:
[iPod setVolume:12];
Jika pesan mengandung banyak argumen, argumen dipisahkan dengan spasi.
[iPod usePlaylist:@”Techno” shuffle:YES];
Nama dari pesan ini adalah usePlaylist:shuffle:. Titik dua merupakan bagian dari metode.
Pada saat pesan dikirim ke objek, sebuah pencarian dilakukan untuk menentukan metode-metode yang seharusnya dipanggil. Logika pencarian disini yaitu:
• Runtime mencari target objek dari pesan untuk menentukan kelas objek.
• Jika kelas berisi sebuah instance method dengan nama yang sama dengan pesan, maka metode tersebut akan diekseskusi.
• Jika kelas tidak mempunyai metode, pencarian akan dilanjutkan ke superclass. Jika sebuah metode dengan nama yang sama dengan pesan ditemukan dalam superclass, metode tersebut akan dieksekusi.
Pencarian ini terus berlanjut sampai ditemukan metode yang sesuai.
• Jika tidak ditemukan metode yang sesuai, objek penerima akan menerima pesan forwardInvocation:. Jika objek mengimplementasikan pesan ini, maka objek tersebut memiliki kemampuan untuk menyelesaikan masalah.
2.8.3. Classes
Objek dalam objective-C disebut class. Kelas baru suatu objek adalah spesialisasi dari objek yang lebih general. Setiap kelas baru adalah akumulasi dari definisi kelas yang diturunkan dan dapat diperluas dengan cara menambah metode baru dan varibel kelas baru atau mendefinisi ulang metode yang telah ada untuk melakukan atau menambah fungsionalitas. Objective-C adalah single inheritance language yang berarti bahwa sebuah kelas hanya dapat diturunkan dari satu kelas yang lain.
Pada objective-C, kelas didefinisikan dalam dua bagian dan dipisahkan dalam dua file yang berbeda:
• Interface : berisi deklarasi metode kelas dan instance variable serta nama dari superclass. Interface ditulis pada sebuah file dengan suffix .h
#import <Cocoa/Cocoa.h>
@interface Song : NSObject { id titile;
}
- (id)title;
- (void)setTitle:(id)aTitle;
@end;
Diatas adalah contoh isi dari file interface.
• Implementation : berisi kode yang mendefinisikan metode-metode dari kelas. Implementation ditulis pada sebuah file dengan suffix .m
#import Song.h
@implementation Song
- (id)title {
return title;
}
- (void)setTitle:(id)aTitle {
[title autorelease];
title = [aTitle retain];
}
@end;
Untuk membuat sebuah objek baru digunakan perintah alloc lalu diikuti perintah init. Pada saat objek dibuat, memori akan dialokasikan dan instance variable diinisialisasi. Contoh bagaimana membuat objek baru:
Song aSong = [[song alloc] init];