前面提到,「座標變換」(Transform)是 RealityKit 所有個體的必備元件,用來操作個體的位移、旋轉、縮放,是個體在空間中任何活動 — 如動作動畫、物理模擬的關鍵元件。

上一節有個小地方沒有詳細解釋,但背後卻有非常重要的觀念:

let 接點0 = 上臂.pins.set(
    named: "上臂底端",
    position: [0, -0.3, 0],
    orientation: .init(angle: .pi * 0.5, axis: [0, 0, 1])
)

這裏的位置(position)和旋轉面向(orientation)所含座標倒底是參考哪個座標系?原廠文件只說相對於個體(”a local transform relative to an entity”),是指個體的局部座標系嗎?這要如何理解?

如果這一關過不去,後面更複雜的情境,將會寸步難行。

座標變換包含兩個重要觀念,一是變換矩陣的運算,可參考上半單元補充(4) 變換矩陣如何轉換座標 ;二是空間座標系統,RealityKit 有兩種座標系統:世界坐標系(World coordinate system)與局部座標系(Local coordinate system)。

世界座標系有時也稱為全域坐標系(Global coordinate system),在 RealityView 視圖中只有唯一一個,不會移動也不會轉動,是整個虛擬空間的基準座標系統。

如同我們熟知的,世界座標原點永遠對準 RealityView 視圖中心,X/Y/Z軸方向若以使用者角度來看,X正軸往右、Y正軸往上、Z正軸指向使用者(其實是虛擬鏡頭位置),X/Y/Z三軸方向不會改變,但虛擬鏡頭方位與視角可操作變更(這是視圖修飾語 .realityViewCameraControls(.orbit) 的作用)。

局部座標系則是每個個體都有一個,是繼承父個體的內部座標系(註解一)而來,當父個體移動或轉動時,座標系原點就會跟著移動,X/Y/Z軸方向也同步轉動。如此一來,子個體與父個體的相對位置及方向,才不會隨父個體的移動或轉動而改變。

以下我們一步一步用程式來理解世界座標、局部座標與座標變換的關係。

(1) 設定父個體: