Apple Engine

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

iOS で SceneKit を試す(Swift 3) その55 - SCNNode の Pivot(原点)を変更する

SCNNode の説明で書き忘れていた Pivot について。

SCNNode には Pivot と呼ばれる原点がある。
例えば球のジオメトリである SCNSphere は Pivot が中心にあり、
移動、回転、拡大縮小を行なった場合、中心から動作が行われる。

f:id:x67x6fx74x6f:20170808123637p:plain

 

Pivot を変更することのメリット

以前、LookAt コンストレイントを使用する際、新しいノードを作成し子のノードに X 軸方向に移動させたジオメトリ設定し、
ノードを回転させることで、X 軸方向移動分を半径として回転させていた。

ノードの Pivot を変更することで、回転の軸となる原点が変わるため、 親のノードを作成しなくても済む。

 

また、床が Y 軸 0 あり、 キャラクターなどがジオメトリ中央から作成されている場合、
シーン配置時に足の裏の Pivot を変更することで、 キャラクターは Y 軸 0 で地面につくことができる。

Pivot はノードの原点をプログラム上で変更できるため、 このような対応が可能となる。

 

コードを書いてみる

宇宙船の回転を変更してみる。

Xcode から iOS の Game テンプレートでプロジェクト作成。

GameViewController.swift の let ship 〜 にコードを追加

// retrieve the ship node
let ship = scene.rootNode.childNode(withName: "ship", recursively: true)!

// --- 追加分 ---
ship.pivot = SCNMatrix4MakeTranslation(10.0, 0.0, 0.0)

pivot は SCNMatrix4 の値を渡すようになっており、16個値を設定するのが面倒なので SCNMatrix4MakeTranslation で移動部分だけ渡している。

 

ビルドするとこんな感じ

f:id:x67x6fx74x6f:20170808123815g:plain

  

今回はここまで