物理对象在SceneKit中降至无穷大

时间:2017-12-02 09:28:50

标签: ios swift scenekit arkit

我正在制作一款使用Swift的ARKit进行折腾游戏的AR应用程序。

Click here for my repo

比赛的目的是抛球并使其降落在帽子上。然而,每当我试图抛球时,它似乎总是落到无限远而不是落在我创造的帽子或地板平面上。

这是抛球的代码:

    @IBAction func throwBall(_ sender: Any) {

    // Create ball
    let ball = SCNSphere(radius: 0.02)
    currentBallNode = SCNNode(geometry: ball)
    currentBallNode?.physicsBody = .dynamic()
    currentBallNode?.physicsBody?.allowsResting = true
    currentBallNode?.physicsBody?.isAffectedByGravity = true

    // Apply transformation
    let camera = sceneView.session.currentFrame?.camera
    let cameraTransform = camera?.transform
    currentBallNode?.simdTransform = cameraTransform!

    // Add current ball node to balls array
    balls.append(currentBallNode!)

    // Add ball node to root node
    sceneView.scene.rootNode.addChildNode(currentBallNode!)

    // Set force to be applied
    let force = simd_make_float4(0, 0, -3, 0)
    let rotatedForce = simd_mul(cameraTransform!, force)
    let vectorForce = SCNVector3(x:rotatedForce.x, y:rotatedForce.y, z:rotatedForce.z)

    // Apply force to ball
    currentBallNode?.physicsBody?.applyForce(vectorForce, asImpulse: true)
}

这里是地板的物理机构设置:

请查看下面的屏幕截图,了解更多信息。

enter image description here

1 个答案:

答案 0 :(得分:1)

没关系,我设法通过添加以下功能来解决这个问题:

    func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
    guard let planeAnchor = anchor as? ARPlaneAnchor, planeAnchor.center == self.planeAnchor?.center || self.planeAnchor == nil else { return }

    // Set the floor's geometry to be the detected plane
    let floor = sceneView.scene.rootNode.childNode(withName: "floor", recursively: true)
    let plane = SCNPlane(width: CGFloat(planeAnchor.extent.x), height: CGFloat(planeAnchor.extent.y))
    floor?.geometry = plane
}