【发布时间】: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