首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scenekit检测不存在的冲突--关于Scenekit碰撞检测的一般建议

Scenekit检测不存在的冲突--关于Scenekit碰撞检测的一般建议
EN

Stack Overflow用户
提问于 2020-10-18 03:43:47
回答 2查看 48关注 0票数 0

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

这个游戏由一艘船穿过隧道组成,最终目标是当船撞上隧道时,它会弹开。

我已经使用以下内容设置了我的船:

代码语言:javascript
复制
    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"
    }

我的隧道是这样设置的:

代码语言:javascript
复制
    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)
代码语言:javascript
复制
        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

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

目前,这款游戏看起来就像隧道和船不断相撞,它创造了一个非常滞后,弹跳类型的游戏。我希望它只在节点接触时检测到碰撞,当碰撞发生时,船将弹离隧道,而不是穿过隧道。

我做错了什么?我该如何解决这个问题?

感谢所有花时间阅读这篇文章的人。

EN

回答 2

Stack Overflow用户

发布于 2020-10-21 06:12:45

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

对于任何可能读到这篇文章的SCNPhysics新手来说,这里是我学到的一些东西:

  1. 空心节点(如SCNTubes )可创建实体物理体。我的代码中的SCNTube和自定义几何图形都为我的船创建了无法通过的物体。

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

  1. 移动节点演示文稿与移动节点的实际位置不同,物理主体不会跟随节点演示文稿的移动。
票数 1
EN

Stack Overflow用户

发布于 2020-10-19 00:39:53

我找不到任何关于SCNTube内部是否可以是不会报告冲突的区域的帖子。这将是一个需要回答的问题,所以首先我要确保你的shipNode足够远并且不是太大(比如打开物理调试模式),并在理想的情况下目测它没有接触。如果它仍然报告冲突,我会绝对确保位掩码设置正确,因为这不是一个更容易的概念(对我来说不是)。如果那不起作用,现在我又在吐口水...也许形成管子的一组凹壁也能起作用。除此之外,我认为这可以归结为你自己的管道和自己的数学计算。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64406635

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档