Projection Matrix, Clip Space, Perspective Divide, dan NDC

Untuk mengubah primitif-primitif 3D menjadi pixel-pixel di layar, diperlukan fungsi yang menerima masukan kordinat 3D dan mengembalikan kordinat 2D layar. Diperlukan juga fungsi clipping yang menentukan apakah titik 3D tertentu berada di dalam layar kamera.

Kedua fungsi diatas dapat dicapai dengan menggunakan Projection Matrix. Projection matrix mengubah kordinat 3D yang berada di View Space (kordinat 3D relatif terhadap sistem kordinat kamera) menjadi Clip Space. Pada Clip Space ini, graphics platform akan menentukan apakah suatu titik/vektor berada di dalam layar atau tidak, jika iya, titik/vektor tersebut akan kemudian ditransformasi menjadi kordinat NDC. Tahap transformasi terakhir ini dinamakan Perspective Divide. Vektor hasil Perspective Divide kemudian akan ditransformasikan menjadi kordinat NDC ayng digunakan oleh graphics driver untuk menentukan dimana posisi titik tersebut di layar.

Agar titik kordinat 3D dapat ditransformasikan dengan baik oleh graphics driver, diperlukan Projection Matrix. Untuk menghitung Projection Matrix, perlu diketahui terlebih dahulu tahapan-tahapan transformasi titik yang dilakukan oleh graphics driver dengan dimulai dari tahapan terakhir transformasi yaitu kordinat NDC dan kemudian sampai ke tahapan pertama yaitu Projection Matrix.

Continue reading

Tes Perpotongan Antara Frustum dan AABB

Frustum didefinisikan dengan 6 bidang datar (Plane) dengan setiap plane didefinisikan dengan vektor normal dan satu titik yang berada di plane tersebut.

Untuk tes AABB dengan frustum (frustum tersebut sendiri dapat mempunyai orientasi), salah satu cara sederhana yang orang pikir pertama adalah dengan menyatakan AABB berada di luar frustum jika semua titik AABB berada di luar frustum. Akan tetapi, dapat dilihat dibawah, terdapat kasus-kasus tertentu dimana ini tidak benar (false negative).

Continue reading

Titik Potong Ray – AABB

Titik potong ray – AABB adalah kasus khusus dari titik potong ray – OBB (dapat dibaca di sini) dimana axis dari OBB akan selalu selaras dengan world axis.

Sehingga rumus yang didapat dari titik potong ray – OBB dapat disederhanakan menjadi (untuk axis_i):

    \[ $t_{near} = \frac{aabbmin_i - rayorigin_i}{r_i}$ \]

    \[ $t_{far} = \frac{aabbmax_i - rayorigin_i}{r_i}$ \]

Sama seperti titik potong Ray – OBB, t_{near} > t_{far} dapat terjadi, yang mana kedua nilai tersebut harus ditukar sehingga didapatkan t_{near} < t_{far}. Kasus khusus yang disebutkan di titik potong ray – OBB tetap terjadi disini (ray mempunyai arah yang tegak lurus dengan arah axis).

Tes Perpotongan Antar AABB

Axis Aligned Bounding Box (kotak selaras sumbu?) didefinisikan sebagai volume yang dibatasi dengan dua titik, min dan max. Pada left-handed coordinate system, min adalah titik paling kiri-bawah-depan sedangkan max adalah titik paling kanan-atas-belakang.

Ingin diketahui apakah AABB a (min_a, max_a ) dan AABB b (min_b, max_b ) saling berpotongan,

Diketahui : 

  • Empat titik : min_a, max_a, min_b, max_b

Continue reading

Self Registrator Link Optimization Problem

Self registrator, atau bisa juga disebut registry pattern adalah trik yang digunakan untuk mendaftarkan tipe class ke object factory (wikipedia).

Sebagai contoh, terdapat class Object dan ObjectFactory. Tugas ObjectFactory adalah meng-instansiasi suatu object dengan Tipe Object (atau turunannya) dan mengembalikan object tersebut ke user. Salah satu contoh API yang dapat digunakan oleh user adalah dengan memanggil

Continue reading

Titik Potong Ray-Plane

Ray didefinisikan sebagai titik-titik p yang memenuhi persamaan:

    \[ $p = \overline{r}*t + o$ \]

Bidang didefinisikan sebagai titik-titik q yang memenuhi persamaan:

    \[ $\overline{n} \cdot (q-q_0) = 0$ \]

dengan q_0 adalah salah satu titik yang ada di bidang.

Gambar di bawah ini menggambarkan bidang (garis kuning) dengan normal \overline{n}, A sebagai titik mulai ray, B sebagai titik potong antara ray dengan bidang, C adalah salah satu titik yang diketahui sebelumnya berada di bidang(dalam persamaan di atas berarti q_0), dan D adalah titik jarak terdekat antara bidang dengan titik A.

Continue reading