Apple Engine

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

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 を選択するとこのような表示。

f:id:x67x6fx74x6f:20170630150753p:plain

 

また今回背景画像を照明に使うため、球のマテリアルの Lighting model を 現実世界に近い物理ベースのレンダリングのマテリアルである Physically Based に変更しておく。

f:id:x67x6fx74x6f:20170630143014p:plain

 

ちなみに、SceneKit の場合 Metal でないと使用できないため Physically Based 使用する場合は 実機か macOS でビルドする。

 

Scene Inspector

設定できる項目は以下ものものになっている

  • Scene
  • Light Probe
  • Fog
  • Physics Settings
  • Timing

 

Scene

Scene の項目は Background と Light Environment となっている

Background

色、または背景画像を設定し背景を変更する。 今回は背景を黒にしてみた。

f:id:x67x6fx74x6f:20170630143302p:plain

 

Scene Editor 上から背景画像をこの項目にドラッグ&ドロップで設定可能。 (以下で使用しているキューブマップも可)

 

Light Environment

背景画像をライトにするための項目。
物理ベースのレンダリングをする場合は空や周りの物体の反射を考慮する必要があるため、
遠景の部分はこの設定のように背景画像に光の情報を持ったファイルを使う。
32Bit の光の情報を持った画像ファイルでなくでも通常の画像でも色から光の反射をシミュレートするので png とかの画像でも使用できる。

 

注意:
Scene Editor の場合は四角のオブジェクトに画像を貼り付けるため、キューブマップ用に以下のような画像を作る必要がある。
この画像の場合、正方形の6面で左から3番目と4番目が立方体の上下になり他の画像は周囲の画像となる

f:id:x67x6fx74x6f:20170630143654p:plain

 

上の画像ファイルは
WWDC 2017 SceneKit: What’s New のサンプルコードの Background_sky.png を表示している

https://developer.apple.com/sample-code/wwdc/2017/Fox2.zip

  

使用する画像を Light Environment のポップアップリストへドラッグ&ドロップする。
球の部分、背景の青がライトとして適応されているのがわかると思う。

f:id:x67x6fx74x6f:20170630144421p:plain

 

ちなみにポップアップリストは色が列挙されているが SCNMaterialProperty の contents が UIColor を持っているだけで画像以外は設定できない模様。

 

背景全体がライトになっているので、試しにライトのノード全て消しても 球は描画される

f:id:x67x6fx74x6f:20170630144521p:plain

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 の色が適応され効果はない

 

背景が黒いので 以下の設定で適応してみた。 後ろの方が暗くなり見えなくなっている。

f:id:x67x6fx74x6f:20170630144634p:plain

 

原理は簡単で指定した距離の値以降はマテリアルに設定した色を加算している。
試しに背景を白にしてみるとこんな感じ。

f:id:x67x6fx74x6f:20170630151325p:plain

 

End distance を Start distance より近くしたり、同じにすると End distance で設定した色がすぐ適応されてしまうので注意。

f:id:x67x6fx74x6f:20170630144808p:plain

 

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

 

パーティクルとファイル書き出しはいつか説明する。

 

今回はここまで。