Open5
scenekitで遊ぶ

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
}
}

func generateHuman() -> SCNNode {
guard let scene = SCNScene(named: "human.scn") else { fatalError("") }
return scene.rootNode.childNode(withName: "human", recursively: true)!
}
特定のscnファイルからそこに作成されたオブジェクトを取得する

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になるようにした.
実際には角度がついているので,正射影を使うことになりそう

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

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で定義すると,角度がついたときに応用が効く