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 に変更しておくが今回の場合は必要はない。
光の影響を受けないためジオメトリが黒くなる。
一旦、Omni Light を設定してみる
Object Library (Command + Option + Control + 3) から Omni Light をシーンにドラッグ。
Omni Light は距離影響を受けるので Node Inspector (Command + Option + 3) を開いて y の 10 に設定。
宇宙船にライトが当たると思われる、
Ambient Light の設定
Object Library から Ambient Light をシーンにドラッグ。
適切な位置へ移動しなくても場所に関場所に光が適応されており、 Omni Light で陰が出ていた宇宙船の下の部分が真っ黒ではなくなっていると思う。
Scene Editor 上で動作を見ていくが、実機で動かす場合は GameViewController.swift にあるライトの記述をすべて消す。
Ambient Light の Attrubutes Inspector
以前紹介した共通の設定のもの以外設定はない。
デフォルトではカラーが灰色、intensity が 1000 になっている。
intensity が高めに設定されている為、カラーの値を白に変更すると陰の黒い部分がほとんど飛んでしまうので注意が必要。
調整すると全体の光を変更することができる。
Omni Light を消してみる
Ambient Light はジオメトリへ陰をつけない為、Omni Light をシーン上から削除するとジオメトリは単色の色が重ねられただけでフラットな見た目になる。
以下の画像のように、宇宙船のテクスチャを取り除くとわかりやすい。
使い所
全体の色の変更し、シーン印象を変えることが主な使用用途だと思われる。
また、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)
今回はここまで