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 |
床
オブジェクトライブラリから Floor を Scene Editor にドラッグ&ドロップして配置。
初期値は位置と回転 0 だが、違っていたら 0 にする。
| X | Y | Z | |
|---|---|---|---|
| Position | 0 | 0 | 0 |
| Eular | 0 | 0 | 0 |
| Scale | 1 | 1 | 1 |
スポットライト
オブジェクトライブラリから Floor を Scene Editor にドラッグ&ドロップして配置し以下に設定を変更。
| X | Y | Z | |
|---|---|---|---|
| Position | 0 | 5 | 0 |
| Eular | -90 | 0 | 0 |
| Scale | 1 | 1 | 1 |

空のノードと球
オブジェクトライブラリから Empty Node を Scene Editor にドラッグ&ドロップ、
もしくは Scene Graph View の左下「+」のアイコンを押して、
空のノードを追加し原点に設定。
| X | Y | Z | |
|---|---|---|---|
| Position | 0 | 0 | 0 |
| Eular | 0 | 0 | 0 |
| Scale | 1 | 1 | 1 |
オブジェクトライブラリから 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 で球が先ほどつくった空のノードの下になるよドラッグ。

空のノードを回転させるアニメーションをつける
空のノードを選択。
セカンダリエディタを開き、オブジェクトライブラリから RotateTo Action をタイムラインにドラック&ドロップ。
Start Time を 0、Duration を 2、Y軸を -360 にして時計回りにする。

スポットライトの影を落とす
必要がなければこれは設定しなければよい。
スポットライトを選択し、Attributes Inspector を開く(Command + Option + 4)
Shadow の項目の Casts shadows にチェックを入れると球に影が床に落ちる

準備完了。
Look At コンストレイント
スポットライトの向きを Look At コンストレイントを使ってボールにあわせてみる。
スポットライトを選択して、 Node Inspector を開き(Command + Option + 3)を開き一番下の Constraints から「Look At」を選択。

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

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

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

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

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


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

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

カメラを移動、回転させても
画面上に Plane がある場合は、必ずカメラの方向に向く。
注意点
Look At もそうだが Billboard は親のノードの回転の影響を受ける場合があるので、できるだけルートノードで使うべし。
必ず前面に Billboard を表示したい
UI 的なものだとどんなにオブジェクトが前にあっても、最前面に表示したい場合がある。

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

iOS11 SDK で増えるもの
- Distance Constraint
- Occluder Constraint
- Acceleration Constraint
- Slider Constraint
- Replicator Constraint
今回はここまで