• Tidak ada hasil yang ditemukan

Melihat Transformasi

Dalam dokumen JILID 1 (Halaman 126-132)

BAB 7 VIEWING

7.1 Melihat Transformasi

Transformasi tampilan memiliki tugas memetakan lokasi 3D, direpresentasikan sebagai koordinat (x,y,z) dalam sistem koordinat kanonik, ke koordinat dalam gambar, yang dinyatakan dalam satuan piksel. Ini adalah binatang yang rumit yang bergantung pada banyak hal yang berbeda, termasuk posisi dan orientasi kamera, jenis proyeksi, bidang pandang, dan resolusi gambar. Seperti halnya semua transformasi yang rumit, pendekatan terbaik adalah dengan memecahnya menjadi produk dari beberapa transformasi yang lebih sederhana.

Sebagian besar sistem grafis melakukan ini dengan menggunakan urutan tiga transformasi:

 Transformasi kamera atau transformasi mata, yang merupakan transformasi tubuh kaku yang menempatkan kamera pada titik asal dalam orientasi yang nyaman. Itu hanya bergantung pada posisi dan orientasi, atau pose, kamera.

 Transformasi proyeksi, yang memproyeksikan titik-titik dari ruang kamera sehingga semua titik yang terlihat berada dalam kisaran−1 hingga 1 dalam x dan y. Itu hanya tergantung pada jenis proyeksi yang diinginkan.

 Transformasi viewport atau transformasi windowing, yang memetakan persegi panjang gambar unit ini ke persegi panjang yang diinginkan dalam koordinat piksel. Itu hanya tergantung pada ukuran dan posisi gambar output.

Untuk memudahkan dalam mendeskripsikan tahapan proses (Gambar 7.2), kami memberikan nama pada sistem koordinat yang merupakan input dan output dari transformasi tersebut. Transformasi kamera mengubah titik dalam koordinat kanonik (atau ruang dunia) menjadi koordinat kamera atau menempatkannya di ruang kamera. Transformasi proyeksi memindahkan titik dari ruang kamera ke volume tampilan kanonik. Terakhir, transformasi viewport memetakan volume tampilan kanonik ke ruang layar.

Gambar 7.2 Urutan ruang dan transformasi yang mendapatkan objek dari koordinat aslinya ke ruang layar.

Masing-masing transformasi ini secara individual cukup sederhana. Kami akan membahasnya secara rinci untuk kasus ortografis yang dimulai dengan transformasi viewport, kemudian mencakup perubahan yang diperlukan untuk mendukung proyeksi perspektif.

Catatan : Nama lain: ruang kamera juga merupakan “ruang mata” dan transformasi kamera terkadang merupakan “transformasi tampilan;” volume tampilan kanonik juga merupakan

"ruang klip" atau "koordinat perangkat yang dinormalisasi;" ruang layar juga "koordinat piksel."

Transformasi Viewport

Kami mulai dengan masalah yang solusinya akan digunakan kembali untuk kondisi tampilan apa pun. Kami berasumsi bahwa geometri yang ingin kami lihat berada dalam volume tampilan kanonik, dan kami ingin melihatnya dengan kamera ortografis yang melihat ke arah z. Volume tampilan kanonik adalah kubus yang berisi semua titik 3D yang koordinat Cartesiannya antara 1 dan +1—yaitu, (x, y, z) ∈ [−1, 1]3 (Gambar 7.3). Kami memproyeksikan x = 1 ke sisi kiri layar, x = +1 ke sisi kanan layar, y = 1 ke bagian bawah layar, dan y = +1 ke bagian atas layar. Kata "kanonik" muncul lagi—artinya sesuatu yang dipilih secara

sewenang-wenang demi kenyamanan. Misalnya, lingkaran satuan bisa disebut "lingkaran kanonik." Ingat konvensi untuk koordinat piksel dari Bab 3: setiap piksel “memiliki” unit persegi yang berpusat pada koordinat bilangan bulat; batas gambar memiliki setengah unit overshoot dari pusat piksel; dan koordinat pusat piksel terkecil adalah (0,0). Jika kita menggambar ke dalam gambar (atau windows di layar) yang memiliki piksel nx kali ny, kita perlu memetakan persegi [−1, 1]2 ke persegi panjang [−0.5, nx − 0.5] × [−0.5, ny – 0,5].

Untuk saat ini, kita akan mengasumsikan bahwa semua segmen garis yang akan digambar sepenuhnya berada di dalam volume tampilan kanonik. Nanti kita akan mengendurkan asumsi itu ketika kita membahas kliping. Karena transformasi view port memetakan satu persegi panjang sejajar sumbu ke yang lain, ini adalah kasus transformasi windowing yang diberikan oleh Persamaan (6.6):

Persamaan 7.1

[

𝒙𝒔𝒄𝒓𝒆𝒆𝒏 𝒚𝒔𝒄𝒓𝒆𝒆𝒏

𝟏 ]

[ 𝒏𝒙

𝟐 𝟎 𝒏𝒙− 𝟏 𝟐 𝟎 𝒏𝒚

𝟐

𝒏𝒚− 𝟏 𝟐

𝟎 𝟎 𝟏 ]

[

𝒙𝒄𝒂𝒏𝒐𝒏𝒊𝒄𝒂𝒍 𝒚𝒄𝒂𝒏𝒐𝒏𝒊𝒄𝒂𝒍

𝟏 ]

Perhatikan bahwa matriks ini mengabaikan koordinat z dari titik-titik dalam volume tampilan kanonik, karena jarak titik di sepanjang arah proyeksi tidak memengaruhi tempat titik itu memproyeksikan dalam gambar. Tetapi sebelum kita secara resmi menyebutnya matriks viewport, kita menambahkan baris dan kolom untuk membawa koordinat z tanpa mengubahnya. Kita tidak membutuhkannya dalam bab ini, tetapi pada akhirnya kita akan membutuhkan nilai z karena nilai tersebut dapat digunakan untuk membuat permukaan yang lebih dekat menyembunyikan permukaan yang lebih jauh (lihat Bagian 8.2.3).

𝑴𝒗𝒑 = [

𝒏𝒙

𝟐 𝟎 𝟎 𝒏𝒙− 𝟏 𝟐 𝟎

𝟎 𝟎

𝒏𝒚 𝟐𝟎 𝟎

𝟎 𝟏 𝟎

𝒏𝟐− 𝟏 𝟐 𝟎

𝟏 ]

Memetakan persegi ke persegi panjang yang berpotensi non-persegi tidak menjadi masalah; x dan y hanya berakhir dengan faktor skala yang berbeda dari koordinat kanonik ke piksel.

Gambar 7.3 Volume tampilan kanonik adalah kubus dengan panjang sisi dua berpusat di titik asal.

Transformasi Proyeksi Ortografis

Tentu saja, kita biasanya ingin menampilkan geometri di beberapa wilayah ruang selain volume tampilan kanonik. Langkah pertama kita dalam menggeneralisasi tampilan akan menjaga arah dan orientasi tampilan tetap terlihat sepanjang z dengan +y ke atas, tetapi akan memungkinkan sembarang persegi panjang untuk dilihat. Daripada mengganti matriks viewport, kita akan menambahnya dengan mengalikannya dengan matriks lain di sebelah kanan.

Di bawah batasan ini, volume tampilan adalah kotak sejajar sumbu, dan kami akan memberi nama koordinat sisi-sisinya sehingga volume tampilan adalah [l,r]×[b,t]×[f,n] yang ditunjukkan pada Gambar 7.4. Kami menyebut kotak ini volume tampilan ortografis dan mengacu pada bidang pembatas sebagai berikut:

x = l ≡ left plane, x = r ≡ right plane, y = b ≡ bottom plane, y = t ≡ top plane, z = n ≡ near plane, z = f ≡ far plane

Kosakata tersebut mengasumsikan seorang penonton yang melihat sepanjang sumbu z minus dengan kepala mengarah ke arah y.2 Ini menyiratkan bahwa n>f, yang mungkin tidak intuitif, tetapi jika Anda mengasumsikan seluruh volume tampilan ortografis memiliki nilai z negatif maka z = n bidang “dekat” lebih dekat ke pengamat jika dan hanya jika n>f ; di sini adalah bilangan yang lebih kecil dari n, yaitu bilangan negatif dari nilai zat terlarut yang lebih besar dari n.

Gambar 7.4 Volume tampilan ortografi.

Gambar 7.5 Volume tampilan ortografis berada di sepanjang sumbu z negatif, jadi f adalah angka yang lebih negatif daripada n, sehingga n > f.

2 Sebagian besar programmer merasa intuitif untuk memiliki sumbu x yang menunjuk ke kanan dan sumbu y yang mengarah ke atas. Dalam sistem koordinat tangan kanan, ini menyiratkan bahwa kita melihat ke arah z.

Beberapa sistem menggunakan sistem koordinat tangan kiri untuk melihat sehingga arah pandangan sepanjang +z. Mana yang terbaik adalah masalah selera, dan teks ini mengasumsikan sistem koordinat tangan kanan.

Sebuah referensi yang mendukung sistem tangan kiri diberikan dalam catatan di akhir bab ini.

Konsep ini ditunjukkan pada Gambar 7.5. Transformasi dari volume tampilan ortografis ke volume tampilan kanonik adalah transformasi windows lainnya, jadi kita dapat dengan mudah mengganti volume tampilan ortografis dan kanonik yang terikat ke dalam Persamaan (6.7) untuk mendapatkan matriks untuk transformasi ini:

Matriks ini sangat dekat dengan matriks yang digunakan secara tradisional di OpenGL, kecuali bahwa n, f, dan zkanonik semuanya memiliki tanda yang berlawanan.

Untuk menggambar segmen garis 3D dalam volume tampilan ortografis, kami memproyeksikannya ke koordinat x-andy layar dan mengabaikan koordinat z. Kami melakukan ini dengan menggabungkan Persamaan(7.2)dan (7.3). Perhatikan bahwa dalam sebuah program kita mengalikan matriks bersama-sama untuk membentuk satu matriks dan kemudian memanipulasi titik-titik sebagai berikut:

Koordinat z sekarang akan berada di [−1,1]. Kami tidak mengambil keuntungan dari ini sekarang, tetapi akan berguna ketika kami memeriksa algoritma buffer-z. Kode untuk menggambar banyak garis 3D dengan endpointsai dan bi menjadi sederhana dan efisien:

construct Mvp construct Morth M = MvpMorth

for each line segment (ai, bi) do p = Mai

q = Mbi

drawline(xp, yp, xq, yq) Transformasi Kamera

Kami ingin dapat mengubah sudut pandang dalam 3D dan melihat ke segala arah. Ada banyak konvensi untuk menentukan posisi dan orientasi pemirsa. Kami akan menggunakan yang berikut ini (lihat Gambar 7.6):

 posisi mata e,

 arah tatapan g,

 vektor tampilan t.

Posisi mata adalah lokasi yang "dilihat dari" mata. Jika Anda menganggap grafis sebagai proses fotografi, itu adalah pusat lensa. Arah pandangan adalah vektor apa pun ke arah yang dilihat oleh pemirsa. Vektor view-up adalah vektor apa pun di pesawat yang membagi kepala pemirsa ke kanan dan kiri dan menunjuk "ke langit" untuk seseorang yang berdiri di tanah.

Vektor-vektor ini memberi kita informasi yang cukup untuk membuat sistem koordinat dengan asal e dan basis uvw, menggunakan konstruksi Bagian 2.4.7:

Tugas kita akan selesai jika semua titik yang ingin kita ubah disimpan dalam koordinat dengan vektor asal dan basis su, v, dan w. Tetapi seperti yang ditunjukkan pada Gambar 7.7, koordinat model disimpan dalam bentuk sumbu kanonik (atau dunia) asal dan sumbu x-,y-,danz. Untuk menggunakan mesin yang telah kita kembangkan, kita hanya perlu mengubah koordinat titik akhir segmen garis yang ingin kita gambar dari koordinat xyz menjadi koordinat uvw. Transformasi semacam ini telah dibahas di Bagian 6.5, dan matriks yang memberlakukan transformasi ini adalah matriks kanonik-ke-basismater dari bingkai koordinat kamera:

Sebagai alternatif, kita dapat memikirkan transformasi yang sama ini sebagai pertama-tama memindahkan e ke titik asal, kemudian menyelaraskan,v,w ke x,y,z.

Gambar 7.6 Pengguna menentukan tampilan sebagai posisi mata e, arah tatapan g, dan vektor ke atas t. Kami membangun basis tangan kanan dengan w menunjuk berlawanan

dengan pandangan dan v berada pada bidang yang sama dengan g dan t.

Gambar 7.7 Untuk tampilan sewenang-wenang, kita perlu mengubah titik yang akan disimpan dalam sistem koordinat yang "sesuai". Dalam hal ini memiliki koordinat asal e dan

offset dalam bentuk uvw.

Untuk membuat algoritme tampilan hanya sumbu-z kita sebelumnya berfungsi untuk kamera dengan lokasi dan orientasi apa pun, kita hanya perlu menambahkan transformasi kamera ini ke produk transformasi viewport dan proyeksi, sehingga mengubah titik masuk dari dunia ke koordinat kamera sebelum diproyeksikan:

construct Mvp construct Morth construct Mcam M = MvpMorthMcam

for each line segment (ai, bi) do p = Mai

q = Mbi

drawline(xp, yp, xq, yq)

Sekali lagi, hampir tidak ada kode yang diperlukan setelah infrastruktur matriks siap.]

Dalam dokumen JILID 1 (Halaman 126-132)