【问题标题】:SCNPhysicsShape(shapes:transforms:) creates MULTIPLE shapes?SCNPhysicsShape(shapes:transforms:) 创建多个形状?
【发布时间】:2022-10-08 20:27:08
【问题描述】:

我的目标是创建一个单身的几个 SceneKit 的 SCNBox 几何体中的物理体。

我的理解是,当我将SCNPhysicsShape(shapes:transforms:) 传递给SCNPhysicsBody(type:shape:) 时,它应该创建一个单独的物理体。

但是,我最终得到了一些看起来可疑的东西不是一个单身的物理体,而是几个分离物理实体——我传入SCNPhysicsShape(shapes:transforms:) 的每个形状都有一个。

当我打开scnView.debugOptions = .showPhysicsShapes 时,我可以清楚地看到定义有问题的单独主体的红线。就其本身而言,这并不是非常令人信服的证据(可以想象,这些线条可以出于任何原因显示,同时仍然是一个单一的物理体)。

但是这里还有另一条数据:我遇到这个问题的项目有一个在场景中滚动的小球——当那个球滚过有问题的红线时,球会反弹到空中少量。所以,很明显,无论实际发生什么,有一些我希望看不到的边缘.

此行为在以下 GIF 中清晰可见。在其中,每个彩色块都是一个单独的 SCNBox 几何体,具有自己的物理体。每个块都有完全相同的position.z。当球穿过一个几何形状与另一个几何形状相交的点时,球会大幅反弹。

这是一些说明问题的代码。 parent 是一个 SCNNode,它包含子节点,并且是我分配物理体的节点。请假设所有属性都已定义;我省略了一些不太相关的东西。

let childShape1 = SCNBox(width: 6, height: 2, length: 6, chamferRadius: 0.0)
//Other child shapes defined here...

//Set up the positional translation relative to the child node's parent:
let translateMatrixShape1 = SCNMatrix4MakeTranslation(childShape1.position.x, childShape1.position.y, childShape1.position.z)
//Other child translations defined here...

let parentShape = SCNPhysicsShape(shapes: [childShape1, childShape2, childShape3, childShape4], transforms: [translateMatrixShape1, translateMatrixShape2, translateMatrixShape3, translateMatrixShape4])

parent.physicsBody = SCNPhysicsBody(type: SCNPhysicsBodyType.static, shape: parentShape)

现在,parentShape 是四个围绕中心点排列的矩形框,创建了一种相框形状的对象。

球是SCNNode,具有SCNSphere 几何结构和动态物理体。

问题:有谁知道这里可能发生了什么?我是否以某种方式误解了整个事情的工作原理,或者这是 SceneKit 的限制?

【问题讨论】:

  • 我不知道flatennedClone。根据它的文档,这看起来真的很有希望。我试试看,谢谢!

标签: ios swift scenekit


【解决方案1】:

通常,您可以通过从(i.Ex.)父节点创建 flattenendClone 来从多个几何对象创建一个 PhysicsBody。这个新节点将有一个单一的几何图形。对于 PhysicsBody,您可以使用新节点的几何元素。此外,我建议使用凹多面体作为静态主体类型。 (希望我理解正确)

【讨论】:

  • 你明白我的意思,谢谢。这个策略应该绝对有效——但它没有。至少,从(假定的)单个物理体创建的意义上说,它没有“工作”仍然具有相同的锋利边缘,应该有一个光滑的表面,使球反弹而不是滚动。我正在使用concavePolyhedron。我正在尝试的其他事情包括调整几何的subdivisionLeveledgeCreasesSource,但我不知道我是否在正确的轨道上。在我看来,这是一种奇怪的行为。
  • 可以和我分享你的项目吗,这样我可以看看吗?
  • 我会看看我是否可以在一个新项目中重新创建这种行为,我会与你分享,这样你就可以看到问题所在。感谢您的帮助,当我准备好分享项目时,我会通知您。:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-01
  • 2015-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-24
相关资源
最近更新 更多