Apple Engine

Apple, iPhone, iOS, その周辺のことについて

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 が追加されているので試してみるのも良いのかもしれない。

 

今回はここまで。