AR 開發中常常遇到的問題是:我已經打開了 Debug 選項或者使用了 Debug 工具,可是如何看出座標系的姿態和位置?怎麼看出來哪一個是 x 軸,哪一個是 y 軸?swift
// Debug 選項,顯示世界座標的原點
var debugOptions: SCNDebugOptions = []
debugOptions.insert(ARSCNDebugOptions.showWorldOrigin)
sceneView.debugOptions = debugOptions
複製代碼
還有的問題是:我在 .scn/.dae 文件中調整 3D 模型時,x/y/z 位置怎麼對應?歐拉角 x/y/z 又怎麼區分正負? 工具
先說明一下座標的對應關係: 座標軸通常是用顏色來區分的,(x,y,z) 軸對應 RGB 三種顏色。由於蘋果在 AR/3D 中使用右手系,也能夠用手指來表示:大拇指,食指,中指 分別對應 (x,y,z) 軸: spa
至於歐拉角的正負,也是用右手螺旋法則來判斷:將右手大拇指對準轉軸,其他手指的彎曲方向就是正方向:可是前面所講的 Position 和 Euler 角度是相對於誰的呢?通常調整的是 Local ,即相對於父結點(parentNode)的,若是沒有父結點,那就是相對於 scene.rootNode 的。debug
以下圖,這個 .scn 文件內部的 camera,plane 等結點都是放在 scene.rootNode 下面的,因爲 camera 的 Position 和 Euler 角度都是 0,因此相機和 scene.rootNode 座標徹底重合。 3d
這裏 plane 的 Position 爲 (0,0,-10),即相對於父結點 scene.rootNode 在 z 軸負方向移動 10 米。這也意味着 plane 的 worldPosition 其實也是 (0,0,-10)。又以下圖中,plane 的父結點是 ship,ship 的父結點是 scene.rootNode。那麼,當調整 plane 的 Position 和 Euler 都是相對於 ship 座標系的。 code
當出現沒法經過目視來檢查座標軸的狀況時,咱們也能夠打印直接輸出 Position 和 Euler 來判斷位置。cdn
那麼若是隻拿到了矩陣,如何經過用右手三根手指比劃出 x,y,z 座標軸的位置和方向來判斷物體的位置與姿態?又要請出這幅圖了: blog
因爲 AR 中都是列主序的,那麼矩陣的第一列前三個就是 x 軸的位置。最後一列則是位置信息。對於 SCNMatrix 類型來講:m11,m12,m13 就是 x 軸在父座標系中的方向;m21,m22,m23 就是 y 軸在父座標系中的方向;m31,m32,m33就是 z 軸在父座標系中的方向;m41,m42,m43就是座標原點在父座標系中的位置。ip
同理可知,simdfloat4x4 類型也是如此,column[0] 的前三個份量表明 x 軸在父座標系中的方向......開發
知道了座標軸的方向和位置,只須要再用右手比劃一下,就能知道物體的位置和方向了。