SceneKit 節點的 transform 變換矩陣,如何與位移(position)、旋轉(rotation)、縮放(scale)等操作對應及換算呢?其中位移與縮放較單純,只用到加法與乘法;旋轉則用到三角函數,且依X/Y/Z軸轉動而有所不同,分別說明如下。

位移

節點.position = SCNVector3(dx, dy, dz)

這行程式碼將節點位置移到(dx, dy, dz)座標,產生以下變換矩陣:

$$ \tag{3}\begin{bmatrix} x' & y' & z' & 1 \end{bmatrix} = \begin{bmatrix} x & y & z & 1 \end{bmatrix} \begin{bmatrix} 1 & 0 & 0 & 0\\ 0 & 1 & 0 & 0\\ 0 & 0 & 1 & 0\\ dx & dy & dz & 1 \end{bmatrix} $$

該節點內容在顯示前,3D物件的每個座標都會經過變換,根據上面的公式,新的座標為:

$$ \tag{4}\begin{aligned}\begin{bmatrix} x' & y' & z' \end{bmatrix} &= \begin{bmatrix} x+dx & y+dy & z+dz \end{bmatrix} \\ &= \begin{bmatrix} x & y & z \end{bmatrix}+\begin{bmatrix} dx & dy & dz \end{bmatrix} \end{aligned} $$

相當於兩向量相加,也就是原座標(x, y, z)加上位移(dx, dy, dz)。

縮放(及鏡像)

節點.scale = SCNVector3(a, b, c)

這行程式碼會產生以下變換矩陣:

$$ \tag{5}\begin{bmatrix} x' & y' & z' & 1 \end{bmatrix} = \begin{bmatrix} x & y & z & 1 \end{bmatrix}\begin{bmatrix} a & 0 & 0 & 0\\ 0 & b & 0 & 0\\ 0 & 0 & c & 0\\ 0 & 0 & 0 & 1 \end{bmatrix} $$

結果等於:

$$ \tag{6}\begin{bmatrix} x' & y' & z' \end{bmatrix} = \begin{bmatrix} ax & by & cz \end{bmatrix} $$

這個變換矩陣可以對3D物件產生放大、縮小、鏡像三種操作。當a為負值時,X座標值正變負或負變正,會對Y-Z平面產生鏡像;b負值則對X-Z平面產生鏡像;c負值對X-Y平面產生鏡像。若a/b/c絕對值小於1.0,就是沿X/Y/Z軸縮小;a/b/c絕對值大於1.0,則是沿X/Y/Z軸放大。

對X軸旋轉𝜃弧度

節點.rotation = SCNVector4(1, 0, 0, 𝜃)

這行程式碼會產生以下變換矩陣: