我目前正在构建一个在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请注意,第二个隧道是通过指定顶点由三角形组成的自定义几何八边形。
目前,这款游戏看起来就像隧道和船不断相撞,它创造了一个非常滞后,弹跳类型的游戏。我希望它只在节点接触时检测到碰撞,当碰撞发生时,船将弹离隧道,而不是穿过隧道。
我做错了什么?我该如何解决这个问题?
感谢所有花时间阅读这篇文章的人。
发布于 2020-10-21 06:12:45
非常感谢上面/下面的贡献者。在使用了他们的资源/建议并自己做了一些调查工作后,我已经能够解决我遇到的大多数问题。
对于任何可能读到这篇文章的SCNPhysics新手来说,这里是我学到的一些东西:
发布于 2020-10-19 00:39:53
我找不到任何关于SCNTube内部是否可以是不会报告冲突的区域的帖子。这将是一个需要回答的问题,所以首先我要确保你的shipNode足够远并且不是太大(比如打开物理调试模式),并在理想的情况下目测它没有接触。如果它仍然报告冲突,我会绝对确保位掩码设置正确,因为这不是一个更容易的概念(对我来说不是)。如果那不起作用,现在我又在吐口水...也许形成管子的一组凹壁也能起作用。除此之外,我认为这可以归结为你自己的管道和自己的数学计算。
https://stackoverflow.com/questions/64406635
复制相似问题