object space → world space → camera space → clip space → screen space
今天也來講一些比較基本功、概念類的東西。(因為時差的關係,不小心把整個下午都睡掉了,嗚嗚嗚好慘)
在 render pipeline 裡,物件會先經過一系列的座標轉換,最終透過 shader 畫出來,非常的簡而言之的話座標系的轉換就是決定 3D 到 2D 的過程。
這個概念在理解上並不會是太困難的概念,但實作上是非常重要的,因為它決定了物體在 3D 空間中的位置和如何被 render 到螢幕上。困難的部分是因為其中的運算牽扯到矩陣,那大家都知道數學不會就是不會,還好有 Three.js 來拯救世界。因此今天就只會討論基本的概念,最後用 Three.js 來介紹一下實作的話,可以怎麼寫。
Three.js 的 API 都包得很高階,真是太神奇、太方便了!!
const localPosition = new THREE.Vector3(1, 1, 1)
const worldPosition = object.localToWorld(localPosition.clone())
反之,則可以 call worldToLocal
const worldPosition = newTHREE.Vector3(5, 5, 5)
const viewPosition = worldPosition.applyMatrix4(camera.matrixWorldInverse)
const viewPosition = newTHREE.Vector3(0, 0, -5)
const clipPosition = viewPosition.applyMatrix4(camera.projectionMatrix)
這些轉換我自己沒有直接在 Three.js 中使用過,在 OpenGL 這類的語言中,這三個矩陣轉換,又稱 MVP 矩陣,常在 vertex shader 使用以定義物件頂點的位置,然後以利 render pipeline 接下來的步驟方便操作,如 rasterization 等。