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 をシーンにドラッグ。
Node Inspector (Command + Option + 3) を開いて y を -2 に設定。
Scene Graph View から shipMesh を選択し、マテリアルを Physically Based に変更。
光の影響を受けないためジオメトリが黒くなる。
Omni Light の設定
Object Library から Omni Light をシーンにドラッグ。
Omni Light は距離影響を受けるので Node Inspector (Command + Option + 3) を開いて y の 10 に設定。
宇宙船にライトが当たると思われる、
今回は Scene Editor 上で動作を見ていくが、実機で動かす場合は GameViewController.swift にあるライトの記述をすべて消す。
Omni Light の Attrubutes Inspector
Attrubutes Inspector (Command + Option + 4) を開くと、
以下のようなパラメーターが現れ、
以前紹介した共通の設定以外では Attenuation がある。
試しに Intensity を 500 にしてみたもの。
Attenuation
直訳すると減衰となり、光がどう減退するかを設定する。
Start
減衰の開始の距離。
デフォルト値は 0.0 でライトの設置場所から行われる。
End
減衰の終了距離。これ以降は光の影響を受けない。
デフォルト値が 0.0 で適応範囲は無限遠となりかなりなだらかな減衰となる。
30 に設定するとこの形
Falloff
減衰の状態を表す。
デフォルト値が 2.0
値: 0 の場合は完全に減衰は行われない。
値: 1 で開始から終了までを線形で光が減衰する。
値: 2 デフォルト設定。2乗の曲線を描き光が減衰する。2以降はパラメーターの数の乗数で光が減衰する。
値: 4 値を大きくしいくと全体の変化が少なくなる。
また、減衰はシーンエディタで有効範囲が表示される。
コード
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)
今回はここまで。