iOS で SceneKit を試す(Swift 3) その14 - Scene Editor の Scene Inspector と Scene 設定
今回は、以前に作成した Scene Editor のサンプルを元に球をたくさんを置いたもので試す。
Scene Editor のサンプル では ViewController.swift で SCNView の背景色を設定しているが必要ないので以下のものを消す。
scnView.backgroundColor = UIColor.black
main.scn ファイルを選択し、Scene Editor で何かを選択。
Utilities エリアの Inspector タブの1番右側 Scene Inspector を選択するとこのような表示。
また今回背景画像を照明に使うため、球のマテリアルの Lighting model を 現実世界に近い物理ベースのレンダリングのマテリアルである Physically Based に変更しておく。
ちなみに、SceneKit の場合 Metal でないと使用できないため Physically Based 使用する場合は 実機か macOS でビルドする。
Scene Inspector
設定できる項目は以下ものものになっている
- Scene
- Light Probe
- Fog
- Physics Settings
- Timing
Scene
Scene の項目は Background と Light Environment となっている
Background
色、または背景画像を設定し背景を変更する。 今回は背景を黒にしてみた。
Scene Editor 上から背景画像をこの項目にドラッグ&ドロップで設定可能。 (以下で使用しているキューブマップも可)
Light Environment
背景画像をライトにするための項目。
物理ベースのレンダリングをする場合は空や周りの物体の反射を考慮する必要があるため、
遠景の部分はこの設定のように背景画像に光の情報を持ったファイルを使う。
32Bit の光の情報を持った画像ファイルでなくでも通常の画像でも色から光の反射をシミュレートするので png とかの画像でも使用できる。
注意:
Scene Editor の場合は四角のオブジェクトに画像を貼り付けるため、キューブマップ用に以下のような画像を作る必要がある。
この画像の場合、正方形の6面で左から3番目と4番目が立方体の上下になり他の画像は周囲の画像となる
上の画像ファイルは
WWDC 2017 SceneKit: What’s New のサンプルコードの Background_sky.png を表示している
https://developer.apple.com/sample-code/wwdc/2017/Fox2.zip
使用する画像を Light Environment のポップアップリストへドラッグ&ドロップする。
球の部分、背景の青がライトとして適応されているのがわかると思う。
ちなみにポップアップリストは色が列挙されているが SCNMaterialProperty の contents が UIColor を持っているだけで画像以外は設定できない模様。
背景全体がライトになっているので、試しにライトのノード全て消しても 球は描画される
Light Environment を設定すると Intensity の項目が表示され、この値を増やすと光が強くなる。
Background / Light Environment のコード
Background
let scene = SCNScene() // 背景色の場合 scene.background.contents = UIColor.red // 背景画像の場合 scene.background.contents = UIImage(named: "Background_sky.png")
Light Environment
let scene = SCNScene() scene.lightingEnvironment.contents = UIImage(named: "Background_sky.png") scene.lightingEnvironment.intensity = 1.0
Light Probe
シーン内にある全ての Light Probe を計算し直すボタンがある。
この機能は Light Probe を紹介する時に説明する。
Fog
シーン全体に適応される効果で霧がかかった効果を出す。
以下、設定項目
設定名 | 機能 |
---|---|
Color | 霧の色 |
Start distance | 霧の効果を適応し始める距離。ここから効果が終点まで徐々に適応される。 |
End distance | 霧の効果の終点距離。これ以降は Color で設定した色でオブジェクトが塗りつぶされる。 |
Exponent | 霧の効果の強さ。値を上げると明るくなるが End distance 以降は Color の色が適応され効果はない |
背景が黒いので 以下の設定で適応してみた。 後ろの方が暗くなり見えなくなっている。
原理は簡単で指定した距離の値以降はマテリアルに設定した色を加算している。
試しに背景を白にしてみるとこんな感じ。
End distance を Start distance より近くしたり、同じにすると End distance で設定した色がすぐ適応されてしまうので注意。
Fog のコード
let scene = SCNScene() scene.fogColor = UIColor.black scene.fogStartDistance = 0 scene.fogEndDistance = 30 scene.fogDensityExponent = 1
Physics Settings (SCNPhysicsWorld)
物理アニメーションの全体設定で、シーン全体の重力を決める。 初期値は Y に -1 の力が働き、Speed の値は動作速度。
Y を 1 にすると物理アニメーションは上に加速し、Speed を下げれば速度が遅くなる。
SCNPhysicsWorld のコード
let scene = SCNScene() scene.physicsWorld.gravity = SCNVector3(0, -1, 0) scene.physicsWorld.speed = 1.0
今回は Inspector での値を設定しているが、SCNPhysicsWorld には他にも値がある。
SCNPhysicsWorld - SceneKit | Apple Developer Documentation
Timing
Start Time と End Time があるが何の設定値か不明。
というか、SCNScene.Attribute の構造体にある設定は何を設定しても適応されている気配がない。
知っている方がいらしたら教えて欲しい。
その他の SCNScene の設定項目
上記のものと rootNode を除くと以下のもの
- イニシャライザ
- シーンを一時停止
- シーンへのパーティクル設定
- シーンをファイルに書き出す命令とその delegate
イニシャライザ
main bundle やそのサブディレクトリから読み込むもので 2 つ、URL、Model I/O から読み込むものと、
空のシーンの作成と合計で5種類のイニシャライザがある。
シーンの操作の一時停止
以下のコードでシーンを一時停止できる。
ゲームなどで一時停止する機会は結構あるかも。
let scene = SCNScene() scene.isPaused = true
パーティクルとファイル書き出しはいつか説明する。
今回はここまで。