Apple Engine

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

iOS で SceneKit を試す(Swift 3) その18 - Scene Editor の Constraints を試す

3DCG ではオブジェクトの動きなどに制約を与えるコンストレイントというものがある。

SceneKit では SCNConstraint というスーパークラスがあり、サブクラスで機能が割り当てられている。
一応、SCNTransformConstraint というクラスが用意されており、カスタムのコンストレイントを作成することもできる。

 

SceneKit で使用できるコンストレイントは以下のもの。

名称 機能
Look At コンストレイント 指定したノードの方向へ必ず回転するように維持する
Billboard コンストレイント 現在のカメラへ指定した方向に必ずなるように回転を維持する
IK コンストレイント インバース・キネマティックを行うために使用する

 

IK コンストレイント は Scene Editor では設定できないようなので、オブジェクト読み込みかボーンの際、説明しようと思う。

 

下準備

カメラ

シーンファイル (.scn) のカメラを選択。
Node Inspector を開き(Command + Option + 3)を開き、
以下に設定

X Y Z
Position 0 2 0
Eular -20 0 0
Scale 1 1 1

 

f:id:x67x6fx74x6f:20170706193532p:plain  

オブジェクトライブラリから Floor を Scene Editor にドラッグ&ドロップして配置。

初期値は位置と回転 0 だが、違っていたら 0 にする。

X Y Z
Position 0 0 0
Eular 0 0 0
Scale 1 1 1

 

f:id:x67x6fx74x6f:20170706193548p:plain  

スポットライト

オブジェクトライブラリから Floor を Scene Editor にドラッグ&ドロップして配置し以下に設定を変更。

X Y Z
Position 0 5 0
Eular -90 0 0
Scale 1 1 1

 

f:id:x67x6fx74x6f:20170706193601p:plain

 

空のノードと球

オブジェクトライブラリから Empty Node を Scene Editor にドラッグ&ドロップ、
もしくは Scene Graph View の左下「+」のアイコンを押して、 空のノードを追加し原点に設定。

X Y Z
Position 0 0 0
Eular 0 0 0
Scale 1 1 1

 

f:id:x67x6fx74x6f:20170706193639p:plain  

オブジェクトライブラリから Sphere を Scene Editor にドラッグ&ドロップして配置し以下に設定を変更。

X Y Z
Position -1.5 0.4 0
Eular 0 0 0
Scale 0.4 0.4 0.4

 

Scene Graph View で球が先ほどつくった空のノードの下になるよドラッグ。

f:id:x67x6fx74x6f:20170706193701p:plain

 

空のノードを回転させるアニメーションをつける

空のノードを選択。
セカンダリエディタを開き、オブジェクトライブラリから RotateTo Action をタイムラインにドラック&ドロップ。

Start Time を 0、Duration を 2、Y軸を -360 にして時計回りにする。

f:id:x67x6fx74x6f:20170706193741p:plain

 

スポットライトの影を落とす

必要がなければこれは設定しなければよい。

スポットライトを選択し、Attributes Inspector を開く(Command + Option + 4)

Shadow の項目の Casts shadows にチェックを入れると球に影が床に落ちる

f:id:x67x6fx74x6f:20170706193828p:plain

 

準備完了。

 

Look At コンストレイント

スポットライトの向きを Look At コンストレイントを使ってボールにあわせてみる。

スポットライトを選択して、 Node Inspector を開き(Command + Option + 3)を開き一番下の Constraints から「Look At」を選択。

f:id:x67x6fx74x6f:20170706193855p:plain

 

Constraints Settings 内容が表示されるようになるので、Target Node を作成した Sphere に合わせてみる。

f:id:x67x6fx74x6f:20170706193940p:plain

 

再生すると以下のようになる。

f:id:x67x6fx74x6f:20170706194021g:plain

 

Billboard コンストレイント

適当な場所にオブジェクトライブラリから Plane を Scene Editor にドラッグ&ドロップして配置。

f:id:x67x6fx74x6f:20170706194308p:plain

 

今回設定するテクスチャの問題で Plane の高さを Attributes Inspector で変更。

f:id:x67x6fx74x6f:20170706194327p:plain

 

Material Inspector を開き(Command + Option + 4)を Diffuse に適当な画像を適応。

f:id:x67x6fx74x6f:20170706194431p:plain

  f:id:x67x6fx74x6f:20170706194505p:plain

 

そのままだとスポットライトの関係上、影で映らないので、Illumination を白色にする。

f:id:x67x6fx74x6f:20170706194543p:plain

 

Node Inspector から Billboard コンストレイント適応。

f:id:x67x6fx74x6f:20170706194612p:plain

 

カメラを移動、回転させても
画面上に Plane がある場合は、必ずカメラの方向に向く。

 

注意点

Look At もそうだが Billboard は親のノードの回転の影響を受ける場合があるので、できるだけルートノードで使うべし。

 

必ず前面に Billboard を表示したい

UI 的なものだとどんなにオブジェクトが前にあっても、最前面に表示したい場合がある。

f:id:x67x6fx74x6f:20170706194731p:plain

 

そんな時は Material Inspector の Settings > Options > Reads Depth を外す。 チェックを外すとこのマテリアルは SceneKit の奥行き情報を無視する。

f:id:x67x6fx74x6f:20170706194748p:plain

 

iOS11 SDK で増えるもの

  • Distance Constraint
  • Occluder Constraint
  • Acceleration Constraint
  • Slider Constraint
  • Replicator Constraint

 

今回はここまで