1

ARKit を使用して自分の部屋にボックスを作成し、AR シーンを終了してボックスを表示し、その周りを回転できるようにしたいと考えています。
試してみたところallowsCameraControl = true、オブジェクトをズームしたりドラッグしたりできるようになりましたが、今のところオブジェクトが自分の周りを向いている間、カメラをそれらの周りに向けたいと思います。オプションを説明している WWDC の 604 のビデオを見てきましたが、self.sceneView.defaultCameraController.interactionMode = .orbitTurntableそれを機能させることができません...
基本的に、すべての「ボックス」は水平面上にあり、天井にある topBox を持っています。

私が試したこと:

func getCenterBox() -> SCNNode? {
    guard let _ = self.sceneView.scene.rootNode.childNode(withName: "box", recursively: true) else {
        return nil
    }

    let edges = self.sceneView.scene.rootNode.childNodes.filter { $0.name == "box" }
    let edgesByX = edges.sorted { $0.position.x < $1.position.x }
    let minX = edgesByX.first?.position.x
    let maxX = edgesByX.last?.position.x

    let edgesByZ = edges.sorted { $0.position.z < $1.position.z }
    let minZ = edgesByZ.first?.position.z
    let maxZ = edgesByZ.last?.position.z

    let centerBox = SCNBox(width: 1, height: 1, length: 1, chamferRadius: 0.5)
    let centerNode = SCNNode(geometry: centerBox)
    let centerNodePosition = SCNVector3Make((maxX! - minX!)/2 + minX!, ((topBox?.position.y)! - (edges.first?.position.y)!)/2 + (edges.first?.position.y)!, (maxZ! - minZ!)/2 + minZ!)
    centerNode.position = centerNodePosition
    return SCNNode(geometry: SCNGeometry())
}

@IBAction func stopARTapped(_ sender: UIButton) {
    self.sceneView.allowsCameraControl = true
    self.sceneView.defaultCameraController.interactionMode = .orbitTurntable
    self.sceneView.defaultCameraController.inertiaEnabled = true
    self.sceneView.defaultCameraController.maximumHorizontalAngle = 0
    self.sceneView.defaultCameraController.maximumVerticalAngle = 0
    self.sceneView.defaultCameraController.minimumHorizontalAngle = 0
    self.sceneView.defaultCameraController.minimumVerticalAngle = 0

    guard let centerNode = getCenterBox() else {
        return
    }
    self.sceneView.scene.rootNode.addChildNode(centerNode)

    let lookAtConstraint = SCNLookAtConstraint(target: centerNode)

    if self.sceneView.pointOfView?.constraints == nil {
        self.sceneView.pointOfView?.constraints = [lookAtConstraint]
    } else {
        self.sceneView.pointOfView?.constraints?.append(lookAtConstraint)
    }
}
4

0 に答える 0