Apple Engine

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

iOS で SceneKit を試す(Swift 3) その16 - Scene Editor の Node Inspector

今回はノードに関する属性を設定できる Node Inspector 部分をもうちょっと詳しく見てみる。

 

Node Inspector の中身は何?

Node Inspector は名前の通り SCNNode で設定できる値になっているが、
オブジェクトの中心軸を決める pivot など、設定できない値がいくつかある。

 

設定項目

  • ノードの名前
  • 位置、回転、拡大縮小、編集時の座標(world/local)
  • 透過、表示・非表示、影の設定
  • ノードの属性(ジオメトリ、カメラ、ライト、ボーンなど)
  • アニメーション設定
  • コンストレイント(制約)設定

 

アニメーションはオブジェクトデータの読み込みの際、 コンストレイントは別記事で紹介。

 

f:id:x67x6fx74x6f:20170706153033p:plain

 

Identity

f:id:x67x6fx74x6f:20170706153852p:plain

Name

オブジェクト取得するための名前。

初期値は nil になっており、コード、Scene Editor でオブジェクトを表示する際に名前は必須ではない。

主に scn ファイルを読み込んだシーンをコードから変更を加えたい場合に使う。

例えば Xcode のゲームテンプレートの GameViewController.swift は、
SCNScene に ship.scn ファイルを設定し、
設定したシーンから ship のノードを名前から調べて回転のアニメーションを追加している。

let scene = SCNScene(named: "art.scnassets/ship.scn")!

// ... 中略 ... 

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

// animate the 3d object
ship.runAction(SCNAction.repeatForever(SCNAction.rotateBy(x: 0, y: 2, z: 0, duration: 1)))

 

Transform

f:id:x67x6fx74x6f:20170706153938p:plain

ノードに対して移動、回転、拡大縮小を設定できる

 

Editing Space

設定が Local と World があり、デフォルトは Local。

今まで使用してきたものが Local の空間となっており、 移動など自分を中心に行うため、親のノードをが移動をするとこのノードは全体の空間での座標と異なる座標になる。

World で移動させた場合、オブジェクトがどの構造になっていても、必ず 0 を原点とした座標で移動できる。

 

空のノード作成。
XYZ を 0, 0, 0 座標に置いた空のノードを親ノードにし、
球を空のノードの子にして XYZ を 0, 0, 0 に設定する。

f:id:x67x6fx74x6f:20170706152630p:plain

 

親を Y 軸方向に 2 に設定。

f:id:x67x6fx74x6f:20170706152731p:plain

 

球は自分の座標をもつため 0 を位置する。

f:id:x67x6fx74x6f:20170706152911p:plain

 

Editing Space を World に変更すると原点からの座標になるため球の座標は 2 になる。

f:id:x67x6fx74x6f:20170706152825p:plain

 

コードで World 座標に移動させる方法は長くなるので別の記事で。

 

Position, Euler, Scale

位置、回転、拡大縮小を X、Y、Z の値で設定変更可能。

位置の初期状態は Local 座標、
回転はラジアンではなく角度、 拡大縮小は 1 が初期値、マイナスでオブジェクトが反転する。

 

Bounding Box

オブジェクトの周りを立方体で囲んだ時の、幅、高さ、奥行きを表し編集はできない。
オブジェクトの初期値から取るため、回転、拡大縮小しても変わらない。

Bounding Box の表示を見たい場合は、 Editor > Display > Show Bounding Box。

拡大縮小させる Bounding Box の表示も変更されるため Bounding Box の値と変わるので注意。

f:id:x67x6fx74x6f:20170706152054p:plain

 

Visibility

f:id:x67x6fx74x6f:20170706154012p:plain

一時的にオブジェクトを非表示にする場合や影についての設定。

 

Opacity

オブジェクトの透明度を 0 〜 1 で設定。
基本、ジオメトリとパーティクルにしか適応できない。

let node = SCNNode()
node.opacity = 0.5 // 半透明になる

 

Visibility

Hidden にチェックを入れるとノードが非表示になる。

チェックを入れると描画されないため、ドローコールやポリンゴン描画、シェーダー、アニメーション、ライトなどでマシンパワーを使用することがなくなる。

let node = SCNNode()
node.isHidden // 表示されなくなる

 

シーンからノードを完全に消したい場合は、
以下のものを使用する。

node.removeFromParentNode()

 

Shadows

デフォルトで Cast Shadow のチェックが入っていている。
Directional、Spot、IES ライトを使用していて、かつこのジオメトリの影を落とせる他のジオメトリがあった場合、このジオメトリの影が対処のジオメトリに描画される。

影を描画する必要がない場合はチェックを外すことで処理を低減できる。

 

Rendering Order

レンダリングする順番。
デフォルトが 0 で値が高いほど後にレンダリングの評価がされる。
パーティクルより前面にジオメトリを表示したいときなど。

 

Category BitMask

描画の際にビットマスクで判別する値。
カメラ、ライト、 SCNTechnique(画面全体に対しての画像処理)に対してこのノードを対象にするかという値。 デフォルトが 1。0 にするといかなる場合でも描画対象から外れる。

物理ボディと物理フィールドの物理判定のビットマスクとは異なるので注意。

 

Attributes

f:id:x67x6fx74x6f:20170706154040p:plain

SCNNode の持つ Node Attributes とは異なり、このノードのチルドノードの種類を指し、
空のチルドノード以外が複数ある場合はここに列挙される。

Node Inspector からは削除はできるが追加はできず、Scene Graph View からノードを移動させて変更する。

以下、変更できるもの。

  • ジオメトリ
  • カメラ
  • ライト
  • ボーン
  • スキナー
  • パーティクル
  • 物理ボディ
  • 物理フィールド

 

Animations

f:id:x67x6fx74x6f:20170706154109p:plain

Scene Editor 上で作成はできない。

外部ファイルを変換する際に自動的に追加されるか、scnanim ファイルを読み込むしかない。
詳しくはオブジェクトデータの読み込みの記事で紹介予定。

ちなみに scnanim はバイナリの plist なのでやろうと思えば自分でつくることができる。
(設定値がめっちゃ多いけど)

 

Constraints

f:id:x67x6fx74x6f:20170706154134p:plain

現状、設定できるのは以下のもの
(Xcode 9 では結構増える)

  • Look At
  • Billboard

詳しくは別記事で紹介する。

 

今回はここまで