ARKitで光を当てるときはひとつよりも複数が良い


今日新しい発見をしたので忘れない様にメモしておく。

困ってたこと

ARKitで配置した3Dオブジェクトにomniタイプ(電球の光)のSCNLightを設定して、光を当てたときに影が強すぎると感じていた。
具体的にはこんな感じ。

しかし、影が強すぎるからといって光を当てないと、のっぺりした様に見えリアルさが欠けてしまう。
具体的にはこんな感じ。

そんなときはライトを組み合わせよう!

ARKit(SceneKit)では複数SCNLightを配置できるらしく、ambientタイプ(全ての面を一定に照らす光)とomniタイプのSCNLightを配置するといい感じになった。
具体的にはこんな感じ。

omniタイプのSCNLightは位置によって影のつき方が変わるためpositionをちゃんと設定しないといけないが、ambientタイプのSCNLightはどこに配置しても光の当たり方は変わらないので自分はrootNodeのプロパティに設定してしまっている。

    override func viewDidLoad() {
        super.viewDidLoad()

        // Set the view's delegate
        sceneView.delegate = self

        // Show statistics such as fps and timing information
        sceneView.showsStatistics = true

        // Create a new scene
        let scene = SCNScene()

        // Set the scene to the view
        sceneView.scene = scene

        // Setup Omni Light
        let omniLight = SCNLight()
        omniLight.type = .omni
        omniLight.intensity = 0
        omniLight.temperature = 0
        omniLight.castsShadow = true

        let omniLightNode = SCNNode()
        omniLightNode.light = omniLight
        omniLightNode.position = SCNVector3(0,10,1)
        sceneView.scene.rootNode.addChildNode(omniLightNode)

        // Setup Ambient Light
        let ambientLight = SCNLight()
        ambientLight.type = .ambient
        ambientLight.intensity = 0
        ambientLight.temperature = 0
        sceneView.scene.rootNode.light = ambientLight
    }

SceneKitを使ってARアプリ開発をしたい方向けに情報をまとめていますので、こちらもご参照ください。