如何在SceneKit中组合物理场?

时间:2017-04-08 20:17:49

标签: swift scenekit graph-drawing

我在SceneKit中编写了一个三维force-directed graph,我将节点建模为具有固定电荷和质量的物理球体。

这些球体必须施加径向引力和电场才能达到所需的动力学:

  

通常,使用基于胡克定律的类似弹簧的吸引力   以图形的边缘相互吸引成对的端点,   同时排斥力就像电力那样   基于库仑定律的带电粒子用于分离所有粒子   成对的节点。

如果注意到SCNNode只提供了一个physicsField属性,就会出现问题。

目前,如果没有两个独立的物理节点占用相同的空间(哎呀而且不可能?),我认为没办法做到这一点。我尝试插入带有静态/动态物理体的子体以适应多个场,但这种方法似乎根本不起作用(即没有任何反应)。

在一个有点相关的说明 - SceneKit的物理引擎对我来说感觉相当不完整,因为3D力导向图绘制属于这种框架的典型用法。

例如,SceneKit没有SKPhysicsJointSpring的3D版本,这使得实现节点到节点边缘吸引物理非常繁琐。虽然 功能SCNPhysicsBehavior,但几乎没有关于子类化以创建自定义行为的文档。

更糟糕的是,公共界面没有提供覆盖的方法,使得逆向工程对App Store的使用风险和不安全:

open class SCNPhysicsBehavior : NSObject, NSSecureCoding {
}

1 个答案:

答案 0 :(得分:0)

免责声明:我没有写过任何SceneKit代码,而这只是基于阅读文档,所以请大家用这个答案来解答。

SCNPhysicsField确定受影响节点的位置如何随时间变化。一次处理一个字段是直截了当的,但是当不同类型的字段相互作用时则不是这样。我怀疑计算同时影响节点的多个字段的影响是不正确和快速的,这就是为什么你不能在一个节点上同时拥有physicsField的组合。

但是,您可以在SceneKit中使用SCNPhysicsField.customField()创建自定义字段,并且该字段仅适用于字段节点的子节点。然后,在SCNFieldForceEvaluator的实现中,您可以自己执行处理Hooke定律和Couloumb定律的计算,以定位所有子节点。

一种更简单但不太准确的方法(我不确定它是否可行)将纯粹使用电场,子节点的极性与其父节点的极性相反。