iOS で SceneKit を試す(Swift 3) その17 - SCNNode の worldTransform
前回 Scene Editor で World 座標での設定箇所にふれた。
今回はコード上から行ってみる。
その前に 4x4 の行列 SCNMatrix4 での移動方法
SCNMatrix4 は 4x4 になっているため、設定できる値は16個ある。 以下のようにし、移動させる場合は m41, m42, m43 の値変更を修正。
var m = SCNMatrix4( m11: 1.0, m12: 0.0, m13: 0.0, m14: 0.0, m21: 0.0, m22: 1.0, m23: 0.0, m24: 0.0, m31: 0.0, m32: 0.0, m33: 1.0, m34: 0.0, m41: 0.0, m42: 0.0, m43: 0.0, m44: 1.0 )
見たままだけど一応書いてみる
パラメータ | XYZ軸 |
---|---|
m41 | X |
m42 | Y |
m43 | Z |
試しに移動させてみる。
変更させたい SCNMatrix4 の値をノードの transform に入れて移動させてみる。
// 先ほどの SCNMatrix4 の m を Y軸方向 2 に移動させてみる m.m42 = 2.0 let node = SCNNode() node.transform = m
コードで World 座標を調べたり、移動させてみる
Scene Editor 上ではあまり World 座標は使わないかもしれないが、 コードで操作する場合、複雑に階層化されたオブジェクトを World 座標に移動させたいこともあると思う。
ノードの worldTransform で 4x4 の行列で現在の移動値が返ってくるのでそれを操作する。
以下のコードでは、前回の親ノードが Y 軸 2 にあり、 その子の球(名前を sphere )が Y 軸 0 あるものを World 座標の 0 に移動させてみる。
let sphere = scene?.rootNode.childNode(withName: "sphere", recursively: true)! var m:SCNMatrix4 = (sphere?.worldTransform)! print((sphere?.position.x)!) // 0.0 print(m.m42) // 2.0 m.m42 = -2.0 // Y を -2.0 で移動させる sphere?.transform = m
今回、transform に SCNMatrix4 を入れて移動させているが、これまでで使用している SCNVector3 を position 入れる方法でも問題はない。
唯一の注意点としては worldTransform は get のプロパティなので値を代入することはできない。
ちなみに、iOS 11 SDK ではもっと便利なノードの操作の API が追加されているので試してみるのも良いのかもしれない。
今回はここまで。