【问题标题】:Scenekit detecting collisions that don't exist - general advice on Scenekit collision detectionScenekit 检测不存在的碰撞 - 关于 Scenekit 碰撞检测的一般建议
【发布时间】:2021-02-01 00:10:46
【问题描述】:

我目前正在构建一个在 Scenekit 中实现碰撞检测的游戏,这是我以前没有处理过的。

游戏包含一艘飞过隧道的船,最终目标是当船撞到隧道时它会反弹。

我的船使用以下设置:

    func setupShipNodes() {
        shipNode = scene.rootNode.childNode(withName: "ship", recursively: true)!
        shipNode.name = "shipNode"
        let shipPhysicsShape = SCNPhysicsShape(node: shipNode)
        shipNode.physicsBody = SCNPhysicsBody(type: .dynamic, shape: shipPhysicsShape)
        shipNode.physicsBody?.contactTestBitMask = shipNode.physicsBody!.collisionBitMask
        
        shipMesh = scene.rootNode.childNode(withName: "shipMesh", recursively: true)
        shipMesh.name = "shipMesh"
    }

我的隧道是这样设置的:

    func setupTunnel() {
        tunnelShape = SCNTube(innerRadius: 5, outerRadius: 5, height: 100)
        tunnelNode = SCNNode(geometry: tunnelShape)
        tunnelNode.geometry?.firstMaterial?.diffuse.contents = UIColor.orange
        tunnelNode.position = SCNVector3(x: 0, y: 0, z: 0)
        tunnelNode.eulerAngles = SCNVector3(x: 1.5708, y: 0, z: 0)
        
        let physicsShape = SCNPhysicsShape(geometry: tunnelShape)
        tunnelNode.physicsBody = SCNPhysicsBody(type: .static, shape: physicsShape)
        tunnelNode.physicsBody?.contactTestBitMask = tunnelNode.physicsBody!.collisionBitMask
        tunnelNode.name = "tunnelNode"
        
        scene.rootNode.addChildNode(tunnelNode)
        let material = SCNMaterial()
        material.isDoubleSided = true
        material.diffuse.contents = UIColor.red
        addedTunnelNode.geometry?.firstMaterial = material
        addedTunnelNode.geometry?.firstMaterial? = material
        
        let physicsShape = SCNPhysicsShape(geometry: geometry)
        addedTunnelNode.physicsBody = SCNPhysicsBody(type: .static, shape: physicsShape)
        addedTunnelNode.physicsBody?.contactTestBitMask = addedTunnelNode.physicsBody!.collisionBitMask

请注意,第二条隧道是通过指定顶点由三角形组成的自定义几何八边形。

目前,游戏读起来好像隧道和船在不断地碰撞,这为游戏创造了一种非常滞后的反弹式方面。我想要它,这样只有在节点接触时才会检测到碰撞,当它们接触时,船将从隧道反弹而不是通过它。

我做错了什么,我该如何解决?

感谢所有花时间阅读本文的人。

【问题讨论】:

  • 你试过在物理设备上运行吗?我知道物理实体在模拟器中无法正常工作存在一些问题。但这些都是围绕着没有正确创建的物理物体。试一试也无妨。
  • 不幸的是,我有,它并没有太大的区别。
  • 这能回答你的问题吗? SceneKit – Concave collision box
  • 是的,这对 mnuages 很有帮助,谢谢。

标签: swift collision-detection scenekit collision


【解决方案1】:

非常感谢以上/以下的贡献者。在使用他们的资源/建议并自己做一些调查工作后,我已经能够解决我遇到的大部分问题。

对于可能看到这篇文章的 SCNPhysics 新手,我学到了以下几点:

  1. SCNTube 等空心节点创建实体物理体。我的代码中的 SCNTube 和自定义几何图形都在为我的飞船创建不可通过的物体。

  2. 'sceneView.debugOptions = SCNDebugOptions.showPhysicsShapes' 非常有用。

  3. 移动节点表示与移动节点的实际位置不同,物理体不会跟随节点表示移动。

【讨论】:

  • 这里有很好的信息,你会为别人节省一些额外的步骤!干得好……
【解决方案2】:

我找不到任何关于 SCNTube 内部是否可以成为不会报告碰撞区域的帖子。那将是要回答的问题,所以首先我要确保您的 shipNode 距离足够远且不太大(例如打开物理调试模式)并目视检查在理想情况下它没有接触。如果它仍然报告冲突,我会确保正确设置位掩码,因为这不是更简单的概念之一(对我来说不是)。如果这不起作用,现在我吐了……也许一组形成管子的凹面墙可以起作用。除此之外,我认为归根结底是你自己的管道和自己做数学。

【讨论】:

  • 这很有帮助,谢谢,我在解决问题后添加了自己的评论。不幸的是,由于我的声誉太低,我无法为您投票,但请知道您的帮助是值得赞赏的!
猜你喜欢
  • 1970-01-01
  • 2017-01-07
  • 2023-04-09
  • 2019-07-16
  • 2018-06-09
  • 2015-02-06
  • 2018-02-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多