SceneKit: シーンに光源を追加して陰影を描写する

p0dee
Jun 18, 2021

--

シーンにオブジェクトを追加するだけではいまいち存在感がない。それは陰影がないからだ。いい感じに陰影を描画するにはどうしたらいいのか、、

SceneViewautoenablesDefaultLightingtrueにしておけば、シーン内に光源がない場合に “omnidirectional light source” を追加してくれるので、立体物を認識できる必要最低限の陰影は描画される。

If you change the value to true, SceneKit automatically adds and places an omnidirectional light source when rendering scenes that contain no lights or only contain ambient lights.
autoenablesDefaultLighting

この “omnidirectional light source” が何かと思ったら、いわゆる点光源のことらしい。

An omnidirectional light, also known as a point light.
SCNLight.LightType

しかしこの場合、物体上に「陰」は描画されても、その物体の「影」は描画されず不自然。

SCNLightで光源を作って、light.castsShadow = trueとすれば、それだけで影が落とされる。

光源はSCNNode.lightに設定するので、光源自身に形状(geometry)を指定することも可能。ただしそれが点光源のばあい、他の光源に照らされない限り物体表面は漆黒のまま。

light.colorで光源色を設定することも可能。ただしシーンの世界には、光源色のみの色成分しか存在せず、実世界の直感に反するのが慣れない。

たとえば、material色を青に指定した物体を、光源色赤で照らしても、その物体は黒としか描画されない。それは、その物体表面は青色光しか反射できないために「青」として視認されるわけであって、赤色光は吸収してしまうからだ。

白色球体上に赤色光源と緑色光源を配置してみたら、赤光源の影は緑に、緑光源の影は赤に、双方の影が重なり合う部分は黒、それ以外は黄色に描画されて、なるほどと思った。(黄色は赤と緑の加法混色。)

--

--