Apple Engine

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

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

太陽光のように一定の方向に光を放つ Directional Light のご紹介。

設置位置に関わらず一定で光の影響を与える。 遮るジオメトリがあった場合に影を与えるキャストシャドウを設定することができる。

 

以下の画像は、ライトの位置を変更しても、光沢と影が変わらない例。

f:id:x67x6fx74x6f:20170802171700p:plain

 

ハンドラの薄い赤の矢印がライトの光の方向を表している。

f:id:x67x6fx74x6f:20170802171804p:plain

 

シーン設定

Omni Light で作成したシーンをそのまま使用する。

適当なシーンに Object Library から Directional Light をドラッグ&ドロップしても可。
Floor や Plane を下に敷いておくとわかりやすいと思われる。

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

 

Directional Light の設定

Scene Graph View から Omni Light を選択し、Attributes Inspector (Command + Option + 4) を開く。

f:id:x67x6fx74x6f:20170802170022p:plain

 

Type が Omni になっているので Directional に変更する

f:id:x67x6fx74x6f:20170802170035p:plain

  

Directional Light の Attrubutes Inspector

以前紹介した共通の設定にキャストシャドウと Scale の項目を追加したもの。

キャストシャドウは Spot Light で紹介しているのでこちらを参照。

 

Scale

キャストシャドウの大きさを設定する。 デフォルト値は 1。

そのままだと宇宙船の影が小さい四角になっているのがわかる。

f:id:x67x6fx74x6f:20170802170112p:plain

 

Directional Light は影の大きさを指定する必要があり、試しに 20 にしてみると影が現れる。

f:id:x67x6fx74x6f:20170802170134p:plain

 

現状はこのように手動で設定しているが、
iOS 11 では自動で Scale を決める設定と、距離に応じてシャドウマップの質を決めるカスケードが追加されている。

 

コード

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

light.castsShadow = true
light.orthographicScale = 20

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

 

今回はここまで