Apple Engine

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

iOS で SceneKit を試す(Swift 3) その48 - Scene Editor の Ambient Light

シーン全体に光を与える Ambient Light のご紹介。

設置位置に関係なく光の影響を与え、ジオメトリの暗部である陰の色を薄めたりできる。

 

シーン設定

iOS SceneKit のテンプレートでプロジェクト作成。

今回は床が必要ないので、ship.scn を表示するだけ。

Scene Graph View から shipMesh を選択し、マテリアルを Physically Based に変更。

一応、わかりやすくする為、
宇宙船のマテリアルの Lighting Type を Physically Based に変更しておくが今回の場合は必要はない。

 

光の影響を受けないためジオメトリが黒くなる。

f:id:x67x6fx74x6f:20170802105258p:plain

 

一旦、Omni Light を設定してみる

Object Library (Command + Option + Control + 3) から Omni Light をシーンにドラッグ。

f:id:x67x6fx74x6f:20170801183942p:plain

 

Omni Light は距離影響を受けるので Node Inspector (Command + Option + 3) を開いて y の 10 に設定。

宇宙船にライトが当たると思われる、

f:id:x67x6fx74x6f:20170802105404p:plain

 

Ambient Light の設定

Object Library から Ambient Light をシーンにドラッグ。

f:id:x67x6fx74x6f:20170802110209p:plain

 

適切な位置へ移動しなくても場所に関場所に光が適応されており、 Omni Light で陰が出ていた宇宙船の下の部分が真っ黒ではなくなっていると思う。

f:id:x67x6fx74x6f:20170802105432p:plain

 

Scene Editor 上で動作を見ていくが、実機で動かす場合は GameViewController.swift にあるライトの記述をすべて消す。

 

Ambient Light の Attrubutes Inspector

以前紹介した共通の設定のもの以外設定はない。

f:id:x67x6fx74x6f:20170802110159p:plain

 

デフォルトではカラーが灰色、intensity が 1000 になっている。

intensity が高めに設定されている為、カラーの値を白に変更すると陰の黒い部分がほとんど飛んでしまうので注意が必要。

f:id:x67x6fx74x6f:20170802105520p:plain

 

調整すると全体の光を変更することができる。

f:id:x67x6fx74x6f:20170802105646p:plain

 

Omni Light を消してみる

Ambient Light はジオメトリへ陰をつけない為、Omni Light をシーン上から削除するとジオメトリは単色の色が重ねられただけでフラットな見た目になる。

f:id:x67x6fx74x6f:20170802105803p:plain

 

以下の画像のように、宇宙船のテクスチャを取り除くとわかりやすい。

f:id:x67x6fx74x6f:20170802105905p:plain

  

使い所

全体の色の変更し、シーン印象を変えることが主な使用用途だと思われる。

また、Ambient Light はジオメトリへの陰の描画処理がされない為、演算処理が少ない。

ジオメトリにライトマップやオクルージョンのテクスチャを使用し、
影が落ちる必要のないシーンで使用することでライティングの処理が軽くなり全体の負荷を下げることができる。

 

コード

let light = SCNLight()
light.name = "ambient"
light.type = .ambient
light.intensity = 1000

let lightNode = SCNNode()
lightNode.light = light
lightNode.position = SCNVector3(x: 0, y: 10, z: 0)
scene.rootNode.addChildNode(lightNode)

 

今回はここまで