我在SceneKit中编写了一个三维force-directed graph,我将节点建模为具有固定电荷和质量的物理球体。
这些球体必须施加径向引力和电场才能达到所需的动力学:
通常,使用基于胡克定律的类似弹簧的吸引力 以图形的边缘相互吸引成对的端点, 同时排斥力就像电力那样 基于库仑定律的带电粒子用于分离所有粒子 成对的节点。
如果注意到SCNNode
只提供了一个physicsField
属性,就会出现问题。
目前,如果没有两个独立的物理节点占用相同的空间(哎呀而且不可能?),我认为没办法做到这一点。我尝试插入带有静态/动态物理体的子体以适应多个场,但这种方法似乎根本不起作用(即没有任何反应)。
在一个有点相关的说明 - SceneKit的物理引擎对我来说感觉相当不完整,因为3D力导向图绘制属于这种框架的典型用法。
例如,SceneKit没有SKPhysicsJointSpring
的3D版本,这使得实现节点到节点边缘吸引物理非常繁琐。虽然 功能SCNPhysicsBehavior
,但几乎没有关于子类化以创建自定义行为的文档。
更糟糕的是,公共界面没有提供覆盖的方法,使得逆向工程对App Store的使用风险和不安全:
open class SCNPhysicsBehavior : NSObject, NSSecureCoding {
}
答案 0 :(得分:0)
免责声明:我没有写过任何SceneKit代码,而这只是基于阅读文档,所以请大家用这个答案来解答。
SCNPhysicsField
确定受影响节点的位置如何随时间变化。一次处理一个字段是直截了当的,但是当不同类型的字段相互作用时则不是这样。我怀疑计算同时影响节点的多个字段的影响是不正确和快速的,这就是为什么你不能在一个节点上同时拥有physicsField
的组合。
但是,您可以在SceneKit中使用SCNPhysicsField.customField()
创建自定义字段,并且该字段仅适用于字段节点的子节点。然后,在SCNFieldForceEvaluator
的实现中,您可以自己执行处理Hooke定律和Couloumb定律的计算,以定位所有子节点。
一种更简单但不太准确的方法(我不确定它是否可行)将纯粹使用电场,子节点的极性与其父节点的极性相反。