SceneKitミニマムサンプル

はじめに

SceneKitについての記事が少なかったので、最小のコードでSCNGeometryを表示させるところまでまとめてみます。

SceneKitを学ぶに当たりNodeの関係性を理解しておく必要があります、以下は公式リファレンスから参照した画像です。

大元のSceneが存在し、Sceneの保持しているRootNodeにカメラや、ライトや、オブジェクトなどを追加していくことで画面を構成してきます。

https://developer.apple.com/documentation/scenekit/scnscene

ミニマムコード

Sceneを作成してSCNBoxを画面に配置する最小のコードです。

class GameViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        //大元のSceneの作成
        let scene = SCNScene()
        //boxオブジェクトの作成
        let box = SCNBox(width: 1, height: 1, length: 1, chamferRadius: 0.1)
        scene.rootNode.addChildNode(SCNNode(geometry: box))

        let scnView = self.view as! SCNView   
        // 自作のSceneを置き換える
        scnView.scene = scene
    }
}

ビルドしてみると以下の画像のように何も表示されません!

ここがSceneKitの難しいところで我々が実際に表示できていると確認するにはライトやカメラが必要になります。

ライトの配置

class GameViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        //大元のSceneの作成
        let scene = SCNScene()
        //boxオブジェクトの作成
        let box = SCNBox(width: 1, height: 1, length: 1, chamferRadius: 0.1)
        scene.rootNode.addChildNode(SCNNode(geometry: box))
        
        //ライトを作成
        let lightNode = SCNNode()
        lightNode.light = SCNLight()
        lightNode.light!.type = .omni
        lightNode.position = SCNVector3(x: 0, y: 10, z: 10)
        scene.rootNode.addChildNode(lightNode)

        let scnView = self.view as! SCNView
        // 自作のSceneを置き換える
        scnView.scene = scene
    }
}

ライトを追加したことで何かが表示されていることがわかると思います!

これは追加されたBoxが表示されているのですが、デフォルトのカメラがすごく近くにあるのでBOXが大きすぎてうまく見えていない状況です。

SCNViewにallowsCameraControlというプロパティがあるのでtrueにしてあげると画面タップでカメラが移動して確認しやすくなります。

// カメラをグリグリうごかせるようにする
scnView.allowsCameraControl = true

自作のカメラを追加する

class GameViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        //大元のSceneの作成
        let scene = SCNScene()
        //boxオブジェクトの作成
        let box = SCNBox(width: 1, height: 1, length: 1, chamferRadius: 0.1)
        scene.rootNode.addChildNode(SCNNode(geometry: box))
        
        //ライトを作成
        let lightNode = SCNNode()
        lightNode.light = SCNLight()
        lightNode.light!.type = .omni
        lightNode.position = SCNVector3(x: 0, y: 10, z: 10)
        scene.rootNode.addChildNode(lightNode)
        
        //カメラの作成
        let cameraNode = SCNNode()
        cameraNode.camera = SCNCamera()
        scene.rootNode.addChildNode(cameraNode)
        cameraNode.position = SCNVector3(x: 0, y: 0, z: 15)

        let scnView = self.view as! SCNView
        // 自作のSceneを置き換える
        scnView.scene = scene
        
        // カメラをグリグリうごかせるようにする
        scnView.allowsCameraControl = true
    }
}

これで綺麗にBOXオブジェクトを表示することができました!