PENGEMBANGAN TOOL PENCAHAYAAN 3D
BERBASIS ARRAY DENGAN MAXSCRIPT
ANDI SASMITA
DEPARTEMEN ILMU KOMPUTER
FAKULTAS MATEMATIKA DAN ILMU PENGETAHUAN ALAM
INSTITUT PERTANIAN BOGOR
BOGOR
2009
PENGEMBANGAN TOOL PENCAHAYAAN 3D
BERBASIS ARRAY DENGAN MAXSCRIPT
ANDI SASMITA
Skripsi
Sebagai salah satu syarat untuk memperoleh gelar
Sarjana Komputer pada
Departemen Ilmu Komputer
DEPARTEMEN ILMU KOMPUTER
FAKULTAS MATEMATIKA DAN ILMU PENGETAHUAN ALAM
INSTITUT PERTANIAN BOGOR
BOGOR
2009
ABSTRACT
ANDI SASMITA. Development of Array-Based 3D Lighting Tool using MAXScript. Under the supervision of AHMAD RIDHA.
Array lighting uses a group of lights behaving and functioning as a single light. This method can be used to simulate the effect of global illumination in less time. In this research, Cylight, an array-based 3D lighting tool with tubular geometry, is developed using MAXScript. The image quality comparison to global illumination using Scanline and mental ray is conducted through an online survey using six 3D scenes. 98 respondents participated to determine the realistic level for each rendered scene with a value between 1 to 5. The rendering time is also measured. The results show that Scanline produces the best image quality, but not significantly different compared to Cylight. On the other hand, Cylight is significantly faster, taking less than 10% of Scanline's rendering time.
Judul : Pengembangan Tool Pencahayaan 3D Berbasis Array dengan MAXScript Nama : Andi Sasmita
NRP : G64051082
Menyetujui:
Pembimbing
Ahmad Ridha, S.Kom, M.S. NIP 19800507 200501 1 001
Mengetahui:
Dekan Fakultas Matematika dan Ilmu Pengetahuan Alam Institut Pertanian Bogor
Dr. Drh. Hasim, DEA NIP 19610328 198601 1 002
PRAKATA
Puji syukur Penulis panjatkan kepada Allah Subhanahu wa Ta’ala atas segala rahmat dan karunia-Nya sehingga tulisan ini berhasil diselesaikan. Tulisan ini merupakan hasil penelitian Penulis sebagai salah satu syarat untuk memperoleh gelar Sarjana Komputer di Departemen Ilmu Komputer Institut Pertanian Bogor (IPB).
Terima kasih Penulis ucapkan kepada orang tua Penulis yaitu pasangan Bapak Sarwani Gunawan Sasmita dan Ibu Halimah yang selalu memberikan motivasi, semangat, moril, dan materiil. Ucapan terima kasih dan penghargaan yang setinggi-tingginya Penulis sampaikan kepada Bapak Ahmad Ridha, S.Kom, M.S. selaku pembimbing dan teman-teman satu bimbingan atas dukungannya kepada Penulis selama penelitian berlangsung. Terima kasih kepada Bapak Endang Purnama Giri selaku penguji pertama serta Bapak Firman Ardiansyah selaku penguji kedua tugas akhir ini. Penulis juga mengucapkan terima kasih kepada Ibu Dr. Ir. Sri Nurdiati, M.Sc. selaku Ketua Departemen Ilmu Komputer sekaligus pembimbing akademik Penulis ketika tingkat dua dan tiga yang selalu memberikan arahan dan wejangan. Terima kasih banyak kepada para dosen pengajar yang telah mendidik, membina, serta mengajar selama Penulis berada di Departemen Ilmu Komputer.
Ucapan terima kasih juga Penulis sampaikan kepada saudara Fajar Jumat, S.Si., Bapak Prima Hadi Putra, Abdullah, Wahyu, Nandar, Haris, teman-teman Ilkomerz 42, pengurus HIMALKOM FMIPA IPB, teman-teman BANKERZ, adik-adik mahasiswa angkatan 43 yang selalu memberi inspirasi dan semangat, serta kakak-kakak mahasiswa angkatan 41 yang selalu memberi pengarahan. Terima kasih kepada teman-teman di Edensor, teman-teman Tahu Logay SMAN 1 Bogor, teman-teman FORKOM SMAN 1 Bogor, adik-adik di SMAN 1 Bogor, dan adik-adik di SMA Smart Ekselensia Indonesia.
Banyak sekali yang membantu penyelesaian penelitian ini baik secara langsung maupun tidak langsung. Penulis meminta maaf karena tidak dapat disebutkan satu per satu. Penulis menyadari bahwa pelaksanaan penelitian ini masih jauh dari kesempurnaan, namun besar harapan Penulis bahwa yang telah dikerjakan dapat memberikan manfaat bagi semua pihak.
Bogor, Agustus 2009
RIWAYAT HIDUP
Penulis dilahirkan di Bogor pada tanggal 31 Januari 1987 yang merupakan anak pertama dari tiga bersaudara dengan ayah bernama Sarwani Gunawan Sasmita dan ibu bernama Halimah. Pada tahun 2005 Penulis lulus dari Sekolah Menengah Atas Negeri 1 Bogor dan diterima di Departemen Ilmu Komputer Institut Pertanian Bogor melalui jalur Undangan Seleksi Masuk IPB (USMI) pada tahun yang sama.
Selama menjadi mahasiswa Penulis juga aktif di Himpunan Mahasiswa Ilmu Komputer (HIMALKOM) sebagai Ketua Divisi Multimedia dan Ketua Badan Kerohanian Ilkomerz (BANKERZ). Di luar itu Penulis juga aktif mengikuti kepanitiaan acara Pesta Sains 2007 yang diadakan oleh BEM FMIPA IPB. Penulis juga menjadi staf pengajar pengayaan Desain Grafis di SMA Smart Ekselensia Indonesia sejak tahun 2008.
iv DAFTAR ISI Halaman DAFTAR TABEL ... v DAFTAR GAMBAR ... v DAFTAR LAMPIRAN ... v PENDAHULUAN Latar Belakang ... 1 Tujuan ... 1 Ruang Lingkup ... 1 Manfaat Penelitian ... 1 TINJAUAN PUSTAKA Autodesk® 3ds Max® ... 1 MAXScript ... 1
Global Illumination (GI) ... 1
Rendering ... 2
Standard Lights ... 2
Array Lighting ... 2
Analisis Ragam ... 2
Uji Lanjutan Duncan ... 3
METODOLOGI PENELITIAN Studi Pustaka ... 3
Desain Tool ... 3
Pengembangan Tool ... 3
Rilis dan Pengujian ... 3
HASIL DAN PEMBAHASAN Studi Pustaka ... 4
Desain Tool ... 4
Pengembangan Tool ... 5
Rilis dan Pengujian ... 6
KESIMPULAN DAN SARAN Kesimpulan ... 8
Saran ... 8
DAFTAR PUSTAKA ... 8
v
DAFTAR TABEL
Halaman
1 Tabel ANOVA satu arah ... 2
2 Hasil pengujian waktu render ... 6
3 ANOVA berdasarkan waktu render ... 6
4 Uji lanjutan Duncan waktu render ... 7
5 Sebaran usia responden ... 7
6 Responden yang bermain game 3D ... 7
7 ANOVA berdasarkan rank ... 7
8 Uji lanjutan Duncan berdasarkan rank... 8
DAFTAR GAMBAR Halaman 1 Dome array. ... 2
2 Metodologi penelitian. ... 3
3 Alur pengujian. ... 4
4 Antarmuka pengguna Cylight. ... 5
5 Cylight di viewport 3ds Max... 6
6 Grafik nilai tengah waktu render. ... 7
7 Perbandingan hasil render tiga metode pencahayaan. ... 7
8 Grafik nilai tengah rank. ... 8
DAFTAR LAMPIRAN Halaman 1 Ilustrasi penggunaan parameter pencahayaan pada target spot ... 10
2 Script Cylight ... 11
3 Pengujian waktu render ... 24
4 Parameter-parameter metode pencahayaan ... 25
5 Kuesioner ... 26
6 Demografi dan mental model responden ... 36
1
PENDAHULUAN
Latar Belakang
Bidang Computer Graphics (CG) saat ini sudah berkembang sangat pesat sehingga menghasilkan visualisasi yang mendekati objek aslinya. Hal ini tidak lepas dari peran pencahayaan karena melalui cahaya kita dapat mempersepsikan warna, bentuk, dan tekstur dari sebuah objek.
Dua pendekatan yang umum digunakan untuk menghasilkan visualisasi 3D adalah local
illumination dan global illumination. Global illumination (GI) menghasilkan visualisasi yang
lebih realistis dibandingkan dengan pendekatan
local illumination. Hal tersebut dikarenakan GI
tidak hanya menghitung cahaya langsung (direct illumination) tetapi juga cahaya tidak langsung (indirect illumination) (Brooker 2008).
Selain menghasilkan citra yang realistis, efek pencahayaan perlu dikerjakan secepat mungkin, idealnya dengan kecepatan 30 citra setiap detiknya. Sayangnya belum ada algoritme GI yang dapat memenuhi kedua tujuan tersebut (Brooker 2008).
Untuk itu dibutuhkan aplikasi atau tool yang dapat menghasilkan efek mirip GI dengan waktu render yang lebih cepat dari tool GI yang tersedia. Teknik yang umum dipakai untuk membuat GI tiruan adalah dengan menempatkan sejumlah sumber cahaya di sekeliling objek 3D. Teknik ini dikenal dengan sebutan array lighting. Geometri yang seringkali dipakai untuk array lighting adalah kubah (dome). Dalam penelitian ini dikembangkan tool dengan geometri silinder (tubular).
Tujuan
Tujuan utama dari penelitian ini adalah: 1. Mengembangkan tool dengan menggunakan
metode array lighting sehingga objek seperti mendapat efek GI.
2. Membandingkan kinerja tool yang dibuat dengan beberapa metode GI lain.
Ruang Lingkup
Ruang lingkup penelitian ini difokuskan pada pembuatan tool pencahayaan dengan menggunakan MAXScript yang terintegrasi dengan Autodesk 3ds Max. Cahaya tersebut memiliki beberapa parameter yang dapat ditentukan oleh pengguna yaitu step, color,
multiplier, hotspot, dan overshoot. Sedangkan
untuk bayangan parameternya adalah color,
density, bias, map size, dan sample range.
Penelitian mengenai GI untuk interior telah dilakukan oleh (Boyles et al. 2009). Berbeda dengan penelitian tersebut, penelitian ini membahas penerapan teknik pencahayaan GI tiruan untuk lingkungan eksterior atau objek yang tidak dibatasi ruangan. GI tiruan dibuat dengan menggunakan array lighting dengan geometri silinder. Penelitian ini tidak membahas kompleksitas algoritme GI yang dibandingkan. Pengujian dilakukan pada aspek seberapa realistis citra yang dihasilkan serta seberapa cepat waktu rendering-nya.
Manfaat Penelitian
Tool ini bermanfaat untuk membuat efek GI
tiruan di 3ds Max dengan waktu relatif cepat sehingga dapat digunakan di industri ataupun bidang yang membutuhkan visualisasi 3D yang realistis.
TINJAUAN PUSTAKA
Autodesk® 3ds Max®
Salah satu perangkat lunak yang seringkali digunakan dalam pemodelan atau visualisasi 3D adalah Autodesk® 3ds Max®. Model 3D yang dibuat di 3ds Max terdiri dari data geometri yang direpresentasikan pada sistem koordinat Cartesian atau disebut world space. Model yang dibuat juga memiliki data mengenai material dari setiap objek serta cahaya yang digunakan (Derakhshani et al 2007).
MAXScript
MAXScript adalah built-in scripting language yang digunakan di Autodesk® 3ds Max®, Autodesk® 3ds Max® Design dan Autodesk® VIZ. Karena itu MAXScript hanya dapat digunakan jika 3ds Max atau VIZ dijalankan. MAXScript memiliki kemampuan untuk mengontrol dan melakukan proses
modeling, animasi, material, rendering, dan
beberapa fitur lainnya dari aplikasi Autodesk (Derakhshani et al. 2007).
Global Illumination (GI)
Global illumination adalah model pencahayaan yang dihasilkan dari cahaya langsung yang datang ke permukaan objek atau biasa disebut direct illumination dan cahaya tidak langsung atau biasa disebut indirect
2 dari cahaya yang datang dari pantulan
permukaan objek lain.
Algoritme GI yang umum dikenal adalah
ray-tracing dan radiosity. Keduanya terintegrasi
dengan sistem rendering (renderer).
Ray-tracing adalah salah satu algoritme GI pertama
yang dikembangkan. Kelemahan dari algoritme ini adalah prosesnya yang lambat untuk lingkungan yang relatif kompleks serta tidak memperhitungkan indirect illumination. Untuk mengatasi hal tersebut dikembangkan algoritme
radiosity (Brooker 2008).
Rendering
Rendering adalah proses yang menggabungkan model geometris dengan deskripsi permukaan, pencahayaan, dan data lainnya untuk membuat citra visual. Perangkat lunak atau komponen untuk melakukan
rendering disebut renderer (Brooker 2008).
Scanline adalah salah satu renderer di 3ds Max. yang di dalamnya terdapat Light Tracer untuk membuat efek GI sama halnya dengan
ray-tracing (Murdock 2008). Berbeda dengan
ray-tracing, Light Tracer tidak dibuat untuk
menghitung hasil render yang akurat tetapi dapat menghasilkan citra yang realistis tanpa mengorbankan banyak waktu. Light Tracer tepat untuk digunakan pada lingkungan eksterior. Salah satu renderer lainnya di 3ds Max adalah mental ray (mr) yang dapat membuat pencahayaan yang akurat seperti
raytraced reflections/refractions, caustics, dan global illumination (Brooker 2008).
Standard Lights
Standard Lights adalah cahaya dalam 3ds
Max yang menyimulasikan cahaya sebenarnya dalam dunia nyata. Ada delapan tipe Standard
Lights yang dapat digunakan di 3ds Max yaitu Target Spotlight, Free Spotlight, Target Directional Light, Free Directional Light, Omni Light, Skylight, mr Area Omni Light, dan mr Area Spotlight. Setiap tipe cahaya memiliki
parameter tersendiri yang dapat disesuaikan menyerupai kondisi aslinya (Derakhshani et al. 2007).
Array Lighting
Array lighting merupakan sumber cahaya
dari segala arah dengan menggunakan geometri tertentu yang menghasilkan efek GI tiruan. Setiap bentuk array menghasilkan efek pencahayaan yang berbeda. Bentuk geometri yang umum dipakai adalah bentuk diamond,
pyramid, dome, ring, box, tubular, maupun
kombinasi dari tipe-tipe tersebut (Gallardo
2001). Gambar 1 menunjukkan salah satu geometri berbentuk dome.
Gambar 1 Dome array.
Analisis Ragam
Analisis ragam atau Analysis of Variance (ANOVA) dikembangkan oleh peneliti statistik dari Inggris, R.A. Fisher (1890-1962). ANOVA adalah teknik untuk menguji kesamaan nilai tengah antara beberapa metode secara sekaligus (simultan). ANOVA biasa digunakan untuk menguji kesamaan kinerja antara beberapa metode (Aunuddin 2005). Tabel perhitungan ANOVA satu arah dapat dilihat pada Tabel 1. Tabel 1 Tabel ANOVA satu arah
Sumber Keragaman (SK) Jumlah Kuadrat (JK) Derajat Bebas (db) Kuadrat Tengah (KT) Fhit Perlakuan Galat JKK JKG k-1 k(N-1) KTK KTG KTK/ KTG Total JKT N-1
Berikut ini adalah keterangan mengenai perhitungan ANOVA pada Tabel 1
dengan:
k = banyaknya kolom
N = banyaknya pengamatan/keseluruhan data ni = banyaknya ulangan di kolom ke-i xij = data pada kolom ke-i ulangan ke-j T*i = total (jumlah) ulangan pada kolom ke-i T**= total (jumlah) seluruh pengamatan.
,
, ,
, ,
3 Pengambilan keputusan yaitu tolak H0
dengan taraf uji (α) tertentu bila nilai Fhitung
terletak di wilayah kritis yaitu F > Fα (db1 =k-1,db2=N-k) dengan hipotesis:
H0 : tidak ada metode yang berbeda nyata H1 : minimal ada sepasang metode yang
berbeda nyata.
Uji Lanjutan Duncan
Uji lanjutan Duncan merupakan uji yang dilakukan jika analisis ragam menghasilkan minimal ada sepasang metode yang berbeda nyata. Jika antar-metode berada pada subset yang berbeda, maka setiap metode berbeda nyata (Mattjik 2002). Uji ini juga dikenal dengan uji perbandingan berganda Duncan atau
Duncan Multiple Range Test (DMRT).
METODOLOGI PENELITIAN
Metode yang digunakan dalam penelitian ini dibagi ke dalam beberapa tahap yaitu (1) studi pustaka, (2) desain tool, (3) pengembangan tool, serta (4) rilis dan pengujian. Metodologi penelitian dapat dilihat pada Gambar 2. Berikut ini adalah penjelasan dari tahap penelitian yang akan dilakukan.
Gambar 2 Metodologi penelitian.
Studi Pustaka
Beberapa algoritme untuk membuat GI serta tahapan metodenya didapat dari studi pustaka dan literatur. Pada tahapan ini juga dilakukan pencarian referensi mengenai metode sejenis untuk membuat GI tiruan.
Desain Tool
Pada tahapan ini dilakukan perencanaan tool yang akan dibuat berdasarkan studi pustaka. Tahap ini dibagi menjadi dua yaitu spesifikasi fitur dan parameter serta desain antarmuka. 1. Spesifikasi Fitur dan Parameter
Spesifikasi fitur dan parameter dibuat berdasarkan kebutuhan untuk menghasilkan citra serealistis mungkin. Sumber cahaya yang digunakan pada penelitian ini adalah Standard
Lights dengan tipe target spot.
2. Desain Antarmuka
Desain antarmuka meliputi antarmuka perangkat keras, antarmuka perangkat lunak, dan antarmuka pengguna. Perangkat keras yang disyaratkan berdasarkan kebutuhan perangkat keras minimum dari Autodesk 3ds Max 8 yaitu:
Prosesor Intel Pentium III atau AMD 500Hz RAM sebesar 512 MB
Swap space sebesar 500MB
Kartu grafis yang mendukung 1024 x 768 x 16 bit warna dengan 64MB RAM.
Antarmuka perangkat lunak yang disyaratkan yaitu sistem operasi Windows XP Home Edition atau Windows 2000 SP4 ke atas dan Autodesk 3ds Max 8 atau versi yang lebih tinggi. Antarmuka pengguna dibuat berdasarkan spesifikasi fitur dan parameter serta kaidah interaksi manusia dan komputer.
Pengembangan Tool
Pada tahap ini dilakukan pengembangan tool dalam bentuk kumpulan script yang dibuat dengan menggunakan MAXScript. Setiap unit
script yang ada berdasarkan fitur dan parameter
yang ditentukan sebelumnya. Pada tahapan ini juga dilakukan debugging agar tool yang dibuat berjalan dengan stabil.
Rilis dan Pengujian
Pada tahap rilis, metode diuji berdasarkan tujuan dibuatnya tool tersebut yaitu menghasilkan efek GI tiruan. Pengujian dilakukan dengan mengukur apakah citra yang dihasilkan baik (realistis) dan apakah waktu
rendering relatif singkat dibandingkan dengan
metode pencahayaan yang lain. Tool yang dikembangkan dibandingkan kinerjanya dengan dua metode GI lainnya. Pengukuran realistis citra dilakukan dengan survei yang dipublikasikan melalui website sedangkan waktu rendering diukur dalam detik. Alur proses untuk pengujian dapat dilihat pada Gambar 3.
4 Gambar 3 Alur pengujian.
Untuk membuat survei ditetapkan tujuan antara lain mendapatkan rank realistis citra berdasarkan persepsi responden serta membandingkan rank antar-metode dengan menggunakan ANOVA. Uji lanjutan Duncan digunakan apabila diketahui minimal ada sepasang metode yang berbeda nyata. Proses pengembangan dan pengujian dilakukan pada komputer dengan spesifikasi:
Prosesor Intel Core2Quad Q6600 @2.4 GHz RAM sebesar 4 GB
Kartu grafis ATI Radeon HD 3650.
HASIL DAN PEMBAHASAN
Studi Pustaka
Tujuan dari pengembangan metode GI adalah untuk mendapatkan citra serealistis mungkin dalam waktu yang singkat. Dari studi pustaka dan literatur didapatkan informasi bahwa belum ada algoritme GI yang dapat memenuhi kedua tujuan tersebut.
Metode GI yang seringkali digunakan di 3ds Max adalah dengan menggunakan Light Tracer pada Scanline renderer atau dengan GI pada mental ray renderer. Dari studi pustaka dan literatur juga didapatkan informasi mengenai
metode untuk membuat GI tiruan. Metode yang umum digunakan yaitu dengan menggunakan
array lighting dengan menggunakan geometri
berbentuk dome. Geometri tersebut juga dapat diganti dengan geometri lain seperti berbentuk silinder.
Desain Tool
Berdasarkan studi pustaka maka dikembangkan tool dengan nama Cylight yang mengadopsi metode array lighting untuk membuat GI tiruan. Tool yang dibuat menggunakan geometri berbentuk silinder untuk melihat efek pencahayaan yang berbeda. Sumber cahaya yang digunakan adalah
Standard Lights dengan tipe target spot.
1. Spesifikasi Fitur dan Parameter
Fitur utama yang dibutuhkan untuk membuat efek GI adalah Cylinder Settings,
Light Settings serta Create Cylight. Fitur
tersebut diimplementasikan dalam bentuk
rollout. Berikut ini penjelasan dari dari fitur
utama Cylight.
Cylinder Settings merupakan fitur untuk
menentukan ukuran atau bentuk dari silinder yang digunakan sebagai geometri dasar. Parameter-parameter yang ada pada fitur ini adalah radius, sides, height, height segments, serta pivot.
Light Settings merupakan fitur untuk
mengatur parameter dari cahaya dan bayangan yang digunakan (lihat Lampiran 1). Pada pengaturan cahaya, parameter-parameter yang digunakan adalah step, hotspot, fallof, color, dan multiplier. Pada pengaturan bayangan, parameter-parameter yang digunakan adalah
density, bias, color, map size, serta sample range.
Create/Remove Cylight merupakan fitur
penting untuk membuat atau menghapus Cylight dari viewport. Fitur ini terdiri dari tombol Create Cylight! untuk membuat Cylight dan tombol Remove Cylight! untuk menghapus Cylight.
Fitur tambahan selain fitur utama adalah
Rendering dan Hide/Unhide Cylight. Berikut ini
penjelasan dari fitur tambahan tersebut.
Rendering merupakan fitur untuk mengatur
proses serta output dari proses rendering. Fitur ini terdiri dari dua tombol yaitu Render Setup dan Render. Render Setup berguna untuk mengatur spesifikasi rendering seperti renderer yang digunakan, ukuran output, dan parameter-parameter lainnya. Render berguna untuk melakukan proses rendering sekaligus
5 menghitung waktunya sebagai bagian dari
pengujian.
Hide/Unhide Cylight merupakan fitur tambahan untuk menyembunyikan atau memunculkan Cylight. Fitur ini terdiri dari tombol Hide Cylight serta tombol Unhide
Cylight.
2. Desain Antarmuka
Kebutuhan antarmuka perangkat keras dan perangkat lunak minimum disesuaikan dengan kebutuhan minimum untuk menjalankan Autodesk 3ds Max 8. Cylight dapat dijalankan juga pada 3ds Max dengan versi lebih tinggi. Pada Gambar 4 dapat dilihat antarmuka pengguna Cylight versi 1.03.
Gambar 4 Antarmuka pengguna Cylight.
Pengembangan Tool
Tool dikembangkan dengan MAXScript
pada Autodesk 3ds Max 2009. Script pada tahapan ini dibuat berdasarkan desain yang sudah dibuat. Pada tahap awal didefinisikan beberapa variabel global yang akan dipakai kemudian implementasi dilakukan dengan
membuat beberapa rollout sesuai dengan desain yang sudah dibuat. Tool yang dibuat terdiri dari tujuh rollout yaitu Author, ansCreate, LightsCreation, CylinderCreation, HideUnhide, Rendering, dan Aboutans.
Script lengkap Cylight dapat dilihat pada
Lampiran 2. Berikut ini akan dijelaskan beberapa algoritme penting yang ada pada Cylight. Fitur utama dari tool yang dikembangkan adalah target spot yang terikat dengan vertex pada geometri yang dipakai yaitu silinder. Algoritme untuk menghasilkan array
lighting tersebut adalah sebagai berikut:
for LightsIndex in 2 to (VertexCount-1) by LightsStepValue do
(
<--script for get parameter’s value here-->
LightsNumber[LightsIndex] = parameters )
LightsIndex adalah indeks yang didapat dari
vertex geometri yang dipakai. Vertex di bagian
bawah dan atas geometri tidak dipakai karena efek pencahayaan yang dihasilkan tidak terlalu baik. Oleh karena itu vertex yang dipakai hanya
vertex di bagian sisi silinder.
Selain itu juga diperlukan fungsi untuk menghitung total target spot yang digunakan. Berikut ini adalah potongan script-nya.
fn FnTotalNumberOfLights = ( LightsCount = (CylinderSidesValue * (CylinderHeightSegValue+1)/ LightsStepValue) LightsCount += 0.99 )
Fungsi penting lainnya adalah fungsi untuk menghitung waktu render. Waktu render didapat dengan menggunakan selisih timeStamp(). Berikut ini adalah potongan
script-nya. On Render pressed do ( start = timeStamp() actionMan.executeAction 0 "50031" -- Render: Render end = timeStamp()
format "Processing took % seconds\n" ((end - start) / 1000.0)
Rendering.LabelTime.text = "Processing took " + (((end - start) / 1000.0) as string) + " seconds"
6 Pencahayaan dengan Cylight dapat dilihat
pada Gambar 5. Pada gambar tersebut sumber cahaya berasal dari beberapa arah dengan target berada di tengah silinder. Pencahayaan tersebut dapat diatur parameternya dengan tool di sebelah kiri viewport.
Gambar 5 Cylight di viewport 3ds Max.
Rilis dan Pengujian
Berdasarkan studi pustaka, pengujian dilakukan dengan membandingkan kinerja ketiga metode yaitu:
1. Cylight
Cylight adalah tool yang dikembangkan pada penelitian ini. Tool tersebut menggunakan metode array lighting berbentuk silinder. Pencahayaan dilakukan dengan tool tersebut kemudian di-render dengan menggunakan Scanline renderer.
2. Scanline GI
Scanline GI adalah metode untuk menghasilkan GI dengan fitur yang terintegrasi pada Scanline renderer. Metode ini menggunakan fitur bernama Light Tracer pada
renderer tersebut.
3. mental ray GI
Metode ketiga yang dipakai pada penelitian ini adalah mental ray GI. Metode tersebut menghasilkan GI dengan fitur GI yang terintegrasi dengan mental ray renderer.
Pada tahap rilis dan pengujian dihitung waktu render ketiga metode dan mempublikasikan citra dengan menggunakan kuesioner untuk mendapatkan rank-nya. Pada beberapa kali pengujian waktu render,
didapatkan hasil bahwa Cylight ver.1.03 mendapatkan waktu tercepat dengan perbedaan yang cukup signifikan. Proses rendering dilakukan sebanyak tiga kali ulangan untuk tiap metode. Tabel 2 menunjukkan hasil
perbandingan waktu render pada beberapa
scene. Tabel pengujian waktu render lengkap
dapat dilihat pada Lampiran 3. Tabel 2 Hasil pengujian waktu render
No. Metode
Waktu render (dalam detik)
Ulangan 1 Ulangan 2 Ulangan 3 P8 Cylight 4.203 4.172 4.140 Scanline GI 66.891 67.344 66.734 mental ray GI 52.000 51.578 50.891 P9 Cylight 4.531 4.469 4.516 Scanline GI 81.188 81.188 80.391 mental ray GI 55.219 56.094 55.937 P10 Cylight 3.890 3.859 3.844 Scanline GI 26.594 26.610 27.109 mental ray GI 11.461 13.348 11.610 P11 Cylight 3.703 3.719 3.703 Scanline GI 38.875 38.825 38.782 mental ray GI 13.094 13.203 13.438 P12 Cylight 10.000 9.890 9.938 Scanline GI 107.860 108.000 107.896 mental ray GI 20.340 20.258 19.930 P13 Cylight 4.485 4.469 4.328 Scanline GI 29.688 30.406 30.406 mental ray GI 12.984 12.000 11.750
Data pada Tabel 2 kemudian disederhanakan menjadi 18 data untuk diolah dengan menggunakan ANOVA. Data tersebut adalah hasil rataan dari data waktu render yang diulang sebanyak tiga kali. Data rataan waktu render dapat dilihat pada Lampiran 3. Tabel 3 menunjukkan hasil ANOVA berdasarkan waktu
render. Pada tabel tersebut didapatkan Fhitung =
8.848 dengan taraf uji α = 0.01. Dengan melihat tabel sebaran F didapatkan titik kritis Ftabel = Fα(db1=2,db2=15) = 6.359.
Tabel 3 ANOVA berdasarkan waktu render
Waktu Render SK JK db KT Fhit Perlakuan 8 660.940 2 4 330.470 8.848 Galat 7 341.162 15 489.411 Total 16 002.100 17 Hipotesis :
H0 : tidak ada metode yang berbeda nyata H1 : minimal ada sepasang metode yang
berbeda nyata.
Keputusan tolak H0 diambil karena Fhitung > Ftabel. Kesimpulan yang didapat adalah minimal
ada sepasang metode yang berbeda nyata. Untuk menentukan metode yang berbeda nyata, maka digunakan uji lanjutan Duncan. Tabel 4 menunjukkan hasil dari uji lanjutan Duncan untuk waktu render. Dari hasil tersebut ketiga metode masuk ke dalam subset yang berbeda. Artinya waktu render ketiga metode tersebut berbeda nyata.
7 Tabel 4 Uji lanjutan Duncan waktu render
Waktu Render Metode N Subset untuk α = 0.01 1 2 3 Cylight 18 5.103 mental ray GI 18 27.508 Scanline GI 18 58.599
Gambar 6 menunjukkan perbedaan nyata berturut-turut antara waktu render Cylight, Scanline GI, dan mental ray GI. Metode Cylight menghasilkan waktu tercepat dengan perbedaan cukup signifikan dibandingkan metode lainnya.
Gambar 6 Grafik nilai tengah waktu render. Hasil render berupa citra pada pengujian sebelumnya digunakan untuk pengujian realistis citra. Setiap scene di-render dengan tiga metode berbeda menggunakan parameter-parameter pada Lampiran 4 sehingga menghasilkan 18 citra yang akan dinilai oleh responden dengan menggunakan kuesioner pada Lampiran 5.
Pengujian dengan kuesioner mendapatkan responden sebanyak 98 orang dari berbagai demografi dan mental model yang berbeda seperti terlihat pada Lampiran 6. Responden laki-laki sebanyak 72.45%, perempuan 25.51%, dan 2.04 % yang tidak menjawab jenis kelamin. Pengujian ini menggunakan rank sebagai alat bantu. Responden disajikan tiga buah citra yang merupakan hasil render dari ketiga metode yang berbeda. Citra pertama merupakan hasil render menggunakan metode Cylight, citra kedua menggunakan Scanline GI, dan citra ketiga menggunakan mental ray GI. Contoh perbandingan citra pada lingkungan (scene) tertentu dengan tiga metode berbeda dapat dilihat pada Gambar 7.
Gambar 7 Perbandingan hasil render tiga metode pencahayaan.
Responden memiliki sebaran usia yang beragam, tetapi mayoritas responden adalah usia 16 sampai dengan 22 tahun. Sebaran usia responden yang mengisi kuesioner dapat dilihat pada Tabel 5.
Tabel 5 Sebaran usia responden
Usia Jumlah Persentase (%)
11-15 tahun 2 2.04 16-22 tahun 58 59.18 23-30 tahun 30 30.61 > 30 tahun 7 7.14 Tidak menjawab 1 1.02 Total 98 100
Mental model responden juga diketahui dari
beberapa pertanyaan sehingga dapat diketahui apakah responden sudah terbiasa melihat objek 3D serta mengetahui istilah di dalamnya. Dari data tersebut diketahui bahwa responden relatif beragam. Sebaran responden yang bermain
game 3D dapat dilihat pada Tabel 6. Dari tabel
tersebut diketahui bahwa mayoritas responden setidaknya pernah memainkan game 3D. Tabel 6 Responden yang bermain game 3D
Bermain game 3D Jumlah Persentase (%)
Tidak pernah 10 10.20 Pernah 32 32.65 Kadang-kadang 26 26.53 Sering 25 25.51 Selalu 5 5.10 Total 98 100
Pertanyaan-pertanyaan mengenai mental
model responden yaitu apakah responden
bermain game 3D, apakah responden menonton animasi 3D, apakah responden menggunakan aplikasi 3D, dan apakah responden mengetahui istilah GI. Data rank lengkap dari 98 responden dapat dilihat pada Lampiran 7.
Data rank yang ada disederhanakan dengan mengambil rataannya sehingga didapatkan 18 data untuk diolah dengan ANOVA. Tabel 7 menunjukkan ANOVA berdasarkan rank.
Dengan menggunakan perhitungan ANOVA didapatkan Fhit sebesar 39.805. Dengan melihat
tabel sebaran F didapatkan titik kritis Ftabel = Fα(db1=2,db2=15) = 6.359.
Tabel 7 ANOVA berdasarkan rank
Rank
SK JK db KT Fhit
Perlakuan 5.921 2 2.960 39.805
Galat 1.116 15 0.074
8 Hipotesis:
H0 : tidak ada metode yang berbeda nyata H1 : minimal ada sepasang metode yang
berbeda nyata.
Kesimpulan yang didapat adalah minimal ada sepasang metode yang berbeda nyata karena
Fhit > Ftabel. Untuk menentukan metode yang
berbeda nyata, digunakan uji lanjutan Duncan. Tabel 8 menunjukkan hasil dari uji lanjutan Duncan berdasarkan rank. Dari tabel tersebut dapat disimpulkan bahwa metode mental ray GI berbeda nyata dengan metode lainnya, sedangkan metode Cylight dan Scanline GI tidak berbeda nyata karena masuk subset yang sama.
Tabel 8 Uji lanjutan Duncan berdasarkan rank
Rank Metode N Subset untuk α = 0.01 1 2 mental ray GI 6 2.520 Cylight 6 3.466 Scanline GI 6 3.893
Gambar 8 menunjukkan plot nilai tengah berturut-turut waktu render Cylight, Scanline GI, dan mental ray. Dari grafik berdasarkan
rank tersebut dapat dilihat bahwa kualitas citra
hasil Cylight tidak jauh berbeda dengan kualitas citra hasil Scanline GI.
Gambar 8 Grafik nilai tengah rank.
KESIMPULAN DAN SARAN
Kesimpulan
Berdasarkan penelitian yang dilakukan untuk menguji kinerja dari tiga metode pencahayaan didapatkan kesimpulan bahwa Cylight memiliki nilai realistis yang sebanding dengan Scanline GI dan lebih baik dari mental ray GI dengan waktu render yang lebih singkat dibandingkan metode lainnya. Artinya Cylight dapat digunakan sebagai alternatif untuk
menghasilkan efek GI yang cukup baik dengan waktu yang lebih singkat.
Saran
Saran-saran yang dapat dipertimbangkan untuk pengembangan lebih lanjut adalah: 1. Menggunakan geometri lain untuk membuat
array lighting dan membandingkannya.
2. Mengembangkan array lighting untuk lingkungan interior.
3. Menambahkan fitur untuk memilih geometri ataupun menambahkan geometri sendiri. Jika dimungkinkan ada fitur untuk mengombinasikan antar-geometri tersebut. 4. Menambahkan fitur untuk memilih beberapa
warna cahaya atau mengambil warna cahaya dari citra.
5. Mengembangkan tool sejenis untuk aplikasi 3D lainnya.
6. Membandingkan kinerja metode tertentu dengan parameter-parameter yang berbeda.
DAFTAR PUSTAKA
Aunuddin. 2005. Statistika: Rancangan dan
Analisis Data. Bogor: IPB PRESS.
Boyles et al. 2009. Virtual Simulation for Lighting & Design Education. IEEE Virtual
Reality 2009.
Brooker D. 2008. Essential CG Lighting
Techniques with 3ds Max 3rd edition.
Oxford: Elsevier Ltd.
Derakhshani D, Lorene R, McFarland J. 2007.
Introduction 3DS Max 9. Canada: Wiley
Publishing, Inc.
Gallardo A. 2001. 3D Lighting: History,
Concepts, and Techniques. Massachusetts:
Charles River Media, Inc.
Mattjik AA, Sumertajaya IM. 2002.
Perancangan Percobaan dengan Aplikasi SAS dan Minitab Jilid I. Bogor: IPB PRESS.
Murdock KL. 2008. 3ds Max 2008 Bible. John Wiley and Sons.
10 Lampiran 1 Ilustrasi penggunaan parameter pencahayaan pada target spot
Pencahayaan dengan overshoot1
1 Efek yang dihasilkan dari overshoot sama dengan omni karena memancarkan cahaya ke segala arah tetapi tetap memproyeksikan bayangan seperti target spot
Menaikkan nilai bias akan memisahkan objek dengan
bayangannya
Menaikkan sample range (dari kiri ke kanan) akan membuat efek
antialising
Map size kiri = 32 Map size kanan = 256
Area hotspot sempit dengan area
fallof luas
Area hotspot yang diperluas
Pencahayaan tanpa overshoot
Menaikkan density (dari kiri ke kanan) akan mempertebal bayangan
11 Lampiran 2 Script Cylight
1 --Cylight ver.1.03
2 --Written by Andi Sasmita
3 --"Cylinder Lighting" for 3ds Max 8/9/2008/2009/2010 or later 4
5 --Changelog 28 June 2009 ver.1.03 6 --Add pivot point controller
7 --Import parameters / readjust parameters after closed 8 --Add Render Setup and Render feature
9 --Add timing operations (processing time) 10 --Bugs fixed 11 12 Global CylinderRadiusValue = 100.0 13 Global CylinderHeightValue = 400.0 14 Global PivotPointValue = 0 15 Global CylinderHeightSegValue = 4 16 Global CylinderCapSegValue = 1 17 Global CylinderSidesValue = 12
18 Global CylinderPivotController = bezier_float() 19 Global CylinderRadiusController = bezier_float() 20 Global CylinderHeightController = bezier_float() 21 Global CylinderPosition = [0,0,0]
22 Global VertexCount = undefined 23 Global LightsNumber = undefined 24 Global LightsStepValue = 1 25 Global LightsMapSizeValue = 128 26 Global LightsMapBiasValue = 0.1 27 Global LightsMultiplierValue = 1.0
28 Global LightsMultiplierController = bezier_float() 29 Global LightsStatusChecked = on
31 Global LightsShadowColorColor = black
32 Global LightsShadowMultiplierController = bezier_float() 33 Global LightsOvershootChecked = off
34 Global LightsShadowChecked = on 35 Global LightsSampleRangeValue = 4.0 36 Global LightsFalloffValue = 52.0 37 Global LightsCount = 91
38 Global LightsHotspotValue = 50.0 39 Global LightsColorRGB = white
40 Global LightsShadowMultiplierValue = 1.0 41 Global LightsIndex = undefined
42
12 Lampiran 2 Lanjutan
44 fn FnArrayLights =
45 (
46 for LightsIndex in 2 to (VertexCount-1) by LightsStepValue do
47 (
48 CylinderPosition = $ans_cyl.pos
49 VertexPosition = getvert $ans_cyl LightsIndex
50 LightsNumber[LightsIndex] = TargetSpot hotspot:LightsHotspotValue
falloff:LightsFalloffValue overShoot:LightsOvershootChecked decayRadius:LightsStepValue attenDecay:1 raytracedShadows:off pos:VertexPosition enabled:LightsStatusChecked rgb:LightsColorRGB multiplier:(LightsMultiplierValue/(LightsCount as Integer)) castShadows:LightsShadowChecked
shadowColor:(LightsShadowColorColor/(LightsCount as Integer))
shadowMultiplier:LightsShadowMultiplierValue mapbias:LightsMapBiasValue mapsize:LightsMapSizeValue samplerange:LightsSampleRangeValue
parent:$ans_cyl name:(uniquename "ans_light") target:(Targetobject
name:(uniquename "ans_target") parent:$ans_cyl transform:(matrix3 [1,0,0] [0,1,0] [0,0,1] CylinderPosition)) 51 ) 52 ) 53 54 fn FnTotalNumberOfLights = 55 ( 56 LightsCount = (CylinderSidesValue * (CylinderHeightSegValue+1)/LightsStepValue) 57 LightsCount += 0.99 58 ) 59
60 rollout Author "Author"
61 (
62 bitmap sprunt_bmp fileName:"light_banner.jpg"
63 )
64
65 rollout ansCreate "Create/Remove Cylight"
66 (
67 Button Create "Create Cylight!" width:194 align:#center
68 Button Remove "Remove Cylight!" width:194 align:#center enabled: false
69 On Create pressed do
70 (
71 if $ans_cyl == undefined then
72 (
73 Remove.enabled = true
74 Create.enabled = false
75 Cylinder name:"ans_cyl" pos:[0,0,0] radius:CylinderRadiusValue height:CylinderHeightValue heightsegs:CylinderHeightSegValue capsegs:CylinderCapSegValue sides:CylinderSidesValue mapCoords:on wirecolor:black renderable:off xray:on pivot:[0,0,PivotPointValue]
76 Addmodifier $ans_cyl (Mesh_Select())
77 VertexCount = getnumverts $ans_cyl
13 Lampiran 2 Lanjutan 79 LightsNumber = #() 80 FnTotalNumberOfLights() 81 disableSceneRedraw() 82 FnArrayLights() 83 enableSceneRedraw() 84 ) 85 ) 86 87 88 On Remove pressed do 89 (
90 if $ans_cyl != undefined then
91 ( 92 Remove.enabled = false 93 Create.enabled = true 94 delete $ans_cyl 95 delete $ans_light* 96 ) 97 ) 98 99 ) 100
101 rollout LightsCreation "Light Settings"
102 (
103 Group "Light Parameters"
104 (
105 Checkbox LightsStatus "Enable" checked:on across:2 align:#left offset:[1,0] across:2
106 Colorpicker LightsColor "Color:" color:[255,255,255] align:#right offset:[-1,0]
107 Spinner LightsStep "Step:" range:[1,100,1] type:#integer align:#left offset:[14,0] width:60 across:2
108 Spinner LightsMultiplier "Multiplier:" range:[0,100,1]
controller:LightsMultiplierController align:#right width:70 offset:[-1,0] 109 Spinner LightsHotspot "Hotspot:" range:[0,1000000000,50.0] scale:1 align:#left
width:115 offset:[9,0]
110 Spinner LightsFalloff "Falloff:" range:[0,1000000000,52.0] scale:1 align:#right width:115 offset:[15,0] across:2
111 Checkbox LightsOvershoot "Overshoot" checked:off align:#right offset:[5,0]
112 )
113 Group "Shadow Parameters"
114 (
115 Checkbox LightsShadow "Cast Shadows" checked:on align:#left offset:[1,0] across:2
116 Colorpicker LightsShadowColor "Color:" color:[0,0,0] align:#right offset:[-1,0]
117 Spinner LightsShadowMultiplier "Density:" range:[0,100,1]
controller:LightsShadowMultiplierController align:#left width:71 offset:[20,0] across:2
14 Lampiran 2 Lanjutan
118 Spinner LightsMapSize "Map Size:" range:[1,4096,128] type:#integer align:#right width:85 offset:[-1,0]
119 Spinner LightsMapBias "Bias:" range:[0,1000,0.1] align:#left width:52 offset:[15,0] across:2
120 Spinner LightsSampleRange "Sample Range:" range:[0.01,50,4.0] align:#right offset:[-1,0] width:88
121 )
122 Label LabelTotal "Total: 60 Lights" align:#center
123 on LightsStep changed val do
124 (
125 LightsStepValue = val
126 FnTotalNumberOfLights()
127 LightsCreation.LabelTotal.text = "Total: " + ((LightsCount as integer) as string) + " Lights"
128 if $ans_cyl != undefined then
129 (
130 VertexCount = getnumverts $ans_cyl
131 delete $ans_light* 132 LightsNumber = #() 133 FnTotalNumberOfLights() 134 disableSceneRedraw() 135 FnArrayLights() 136 enableSceneRedraw() 137 ) 138 )
139 on LightsStatus changed val do
140 (
141 LightsStatusChecked = val
142 if $ans_light01 != undefined then
143 (
144 for LightsIndex in 2 to (VertexCount-1) by LightsStepValue do
145 ( 146 LightsNumber[LightsIndex].baseobject.Enabled = LightsStatusChecked 147 ) 148 ) 149 )
150 on LightsColor changed val do
151 (
152 LightsColorRGB = val
153 if $ans_light01 != undefined then
154 (
155 for LightsIndex in 2 to (VertexCount-1) by LightsStepValue do
156 (
157 LightsNumber[LightsIndex].baseobject.rgb = LightsColorRGB
15 Lampiran 2 Lanjutan
159 )
160 )
161 on LightsMultiplier changed val do
162 (
163 LightsMultiplierValue = val
164 if $ans_light01 != undefined then
165 (
166 FnTotalNumberOfLights()
167 for LightsIndex in 2 to (VertexCount-1) by LightsStepValue do
168 ( 169 LightsNumber[LightsIndex].baseobject.multiplier = LightsMultiplierValue/(LightsCount as integer) 170 ) 171 LightsMultiplierController.value = ($ans_Light01.baseobject.multiplier*(LightsCount as Integer)) 172 ) 173 )
174 on LightsShadow changed val do
175 (
176 LightsShadowChecked = val
177 if $ans_light01 != undefined then
178 (
179 for LightsIndex in 2 to (VertexCount-1) by LightsStepValue do
180 ( 181 LightsNumber[LightsIndex].baseobject.castShadows = LightsShadowChecked 182 ) 183 ) 184 )
185 on LightsShadowColor changed val do
186 (
187 LightsShadowColorColor = val
188 if $ans_light01 != undefined then
189 (
190 FnTotalNumberOfLights()
191 for LightsIndex in 2 to (VertexCount-1) by LightsStepValue do
192 ( 193 LightsNumber[LightsIndex].baseobject.shadowColor = (LightsShadowColorColor/(LightsCount as integer)) 194 ) 195 ) 196 ) 197
159 on LightsShadowMultiplier changed val do
160 (
16 Lampiran 2 Lanjutan
162 if $ans_light01 != undefined then
163 (
164 for LightsIndex in 2 to (VertexCount-1) by LightsStepValue do
165 ( 166 LightsNumber[LightsIndex].baseobject.shadowMultiplier = LightsShadowMultiplierValue 167 ) 168 LightsShadowMultiplierController.value = $ans_light01.baseobject.shadowMultiplier 169 ) 170 )
171 on LightsMapBias changed val do
172 (
173 LightsMapBiasValue = val
174 if $ans_light01 != undefined then
175 (
176 for LightsIndex in 2 to (VertexCount-1) by LightsStepValue do
177 ( 178 LightsNumber[LightsIndex].baseobject.mapbias = LightsMapBiasValue 179 ) 180 ) 181 )
182 on LightsMapSize changed val do
183 (
184 LightsMapSizeValue = val
185 FnTotalNumberOfLights()
186 LightsCreation.LabelTotal.text = "Total: " + ((LightsCount as integer) as string) + " Lights"
187 if $ans_light01 != undefined then
188 (
189 for LightsIndex in 2 to (VertexCount-1) by LightsStepValue do
190 ( 191 LightsNumber[LightsIndex].baseobject.mapsize = LightsMapSizeValue 192 ) 193 ) 194 )
195 on LightsSampleRange changed val do
196 (
197 LightsSampleRangeValue = val
198 if $ans_light01 != undefined then
199 (
200 for LightsIndex in 2 to (VertexCount-1) by LightsStepValue do
201 (
202 LightsNumber[LightsIndex].baseobject.samplerange =
17 Lampiran 2 Lanjutan
203 )
204 )
205 )
206 on LightsHotspot changed val do
207 (
208 LightsHotspotValue = val
209 if (LightsHotspotValue + 2) >= LightsFalloffValue then
210 (
211 LightsFalloffValue = (LightsHotspotValue + 2)
212 LightsFalloff.value = LightsFalloffValue
213 )
214 if $ans_light01 != undefined then
215 (
216 for LightsIndex in 2 to (VertexCount-1) by LightsStepValue do
217 ( 218 LightsNumber[LightsIndex].baseobject.hotspot = LightsHotspotValue 219 if (LightsNumber[LightsIndex].baseobject.hotspot + 2) >= LightsFalloffValue then 220 ( 221 LightsNumber[LightsIndex].baseobject.falloff = LightsFalloffValue 222 ) 223 ) 224 ) 225 )
226 on LightsFalloff changed val do
227 (
228 LightsFalloffValue = val
229 if (LightsFalloffValue - 2) <= LightsHotspotValue then
230 (
231 LightsHotspotValue = (LightsFalloffValue - 2)
232 LightsHotspot.value = LightsHotspotValue
233 )
234 if $ans_light01 != undefined then
235 (
236 for LightsIndex in 2 to (VertexCount-1) by LightsStepValue do
237 ( 238 LightsNumber[LightsIndex].baseobject.falloff = LightsFalloffValue 239 if (LightsNumber[LightsIndex].baseobject.falloff - 2) <= LightsHotspotValue then 240 ( 241 LightsNumber[LightsIndex].baseobject.hotspot = LightsHotspotValue 242 ) 243 ) 244 )
18 Lampiran 2 Lanjutan
245 )
246 On LightsOvershoot changed val do
247 (
248 LightsOvershootChecked = val
249 LightsHotspot.enabled = not LightsOvershootChecked
250 if $ans_light01 != undefined then
251 (
252 for LightsIndex in 2 to (VertexCount-1) by LightsStepValue do
253 ( 254 LightsNumber[LightsIndex].baseobject.overShoot = LightsOvershootChecked 255 ) 256 ) 257 ) 258 ) 259
260 rollout CylinderCreation "Cylinder Settings"
261 (
262 Group "Cylinder Parameters"
263 (
264 Spinner CylinderRadius "Radius:" range:[0,999999999,100] scale:10
controller:CylinderRadiusController align:#left offset:[0,0] width:107 across:2 265 Spinner CylinderHeight "Height:" range:[0,999999999,400] scale: 10 controller:
CylinderHeightController align:#right width:107
266 Spinner CylinderSides "Sides:" range:[3,16,12] type:#integer align: #left width:51
267 Spinner CylinderHeightSegments "Height Segments:" range:[1,10,4] type:#integer align:#right offset:[0,-20] width:51
268 Spinner PivotPoint "Pivot:" range:[-999999999,999999999,0] type:#integer width:84 align:#right
269 )
270
271 On CylinderRadius changed val do
272 (
273 CylinderRadiusValue = val
274 if $ans_cyl!=undefined then
275 (
276 $ans_cyl.radius = CylinderRadiusValue
277 VertexCount = getnumverts $ans_cyl
278 disableSceneRedraw()
279 for LightsIndex in 2 to (VertexCount-1) by LightsStepValue do
280 (
281 VertexPosition = getvert $ans_cyl LightsIndex
282 LightsNumber[LightsIndex].pos = VertexPosition
283 )
284 enableSceneRedraw()
19 Lampiran 2 Lanjutan
286 )
287 )
288
289 On CylinderSides changed val do
290 (
291 CylinderSidesValue = val
292 FnTotalNumberOfLights()
293 --bugs fixed here (cannot read LabelTotal)
294 LightsCreation.LabelTotal.text = "Total: " + ((LightsCount as integer) as string) + " Lights"
295 if $ans_cyl != undefined then
296 (
297 $ans_cyl.sides = CylinderSidesValue
298 VertexCount = getnumverts $ans_cyl
299 delete $ans_light* 300 LightsNumber = #() 301 FnTotalNumberOfLights() 302 disableSceneRedraw() 303 FnArrayLights() 304 enableSceneRedraw() 305 ) 306 ) 307
308 On CylinderHeight changed val do
309 (
310 CylinderHeightValue = val
311 if $ans_cyl!=undefined then
312 (
313 $ans_cyl.height = CylinderHeightValue
314 VertexCount = getnumverts $ans_cyl
315 for LightsIndex in 2 to (VertexCount-1) by LightsStepValue do
316 (
317 VertexPosition = getvert $ans_cyl LightsIndex
318 LightsNumber[LightsIndex].pos = VertexPosition 319 ) 320 CylinderHeightController.value = $ans_cyl.height 321 ) 322 ) 323
324 On CylinderHeightSegments changed val do
325 (
326 CylinderHeightSegValue = val
327 FnTotalNumberOfLights()
20 Lampiran 2 Lanjutan
329 LightsCreation.LabelTotal.text = "Total: " + ((LightsCount as integer) as string) + " Lights"
330 if $ans_cyl != undefined then
331 (
332 $ans_cyl.heightsegs = CylinderHeightSegValue
333 VertexCount = getnumverts $ans_cyl
334 delete $ans_light* 335 LightsNumber = #() 336 FnTotalNumberOfLights() 337 disableSceneRedraw() 338 FnArrayLights() 339 enableSceneRedraw() 340 ) 341 ) 342
343 On PivotPoint changed val do
344 ( 345 PivotPointValue = val 346 if $ans_cyl!=undefined then 347 ( 348 $ans_cyl.pivot = [$ans_cyl.pos.x,$ans_cyl.pos.y,PivotPointValue] 349 $ans_target*.pivot = $ans_cyl.pivot 350 CylinderPivotController.value = PivotPointValue 351 ) 352 ) 353 ) 354 355
356 rollout HideUnhide "Hide/Unhide Cylight"
357 (
358 Button HideAll "Hide Cylight" align:#left width:100 offset:[1,0] across:2 359 Button UnhideAll "Unhide Cylight" align:#right width:100 offset:[-1,0] 360 361 On HideAll pressed do 362 ( 363 hide $ans_cyl* 364 hide $ans_light* 365 ) 366 On UnhideAll pressed do 367 ( 368 unhide $ans_cyl* 369 unhide $ans_light* 370 ) 371 )
21 Lampiran 2 Lanjutan
372 rollout Rendering "Rendering"
373 (
374 Button RenderSetup "Render Setup" width:100 across:2 align:#left 375 Button Render "Render" width:100 align:#right
376 Label LabelTime "No render time" align:#center 377
378 On RenderSetup pressed do
379 (
380 actionMan.executeAction 0 "60010" -- Render: Render SetUp
381 )
382
383 On Render pressed do
384 (
385 start = timeStamp()
386 actionMan.executeAction 0 "50031" -- Render: Render
387 end = timeStamp()
388 format "Processing took % seconds\n" ((end - start) / 1000.0) 389 Rendering.LabelTime.text = "Processing took " + (((end - start) /
1000.0) as string) + " seconds"
390 )
391 )
392
393 rollout Aboutans "About Cylight"
394 (
395 Label LabelVersion "Version: 1.03" align:#center 396 Label LabelRelease "Release: 28 June 2009"
397 Label LabelAuthor "Author: Andi Sasmita" align:#center 398 Button Contact "[email protected]" align:#center
399 Button Website "http://ans_3d.carbonmade.com" align:#center 400 372 On Contact pressed do 373 ( 374 assetBrowser.open() 375 assetBrowser.gotoURL "mailto:[email protected]" 376 ) 377 On Website pressed do 378 ( 379 assetBrowser.open() 380 assetBrowser.gotoURL "http://ans_3d.carbonmade.com" 381 ) 382 ) 383 384 --Initialise Controllers
22 Lampiran 2 Lanjutan 385 LightsMultiplierController.value = 1.0 386 LightsShadowMultiplierController.value = 1.0 387 CylinderRadiusController.value = 100.0 388 CylinderHeightController.value = 400.0 389 CylinderPivotController.value = 0 390
391 ans_Floater = NewRolloutFloater "Cylight ver. 1.03" 260 560 392 AddRollout Author ans_Floater
393 AddRollout CylinderCreation ans_Floater 394 AddRollout LightsCreation ans_Floater
395 AddRollout ansCreate ans_Floater rolledUp:off 396 AddRollout Rendering ans_Floater
397 AddRollout HideUnhide ans_Floater rolledUp:on 398 AddRollout Aboutans ans_Floater rolledUp:on 399
400 if ($ans_cyl != undefined) and ($ans_light01 != undefined) then
401 ( 402 CylinderPosition = $ans_cyl.pos 403 CylinderRadiusValue = $ans_cyl.radius 404 CylinderCreation.CylinderRadius.value = CylinderRadiusValue 405 CylinderHeightValue = $ans_cyl.height 406 CylinderCreation.CylinderHeight.value = CylinderHeightValue 407 CylinderHeightSegValue = $ans_cyl.heightsegs 408 CylinderCreation.CylinderHeightSegments.value = CylinderHeightSegValue 409 CylinderSidesValue = $ans_cyl.sides 410 CylinderCreation.CylinderSides.value = CylinderSidesValue 411 PivotPointValue = $ans_cyl.pivot.z 412 CylinderCreation.PivotPoint.value = PivotPointValue 413 LightsCount = $ans_light*.count 414 LightsFalloffValue = $ans_light01.baseobject.falloff 415 LightsCreation.LightsFalloff.value = LightsFalloffValue 416 LightsMapBiasValue = $ans_light01.baseobject.mapbias 417 LightsCreation.LightsMapBias.value = LightsMapBiasValue 418 LightsHotspotValue = $ans_light01.baseobject.hotspot 419 LightsCreation.LightsHotspot.value = LightsHotspotValue 420 LightsSampleRangeValue = $ans_light01.baseobject.samplerange 421 LightsCreation.LightsSampleRange.value = LightsSampleRangeValue 422 LightsMapSizeValue = $ans_light01.baseobject.mapsize 423 LightsCreation.LightsMapSize.value = LightsMapSizeValue
424 LightsMultiplierValue = ($ans_light01.baseobject.multiplier * LightsCount) 425 LightsCreation.LightsMultiplier.value = LightsMultiplierValue
426 LightsOvershootChecked = $ans_light01.baseobject.overShoot 427 LightsCreation.LightsHotspot.enabled = not LightsOvershootChecked
23 Lampiran 2 Lanjutan 428 LightsCreation.LightsOvershoot.checked = LightsOvershootChecked 429 LightsShadowColorColor = $ans_light01.baseobject.shadowColor 430 LightsCreation.LightsShadowColor.color = (LightsShadowColorColor * LightsCount) 431 LightsShadowMultiplierValue = $ans_light01.baseobject.shadowMultiplier 432 LightsCreation.LightsShadowMultiplier.value = LightsShadowMultiplierValue 433 LightsShadowChecked = $ans_light01.baseobject.castShadows 434 LightsCreation.LightsShadow.checked = LightsShadowChecked 435 LightsStatusChecked = $ans_light01.baseobject.enabled 436 LightsCreation.LightsStatus.checked = LightsStatusChecked 437 LightsColorRGB = $ans_light01.baseobject.rgb 438 LightsCreation.LightsColor.color = LightsColorRGB
439 LightsStepValue = ($ans_light01.baseobject.decayRadius as integer) 440 LightsCreation.LightsStep.value = LightsStepValue
441 VertexCount = getnumverts $ans_cyl
442 FnTotalNumberOfLights() 443 TempNumber = #() 444 TempNumber = $ans_light* 445 TempIndex = 1 446 LightsNumber = #() 447 ansCreate.Remove.enabled = true 448 ansCreate.Create.enabled = false 449
450 for LightsIndex in 2 to (VertexCount-1) by LightsStepValue do
451 (
428 LightsNumber[LightsIndex] = TempNumber[TempIndex]
429 LightsNumber[LightsIndex].pos =TempNumber[TempIndex].pos
430 TempIndex += 1
431 )
432 LightsCreation.LabelTotal.text = "Total: " + ((LightsCount as integer) as string) + " Lights"
24
Lampiran 3 Pengujian waktu render
Nama file
Triangles
(Tris) Ukuran render Kamera
Tekstur/
warna Metode
Waktu render (dalam detik)
No. Ulangan 1 Ulangan 2 Ulangan 3 Rataan2
chairs.max 123 098 325 x 400 pixel Perspective Tidak Cylight 3.890 3.859 3.844 3.864 P8A
P83
Scanline GI 26.594 26.610 27.109 26.771 P8B
mental ray GI 11.461 13.348 11.610 12.140 P8C
model_yaris.max 206 938 400 x 300 pixel Camera02 Tidak Cylight 4.485 4.469 4.328 4.427 P9A
P94
Scanline GI 29.688 30.406 30.406 30.167 P9B
mental ray GI 12.984 12.000 11.750 12.245 P9C
building.max 189 748 325 x 400 pixel Camera01 Tidak Cylight 10.000 9.890 9.938 9.943 P10A
P105
Scanline GI 107.860 108.000 107.896 107.919 P10B
mental ray GI 20.340 20.258 19.930 20.176 P10C
steamworks.max 111 445 325 x 400 pixel Camera01 Ya Cylight 4.203 4.172 4.140 4.172 P11A
P116
Scanline GI 66.891 67.344 66.734 66.990 P11B
mental ray GI 52.000 51.578 50.891 51.490 P11C
steamworks.max 111 445 325 x 400 pixel Camera02 Ya Cylight 4.531 4.469 4.516 4.505 P12A
P127
Scanline GI 81.188 81.188 80.391 80.922 P12B
mental ray GI 55.219 56.094 55.937 55.750 P12C
bedroom.max 75 918 325 x 400 pixel Camera01 Ya Cylight 3.703 3.719 3.703 3.708 P13A
P138
Scanline GI 38.875 38.825 38.782 38.827 P13B
mental ray GI 13.094 13.203 13.438 13.245 P13C
2 Data rataan yang digunakan untuk perhitungan ANOVA 3 Pertanyaan nomor 8 pada kuesioner
4
Pertanyaan nomor 9 pada kuesioner 5 Pertanyaan nomor 10 pada kuesioner 6 Pertanyaan nomor 11 pada kuesioner 7 Pertanyaan nomor 12 pada kuesioner 8
25
Lampiran 4 Parameter-parameter metode pencahayaan
No.9 Rad. Sides Height
Height
Seg. Pivot Mult.
Lights Color
(RGB) Overshoot Step Hotspot Falloff
Shadow Color (RGB) Density Bias Map Size Sample Range
P8A 780 12 720 2 0 2.2 255,255,255 Yes 1 tdk aktif 52 0,0,0 1 0,1 512 16
P9A 70 12 100 2 0 2.2 255,255,255 Yes 1 tdk aktif 52 0,0,0 1.2 0,1 1024 8
P10A 60 12 60 2 -1 3.5 255,255,255 Yes 1 tdk aktif 52 0,0,0 1 0,1 1024 4
P11A 40 12 40 2 3 2 255,255,255 Yes 1 tdk aktif 52 0,0,0 1 0,1 128 2
P12A 40 12 40 2 3 2 255,255,255 Yes 1 tdk aktif 52 0,0,0 1 0,1 128 2
P13A 1460 12 2500 2 0 2 255,255,255 Yes 1 tdk aktif 52 0,0,0 1 0,1 256 8
No.10 Cone Angle Sky Rays per Sample Filter Size Ray Bias Global Mult. Color Filter (RGB) Color Bleed Object Mult . Extra Ambient (RGB) Bounces Initial Sample Spacing Volumes Subd. Contrast Subd. Down To P8B 88 1 250 0.5 0.03 1 255,255,255 1 1 0,0,0 1 16x16 1 5 1x1 P9B 88 1 250 0.5 0.03 1 255,255,255 1 1 0,0,0 1 16x16 1 5 1x1 P10B 88 1 250 0.5 0.03 1 255,255,255 1 1 0,0,0 1 16x16 1 5 1x1 P11B 88 1 250 0.5 0.03 1 255,255,255 1 1 0,0,0 1 16x16 1 5 1x1 P12B 88 1 250 0.5 0.03 1 255,255,255 1 1 0,0,0 1 16x16 1 5 1x1 P13B 88 1 250 0.5 0.03 1 255,255,255 1 1 0,0,0 1 16x16 1 5 1x1 No.11 FGM 12 W 13 IFGD 14 Rays per FG Point IFGP 15 DB16 Final Gather Color (RGB) Noise Filtering Max. Depth Max. Refl. Max. Refr. GI Color (RGB) GI Mult. Max. Num. Photon per Sample Avg. GI per Light Decay m17 M18 Ray Tracing Method Shadow Mode P8C 1 1 0.1 30 50 1 255,255,255 Standard 6 4 6 255,255,255 1 500 20001 2.1 4 64 BSP 10x40 Segm. P9C 1 1 0.1 30 50 1 255,255,255 Standard 6 4 6 255,255,255 1 500 20001 2.1 4 64 BSP 10x40 Segm. P10C 1 1 0.1 30 50 1 255,255,255 Standard 6 4 6 255,255,255 1 500 20001 2.1 4 64 BSP 10x40 Segm. P11C 1 1 0.1 30 50 1 255,255,255 Standard 6 4 6 255,255,255 1 500 20001 2.1 4 64 BSP 10x40 Segm. P12C 1 1 0.1 30 50 1 255,255,255 Standard 6 4 6 255,255,255 1 500 20001 2.1 4 64 BSP 10x40 Segm. P13C 1 1 0.1 30 50 1 255,255,255 Standard 6 4 6 255,255,255 1 500 20001 2.1 4 64 BSP 10x40 Segm.
9 P8A s.d. P13 A adalah citra yang di-render menggunakan metode Cylight 10
P8B s.d. P13B adalah citra yang di-render menggunakan Scanline GI 11
P8C s.d. P13C adalah citra yang di-render menggunakan mental ray GI 12 Final Gather Multiplier
13 Weight 14
Initial FG Point Density 15 Interpolate Over FG Points 16 Diffuse Bounces
17 Minimum Sample 18
26 Lampiran 5 Kuesioner
27 Lampiran 5 Lanjutan
28 Lampiran 5 Lanjutan
29 Lampiran 5 Lanjutan
30 Lampiran 5 Lanjutan
31 Lampiran 5 Lanjutan
32 Lampiran 5 Lanjutan
33 Lampiran 5 Lanjutan
34 Lampiran 5 Lanjutan
35 Lampiran 5 Lanjutan
36 Lampiran 6 Demografi dan mental model responden
Demografi
Jenis Kelamin (JK) Jumlah Persentase (%)
Laki-laki 71 72.45
Perempuan 25 25.51
Tidak menjawab 2 2.04
Total 98 100
Umur Jumlah Persentase (%)
11-15 tahun 2 2.04 16-22 tahun 58 59.18 23-30 tahun 30 30.61 > 30 tahun 7 7.14 Tidak menjawab 1 1.02 Total 98 100 Mental Model
Bermain game 3D (P4) Jumlah Persentase (%)
Tidak pernah 10 10.20 Pernah 32 32.65 Kadang-kadang 26 26.53 Sering 25 25.51 Selalu 5 5.10 Total 98 100
Menonton animasi 3D (P5) Jumlah Persentase (%)
Tidak pernah 4 4.08 Pernah 18 18.37 Kadang-kadang 20 20.41 Sering 46 46.94 Selalu 10 10.20 Total 98 100
Menggunakan aplikasi 3D (P6) Jumlah Persentase (%)
Tidak bisa 48 48.98 Bisa sedikit 16 16.33 Sedang-sedang saja 24 24.49 Mahir 9 9.18 Tidak menjawab 1 1.02 Total 98 100
Mengetahui istilah GI (P7) Jumlah Persentase (%)
Tidak tahu sama sekali 30 30.61
Rasanya pernah dengar 22 22.45
Sudah tidak asing, tapi kurang/tidak tahu artinya 26 26.53
Paham sekali & tahu artinya 20 20.41
37
Lampiran 7 Data SPSS rank
No. JK Umur P4 P5 P6 P7 P8A P8B P8C P9A P9B P9C P10A P10B P10C P11A P11B P11C P12A P12B P12C P13A P13B P13C
1 1 3 2 2 1 1 1 5 3 4 5 1 3 5 3 4 5 3 4 5 3 3 5 3 2 1 4 2 5 3 3 3 5 1 3 5 1 5 1 3 3 5 1 3 5 1 3 4 3 3 1 4 4 2 2 2 1 4 2 3 5 1 3 1 5 5 3 1 5 3 1 5 3 1 4 1 3 2 4 2 2 5 3 3 4 2 2 4 3 3 5 4 3 5 4 2 5 3 3 5 1 4 4 4 4 3 2 4 1 2 4 1 1 1 3 2 2 2 2 2 2 2 4 1 6 2 3 2 4 1 1 4 2 3 3 4 2 4 3 2 3 4 2 4 3 2 2 3 4 7 2 2 1 1 2 3 5 5 3 2 5 3 2 3 5 2 5 3 2 3 5 2 8 1 4 5 4 4 3 3 5 2 3 5 2 2 3 5 4 3 2 3 4 2 3 5 2 9 1 3 4 4 1 1 5 3 2 2 5 3 3 5 2 3 4 2 3 4 2 5 3 2 10 2 3 2 2 1 1 3 4 1 3 4 1 3 4 1 3 3 1 2 2 2 4 3 1 11 2 3 1 3 1 2 2 5 1 3 5 1 2 3 5 2 3 5 3 3 5 2 3 5 12 1 3 2 4 1 1 3 4 2 3 4 2 3 2 4 2 2 4 13 2 3 3 4 1 2 3 4 2 3 4 2 2 4 3 3 4 2 4 3 2 3 4 2 14 2 3 1 4 1 1 2 3 4 4 3 2 5 3 2 4 4 3 4 3 2 15 2 3 1 1 1 2 3 5 1 1 3 5 3 4 2 3 2 4 5 2 4 1 3 2 16 2 3 1 3 1 1 4 5 2 3 5 2 3 5 3 4 5 3 3 4 2 2 4 2 17 1 3 4 4 1 2 3 5 2 3 4 2 5 2 3 3 3 5 5 3 2 5 4 4 18 1 3 1 4 1 1 3 5 1 4 5 2 3 5 2 4 5 3 4 3 2 4 5 3 19 1 3 2 4 4 3 1 5 3 1 5 3 1 5 3 3 5 1 3 5 1 3 5 1 20 1 4 2 4 2 2 5 4 3 5 4 3 5 4 3 3 5 4 5 4 3 5 4 3 21 1 3 2 2 1 1 3 4 3 3 5 2 3 5 3 4 5 3 4 5 2 5 4 2 22 1 3 2 3 1 3 1 5 3 2 5 2 2 5 2 3 5 1 1 5 3 5 3 2 23 2 4 4 4 1 3 2 3 5 5 3 2 5 4 2 5 3 2 5 4 4 5 4 4 24 1 3 2 2 1 2 2 5 3 4 5 2 4 2 5 4 5 2 3 5 2 3 4 2 25 1 3 4 4 3 2 2 3 2 2 4 1 3 1 3 3 2 4 3 2 4 2 3 4 26 1 3 1 1 1 1 5 3 2 3 5 2 2 3 5 3 5 2 3 5 2 5 3 2
38
Lampiran 7 Lanjutan
No. JK Umur P4 P5 P6 P7 P8A P8B P8C P9A P9B P9C P10A P10B P10C P11A P11B P11C P12A P12B P12C P13A P13B P13C
27 1 4 3 3 1 3 3 4 2 4 3 2 3 4 2 3 4 2 4 3 2 3 4 2 28 1 3 2 5 2 2 3 5 3 3 5 2 4 4 4 4 5 2 4 5 2 4 4 2 29 1 4 3 4 2 4 4 3 2 3 3 2 5 3 2 4 4 2 5 4 3 4 4 3 30 1 3 3 4 1 3 1 5 2 5 2 1 2 1 5 1 5 2 4 1 2 1 1 5 31 1 3 4 3 3 4 3 5 2 3 5 1 5 4 2 5 5 3 4 3 5 4 5 4 32 1 3 3 4 1 3 3 5 4 4 5 3 4 5 3 5 4 3 5 4 3 5 4 3 33 1 5 5 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 34 2 4 2 4 1 2 5 3 3 3 3 3 5 3 1 5 3 1 5 1 3 5 3 3 35 1 2 4 4 3 2 3 5 3 5 5 4 5 5 4 5 5 5 5 4 4 4 4 4 36 1 3 4 3 3 3 3 5 4 5 4 2 4 4 3 4 5 3 5 5 2 4 5 2 37 1 3 2 3 2 2 1 4 3 5 3 3 5 2 4 4 4 1 3 5 2 4 5 1 38 1 4 5 5 4 2 5 2 3 4 4 5 5 3 2 4 5 3 5 3 1 4 5 3 39 2 3 2 4 1 3 2 5 3 3 5 2 2 5 3 5 3 2 3 5 2 3 5 2 40 1 4 4 4 4 4 3 4 1 3 3 1 4 2 3 4 4 1 3 2 3 3 2 3 41 2 5 3 4 3 3 3 5 2 4 5 2 4 1 3 1 2 3 1 2 3 2 3 2 42 1 3 4 5 4 4 2 4 2 3 4 2 3 4 2 4 4 3 3 4 2 2 4 1 43 1 3 3 2 1 2 3 5 2 3 5 2 2 5 3 5 4 3 5 4 3 4 5 3 44 2 4 3 4 3 3 2 4 2 3 4 5 5 5 2 5 5 2 3 4 1 4 5 3 45 1 4 2 2 3 4 3 5 2 3 4 2 5 3 2 3 2 5 5 2 3 4 3 4 46 1 3 2 2 1 4 4 4 3 4 4 3 4 4 3 4 4 3 4 4 4 4 5 3 47 1 3 4 4 1 1 5 3 2 4 3 2 4 2 3 3 4 2 3 5 2 4 3 2 48 1 4 4 5 4 4 1 5 3 5 3 2 5 3 2 5 3 2 5 3 2 3 5 2 49 1 4 4 4 1 3 4 5 3 4 5 3 4 5 3 4 5 3 5 4 3 5 4 3 50 1 3 3 3 1 1 3 5 4 4 5 3 5 4 3 3 4 5 4 4 5 4 5 4 51 2 3 3 3 2 2 5 3 1 5 4 2 3 4 5 4 5 3 5 4 2 4 3 5 52 1 3 4 4 3 3 2 4 1 2 4 2 2 4 2 2 2 4 4 3 2 3 4 2