Komputer Grafik
1
Viewing 3D
Tujuan: memberi kesan pada viewer bahwa ia melihat foto
3D dengan cara yg sama saat kita memotret obyek 3D ke film 2D.
memproyeksikan obyek 3D ke
bidang 2D
2
Pinhole Camera
Kamera lubang jarum bayangan terbalik.
Komputer grafik kamera diletakkan di depan film bayangan
tegak. Kamera sering disebut juga sbg mata, viewpoint, posisi kamera. Film sering disebut juga sbg bidang bayangan (image plane). 3
Utk kemudahan, kita anggap bahwa bidang bayangan tersusun atas piksel-piksel.
Perhatikan bahwa bayangan yg terbentuk pd bidang bayangan adalah bayangan tegak.
4
Kamera Komputer Grafik Langkah-langkah utk membuat gambar komputer grafik mirip (analog) dengan langkah-langkah utk memotret obyek riil. Berikut bbrp hal yg hrs ditentukan: 1.
Viewing transformation Langkah ini adl mengeset posisi pandangan (analog dgn memposisikan dan mengarahkan kamera).
2.
Object/Modeling transformation Digunakan utk memposisikan model dan menentukan bgmn orientasinya (analog dgn mengatur komposisi yg diinginkan).
5
Misalnya kita akan merotasi, menggeser, atau men-skala modelnya (atau kombinasi transformasi). Gambar berikut menggambarkan langkah 1 dan 2.
Terlihat bahwa posisi kamera telah ditentukan dan juga komposisi kedua obyek.
6
3.
Transformasi proyeksi Menentukan transformasi proyeksi seperti memilih lensa kamera atau mengatur zoom. Transformasi ini menentukan keluasan
pandangan yg jg disebut volume pandangan (viewing volume). Juga ditentukan letak dan orientasi bidang bayangan dan bgmn obyek di klip dan diproyeksikan.
7
4.
Transformasi Viewport Transformasi ini menentukan bentuk area screen dimana obyek akan dipetakan dan ditampilkan. Proses ini analog dgn menentukan seberapa besar foto yang akan dihasilkan.
Urutan transformasi:
8
Transformasi Obyek/Model Contoh: Memindah, men-skala, dan memutar piramid pada sumbu y (vertikal). Viewing Transformation Transformasi ini dpt menggunakan proses translasi (glTranslated) dan proses memutar (glRotate). Viewing transformation jg dpt dilakukan menggunakan perintah gluLookAt utk menentukan garis pandangnya. Sintaks: gluLookAt (GLdouble eyex, GLdouble eyey, GLdouble eyez, GLdouble centerx, GLdouble centery, GLdouble centerz, GLdouble upx, GLdouble upy, GLdouble upz);
9
eyex, eyey, eyez : menentukan letak viewing matrix centerx, centery, centerz : menentukan letak obyek yg dilihat upx, upy, upz : menentukan sumbu mana yg mengarah ke atas (arah viewing volume dr dasar sampai puncak)
Misal: gluLookAt (0.0, 0.0, 0.0, 0.0, 0.0, -100.0, 0.0, 1.0, 0.0); 10
Contoh: menjauhkan dan mendekatkan obyek dari pandangan sekaligus memutar. Transformasi Proyeksi Transformasi proyeksi ditentukan oleh volume pandangan (viewing volume), posisi kamera (viewpoint), dan bidang bayangan atau bidang proyeksi. Volume pandangan dan viewpoint menentukan bgmn obyek 3D diproyeksikan pd bidang proyeksi. Kita menggunakan garis-garis lurus yang disebut proyektor. Proyektor digambar dari pusat proyeksi (viewpoint) menuju ke setiap titik sudut pd obyek. Titik potong garis proyektor dan bidang bayangan akan membentuk proyeksi obyek (bayangan). Dua jenis proyeksi pd gambar berikut adl proyeksi perspective dan paralel.
11
Proyeksi perspective
Proyeksi Paralel
Perhatikan gambar di atas. Apa perbedaan antara proyeksi perspective dan proyeksi paralel?
12
Proyeksi Perspective Ciri proyeksi perspective: semakin jauh letak obyek dari kamera, maka bayangan obyek akan semakin kecil. Obyek yg dekat dgn viewpoint akan terlihat lebih besar. Metode proyeksi ini yg pd umumnya digunakan dlm animasi dan simulasi visual krn mpy prinsip kerja yg mirip dgn mata manusia (kamera). Perintah glFrustum dpt digunakan utk menentukan volume pandangan. Sintaksnya sbb: glFrustum (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far);
Perhatikan gambar pd halaman berikut.
13
Volume pandangan (viewing volume) ditentukan oleh 6 argumen dlm glFrustum. Obyek yg berada di luar volume pandangan akan dipotong.
Volume pandangan menggunakan glFrustum
14
Perintah lain utk menentukan volume pandangan adl gluPerspective. Sintaksnya sbb: glPerspective (GLdouble fovy, GLdouble aspect, GLdouble near, GLdouble far);
fovy : besarnya sudut pandang dlm bidang xz (lihat gambar pd glFrustum); besarnya dalam jangkauan 0 hingga 180.
aspect: besarnya aspect ratio dari frustum, yaitu lebar dibagi tinggi. Proyeksi Paralel (Orthographic) Proyeksi paralel adl proyeksi dimana pusat proyeksinya berada di
titik tak hingga. Jenis proyeksi ini tdk memperdulikan lokasi viewpoint; garis proyektor mrpk garis-garis yg sejajar (paralel).
15
Perhatikan ilustrasi berikut.
Terlihat bahwa garis-garis proyeksi adalah sejajar (paralel), untuk pandangan dari depan (front), samping (side), maupun atas (top).
16
Transformasi Viewport Transformasi viewport mentransformasikan bidang bayangan ke satu wilayah khusus dlm window. Default-nya, viewport adl seluruh piksel yg ada pd window. Kita bisa menggunakan perintah glViewport() utk memilih wilayah tertentu dlm window (lihat kembali materi awal dlm matakuliah ini).
Tugas 1.
Coba temukan dimana jenis-jenis transformasi yg telah dibahas di atas pernah kita gunakan. Jelaskan.
2.
Jika ada jenis transformasi yg belum pernah digunakan, cobalah bereksperimen. Bagaimana hasilnya? (satu saja)
17
Output proyeksi paralel memang tdk realistik krn obyek tdk berubah ukurannya meski letaknya jauh atau dekat dgn viewpoint. Namun jenis proyeksi ini bermanfaat utk keperluan pengukuran besar obyek dan seringkali digunakan saat pemodelan, gambar-gambar teknik, dan cetak biru dlm arsitektur. Proyeksi paralel disebut orthographic jika arah proyeksi adl ortogonal (90) trhdp bidang proyeksi; yg paling umum adl sepanjang sumbu x (arah pandangan depan/front dgn bid proy pd yz), sepanjang sumbu y (arah pandangan atas/top dgn bid proy pd xz), dan sepanjang sumbu z (arah pandangan samping/side dgn bid proy pd xy). Dgn proyeksi orthographic maka volume pandangan (viewing volume) akan berbentuk kotak (lht gbr pd hal berikut)
18
Perintah utk menentukan volume pandangan menggunakan proyeksi orthographic adl glOrtho. Sintaksnya sbb: glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far);
19