iOS で SceneKit を試す(Swift 3) その6 - オブジェクトの移動、回転
SceneKit でジオメトリなどのオブジェクトを変更する場合には、 SCNNode に変更を与えることでそこにぶら下がっているオブジェクトを含め変更される。
移動させてみる
前回作成したテンプレートの func setUpScene() の下に以下の命令を書くと、
角が丸まった立方体が X 軸のプラス方向 (画面で右方向) に移動されて表示する。
let box:SCNGeometry = SCNBox(width: 3, height: 3, length: 3, chamferRadius: 0.4) let geometryNode = SCNNode(geometry: box) // 立方体の移動 geometryNode.position = SCNVector3(2, 0, 0) self.rootNode.addChildNode(geometryNode)
SCNNode のノードの位置を表す position のプロパティへ、SCNVector3 のデータタイプを使用して X 軸のプラス方向へ 2 移動させている。
拡大させてみる
geometryNode.scale を追加して縮小。
// 立方体の縮小 geometryNode.scale = SCNVector3(0.5, 0.5, 0.5)
SCNVector3 の値は 1 で等倍であるため、
x, y, z 方向に 0.5 設定することで立方体が半分になる。
例えば x 方向に SCNVector3(0.5, 1, 0.5) にすると縦長の直方体になる
回転させてみる
geometryNode.rotation を追加して回転。
// 立方体の回転 geometryNode.rotation = SCNVector4(1, 0, 0, 0.25 * Float.pi)
rotation のプロパティには SCNVector4 を使用。 SCNVector4 は x, y, z, w のラジアンの角度の構成になっており、x, y, z に対して各軸 w を適応され、x軸で45度回転させている。
角度の成分の合成はいないため SCNVector4(1, 1, 0, 0.5 * Float.pi) としても、X軸 45 度回転、Y軸 45 度回転にはならない。
オイラー角で回転させてみる
geometryNode.rotation を eulerAngles に変更して回転。
// 立方体のオイラー角で回転 let d = 45 * (Float.pi / 180) geometryNode.eulerAngles = SCNVector3(d, d, 0)
eulerAngles を使用すると X軸 45 度、Y軸 45 度で回転できる。
こちらも SCNVector3 の中身はラジアン。
データタイプ
SCNNode で変更を与えるためのデータタイプは以下の4つ。
- SCNVector3
- SCNVector4
- SCNQuaternion
- SCNMatrix4
SCNVector3
3つの Float ベクトル(x,y,z)で構成されたテータ。
主にノードの座標移動、拡大縮小の際に使う。
SCNVector4
4つの Float ベクトル(x,y,z,w)で構成されたテータ。
ノードの回転の際に使用する。
SCNVector4 は w の成分を x,y,z に適応する。
SCNQuaternion
SCNVector4 同様の構造で xx + yy + zz + ww == 1 を満たすクォータニオンでノードを回転させる。
SCNNode の orientation プロパティで使用する。
SCNMatrix4
4 x 4 の Float の行列でノードを変更し、移動、回転、拡大縮小を同時に行う。
SCNNode の transform や worldTransform で使用する
データタイプ | ベクトル | 適応動作 | SCNNode のプロパティ |
---|---|---|---|
SCNVector3 | 3 | 移動 / 拡大縮小 / 回転 | SCNNode.position / SCNNode.scale / SCNNode.eulerAngles |
SCNVector4 | 4 | 回転 | SCNNode.rotation |
SCNQuaternion | 4 | 回転 | SCNNode.orientation |
SCNMatrix4 | 4 x 4 の行列 | 移動 / 回転 / 拡大縮小 | SCNNode.transform / SCNNode.worldTransform |
今回はここまで。