我试图在SceneKit中制作一个管子及其物理体。
let BoxGeometry = SCNTube(innerRadius: 5, outerRadius: 12.5, height: 4)
Box = SCNNode(geometry: BoxGeometry)
Box.pivot = SCNMatrix4MakeRotation(Float(M_PI_2/8), 0, 1, 0)
Box.physicsBody = SCNPhysicsBody(type: SCNPhysicsBodyType.Static, shape: nil)
Box.physicsBody?.mass = 5
Box.categoryBitMask = colorCategory
scene.rootNode.addChildNode(Box)
然而,当另一个物体落在这个物体上时,它不会穿过中心。相反,它看起来似乎悬浮在空气中。它的作用就像物理体是一个完整的圆柱体,而不是像中间有孔的管子。我该如何解决这个问题,以便物体可以穿过中心?管外观看起来像预期的那样。
谢谢!
答案 0 :(得分:4)
SceneKit中的动态实体必须是凸的。 (如果你研究游戏中碰撞检测背后的一般理论,即不仅仅是SceneKit,你会发现在凸形与凹形之间的碰撞检测之间在速度和效率上存在巨大差异。)管是凹形的 - 它有一个洞。
幸运的是,你的管子被用作静止的身体。对于静态物体,可以选择使物理形状(近似)为凹几何体:
let shape = SCNPhysicsShape(geometry: tube,
options: [SCNPhysicsShapeTypeKey: SCNPhysicsShapeTypeConcavePolyhedron])
box.physicsBody = SCNPhysicsBody(type: .Static, shape: shape)
这会带来性能成本。如果您发现此帧速率受此更改后CPU使用率的限制,或者您希望动态物体(有效)凹陷,则可以通过使物理形状成为其他几种形状的复合物来获得更好的性能 - 例如构建一个虚拟节点层次结构(不是场景中实际存在的层次结构),包含一组排列成环的圆柱体或盒子,然后用SCNPhycsicsShape(node:options:)
从它们形成物理形状。
答案 1 :(得分:0)
更改physicsBody的形状以匹配管的几何形状。