Open5

scenekitで遊ぶ

Amane OtsukaAmane Otsuka

macOS向けに新規作成して,SCNView貼り付けて

import Cocoa
import SceneKit

class ViewController: NSViewController {

    @IBOutlet weak var sceneView: SCNView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        setupSceneView()
        // Do any additional setup after loading the view.
    }
    
    override func viewDidAppear() {
        super.viewDidAppear()
    }
    

    override var representedObject: Any? {
        didSet {
        // Update the view, if already loaded.
        }
    }
    
    private func setupQueueScene() {
    }
    
    private func setupSceneView() {
        guard let queueScene = SCNScene(named: "queue.scn") else { fatalError("Unable to load scene file") }
        sceneView.scene = queueScene
    }


}
Amane OtsukaAmane Otsuka
func generateHuman() -> SCNNode {
    guard let scene = SCNScene(named: "human.scn") else { fatalError("") }
    return scene.rootNode.childNode(withName: "human", recursively: true)!
}

特定のscnファイルからそこに作成されたオブジェクトを取得する

Amane OtsukaAmane Otsuka
private func setupSceneView() {
        guard let queueScene = SCNScene(named: "assets.scnassets/queue.scn") else { fatalError("Unable to load scene file") }
        //let human = NodeGenerator.generateHuman()
        
        guard let humanScene = SCNScene(named: "assets.scnassets/cubeHuman.scn") else { fatalError("Unable to load scene file") }
        guard let human = humanScene.rootNode.childNode(withName: "human", recursively: true) else { fatalError("Unable to find node named human")}
        
        queueScene.rootNode.addChildNode(human)
        //aを求める
        let a = human.scale.y/2 + human.childNode(withName: "leftLeg", recursively: true)!.scale.y
        human.position = .init(0, a, 0)
        
        sceneView.scene = queueScene
        sceneView.allowsCameraControl = true
    }

直方体でできた人間モデルを配置
その際に体と足の距離を計算して,足の裏と地面の距離が0になるようにした.
実際には角度がついているので,正射影を使うことになりそう

Amane OtsukaAmane Otsuka

アセットカタログにsceneを追加してそこにscnファイルを追加しないと,複数のscnファイルを扱うことができずにエラーになるよう

Amane OtsukaAmane Otsuka
private func setupSceneView() {
        guard let queueScene = SCNScene(named: "assets.scnassets/queue.scn") else { fatalError("Unable to load scene file") }
        //let human = NodeGenerator.generateHuman()
        
        guard let humanScene = SCNScene(named: "assets.scnassets/cubeHuman.scn") else { fatalError("Unable to load scene file") }
        guard let human = humanScene.rootNode.childNode(withName: "human", recursively: true) else { fatalError("Unable to find node named human")}
        
        queueScene.rootNode.addChildNode(human)
        //aを求める
        let a = human.scale.y/2 + human.childNode(withName: "leftLeg", recursively: true)!.scale.y
        let b = human.position.y - human.childNode(withName: "leftLeg", recursively: true)!.position.y + human.childNode(withName: "leftLeg", recursively: true)!.scale.y/2
        human.position = .init(0, b, 0)
        
        sceneView.scene = queueScene
        sceneView.allowsCameraControl = true
    }

scaleではなくpositionで定義すると,角度がついたときに応用が効く