【问题标题】:Tube Physics Body acting like SCNCylinder, but how to make it act like SCNTube?Tube Physics Body 表现得像 SCNCylinder,但如何让它表现得像 SCNTube?
【发布时间】:2015-02-08 02:26:39
【问题描述】:

我正在尝试在 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)

但是,当另一个物体落到这个物体上时,它不会穿过中心。相反,它似乎悬浮在空气中。它的作用就像物理体是一个完整的圆柱体,而不是中间有孔的管子。我该如何解决这个问题,以便物体可以通过中心?管子外观符合预期。

谢谢!

【问题讨论】:

  • 风格要点:Swift 更喜欢但不强制将 InitialCapCamelCase 名称用于类型(类、结构、枚举、协议)。为了与各种工具更好的互操作性以及与他人共享代码时更好的可读性,请使用 lowerCamelCase 作为变量/常量名称:let boxGeometrybox = SCNNode 等。

标签: swift scenekit scnnode


【解决方案1】:

SceneKit 中的动态物体必须是凸的。 (如果您研究游戏中碰撞检测背后的一般理论,即不仅仅是 SceneKit,您会发现凸形和凹形碰撞检测在速度和效率方面存在巨大差异。)管是凹形 - 它里面有个洞。

幸运的是,您的试管被用作静态体。仅对于静态物体,可以选择使物理形状(近似)为凹几何:

let shape = SCNPhysicsShape(geometry: tube, 
    options: [SCNPhysicsShapeTypeKey: SCNPhysicsShapeTypeConcavePolyhedron])
box.physicsBody = SCNPhysicsBody(type: .Static, shape: shape)

这是有性能成本的。如果您发现在此更改后您的帧速率受到 CPU 使用率的限制,或者如果您希望动态体(有效地)凹入,则可以通过制作一个由其他几种形状组合而成的物理形状来获得更好的性能 - 例如构建一个虚拟节点层次结构(不是实际在您的场景中的),其中包含一组排列成环形的圆柱体或盒子,然后使用 SCNPhycsicsShape(node:options:) 将它们制成物理形状。

【讨论】:

  • 我很抱歉身体只是为了测试目的是静态的,目标是让它动态
  • 那么你需要使用凸形的复合来近似你的凹形,正如我的回答末尾所总结的那样。
  • 我的印象是这些选项只适用于静态?
  • SCNPhysicsShapeTypeConcavePolyhedron 仅适用于静态。对于动态,您可以使用SCNPhycsicsShape(node:options:) 从多个节点/形状构造一个复合形状——这些形状必须是凸的(最好是基本几何形状,如球体、盒子等),但它们一起可以形成凹形排列。
  • 如果球穿过物体,你能帮我如何检测碰撞吗?这是问题stackoverflow.com/questions/51135793/…
【解决方案2】:

更改physicsBody 的形状以匹配管的几何形状。

【讨论】:

    猜你喜欢
    • 2018-12-25
    • 2021-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-18
    • 2012-02-14
    • 2017-10-19
    • 2018-02-10
    相关资源
    最近更新 更多