Apple Engine

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

iOS で SceneKit を試す(Swift 3) その47 - Scene Editor の Omni Light と Attenuation

豆電球のような Omni Light の設定を見ていく。

Omni Light は設置位置によって光の影響を変化させるが、ジオメトリの影を落とすことはできない。

影は必要ないが光の影響を与えたい場合などで使用するのが良いかと思われる。

 

シーン設定

ひとまず、iOS SceneKit のテンプレートでプロジェクト作成。

ship.scn を開き Object Library (Command + Option + Control + 3) から Floor をシーンにドラッグ。

f:id:x67x6fx74x6f:20170801183844p:plain

 

Node Inspector (Command + Option + 3) を開いて y を -2 に設定。
Scene Graph View から shipMesh を選択し、マテリアルを Physically Based に変更。

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

f:id:x67x6fx74x6f:20170801183922p:plain

 

Omni Light の設定

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

f:id:x67x6fx74x6f:20170801183942p:plain

 

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

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

f:id:x67x6fx74x6f:20170801184001p:plain

 

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

 

Omni Light の Attrubutes Inspector

Attrubutes Inspector (Command + Option + 4) を開くと、 以下のようなパラメーターが現れ、
以前紹介した共通の設定以外では Attenuation がある。

f:id:x67x6fx74x6f:20170801184241p:plain

 

試しに Intensity を 500 にしてみたもの。

f:id:x67x6fx74x6f:20170801184331p:plain

 

Attenuation

直訳すると減衰となり、光がどう減退するかを設定する。

f:id:x67x6fx74x6f:20170801184208p:plain

 

Start

減衰の開始の距離。

デフォルト値は 0.0 でライトの設置場所から行われる。

   

End

減衰の終了距離。これ以降は光の影響を受けない。

デフォルト値が 0.0 で適応範囲は無限遠となりかなりなだらかな減衰となる。

 

30 に設定するとこの形

f:id:x67x6fx74x6f:20170801184426p:plain

 

Falloff

減衰の状態を表す。
デフォルト値が 2.0

値: 0 の場合は完全に減衰は行われない。

f:id:x67x6fx74x6f:20170801184448p:plain

 

値: 1 で開始から終了までを線形で光が減衰する。

f:id:x67x6fx74x6f:20170801184503p:plain

 

値: 2 デフォルト設定。2乗の曲線を描き光が減衰する。2以降はパラメーターの数の乗数で光が減衰する。

f:id:x67x6fx74x6f:20170801184516p:plain

 

値: 4 値を大きくしいくと全体の変化が少なくなる。

f:id:x67x6fx74x6f:20170801184541p:plain

 

また、減衰はシーンエディタで有効範囲が表示される。

f:id:x67x6fx74x6f:20170801184607p:plain

 

コード

let light = SCNLight()
light.name = "omni"
light.type = .omni
light.intensity = 1000
light.attenuationStartDistance = 0.0
light.attenuationEndDistance = 30.0
light.attenuationFalloffExponent = 2.0

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

 

今回はここまで。