iOS で SceneKit を試す(Swift 3) その51 - Scene Editor の IES Light
IES Light はテキストデータのファイルを使用し照明のシミュレーションを行い陰や光を与える。
Directional Light とほぼ同じで、Scale のパラメーターがなく、IES ファイルの選択がある。
基本的にはライトからのシャドウマップで表現しているため、アーティファクトが出る(データのエラーやノイズの出現する)場合がある。
その場合は、Casts Shadow の チェックをオンにして Shadow のパラメーター群で調整する。
IES ファイル
テキスト情報で光がどのように与えるか記述されている。
試しに、以下のコードを入れて .ies の拡張子でプロジェクトに保存してみる。
TILT=NONE 1 13172.61 1 37 1 1 2 0 0 0 1 1 0 0.00 2.50 5.00 7.50 9.11 10.00 10.80 12.50 15.83 22.50 25.00 27.50 32.50 34.28 35.00 42.50 47.02 47.50 47.81 50.00 50.78 52.50 55.00 57.50 60.00 62.50 65.00 67.50 70.00 72.50 75.00 77.50 80.00 82.50 85.00 87.50 90.00 0.00 8379.00 8409.00 8528.00 8126.65 8500.00 8564.00 8301.00 8158.61 8411.98 8036.59 7865.61 7283.76 5209.38 6038.93 4533.49 3091.00 3665.38 2996.97 3625.45 2194.62 3170.85 1115.28 651.00 450.00 244.00 102.00 80.00 43.00 5.00 2.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
今回コードを書いているが、基本的には自分で作成することはないと思われるので、 照明メーカーなどで配布されているものを使用した方が良いと思われる。
シーン設定
Game (SceneKit) のテンプレートでプロジェクトを作成するか既存のファイルから ship.scn ファイルを選択。
(設定が面倒である場合は、下にサンプルファイルをダウンロード)
中身はいらないので Scene Graph View か、Scene Editor 上にあるものを全て削除。
Object Library (Command + Control + Option + 3) から Plane を2つ、Sphere、IES Light を以下のように設定する。
Plane
2つの座標
Attributes Inspector (Command + Control + Option + 4) で両方とも大きさを変更。
Material Inspector (Command + Control + Option + 4) で両面描画のチェックを外す。
Sphere
座標値変更
Attributes Inspector で大きさを変更。
IES Light
IES Light の Attrubutes Inspector
以前紹介した共通の設定に IES Profile の読み込みと、キャストシャドウを追加したもの。
キャストシャドウは Spot Light で紹介しているのでこちらを参照。
IES Parameters
IES Profile のファイルを選択する。 Scene Editor ではフォルダのマークを選択して、上の方でつくったものか、ダウンロードした IES ファイルを選ぶ。
照明が適応されたのがわかる。
試しに Casts shadows のチェックを入れると背面にアーティファクトができる。
Shadow のパラメーターを調整したもの
注意点
- コードではライトの種類を選択後 IES ファイルの読み込みが呼ばれると Omni、Spot など他のライトを選択していても IES に変更される
- モバイルの GPU で再現するため記述されている IES が意図通りに表示されない可能性がある
- Scene Editor で IES Profile に適合していないファイル(特にバイナリ)を読み込むと Xcode が落ちたり scn が壊れる可能性があるので慎重に
- Scene Editor で IES Lgiht を使用した場合は、必ず IES ファイルをプロジェクトの中にあるものから読み込む。プロジクト外でも Scene Editor では読み込めるが、ビルドした環境では IES ファイルが読み込めなくなるため
サンプル
今回は scn がそこそこ複雑なのでファイルを用意。
- IES.scn
- iesprofile.ies
コード
let light = SCNLight() light.name = "IES" light.type = .IES light.intensity = 1000 light.castsShadow = true let iesPath:String = Bundle.main.path(forResource: "iesprofile", ofType: "ies")! let fileURL:URL = URL(fileURLWithPath: iesPath) light.iesProfileURL = fileURL let lightNode = SCNNode() lightNode.light = light lightNode.position = SCNVector3(x: 0, y: 10, z: 10) scene.rootNode.addChildNode(lightNode)
今回はここまで