我在SceneKit中写了一个三维的force-directed graph,我将节点建模为具有固定电荷和质量的物理球体。
这些球体必须施加径向重力场和电场,以实现所需的动力学:
通常,使用基于胡克定律的弹簧状吸引力
为了使图的边的端点对彼此吸引,
同时产生的排斥力
基于库仑定律的带电粒子被用来分离所有的
成对的节点。
当一个人发现SCNNode只提供一个physicsField属性时,问题就出现了。
目前,如果没有两个单独的物理节点占据相同的空间(恶心而且不可能?)。我尝试插入带有静态/动态物理实体的子实体,以便容纳多个字段,但是这种方法似乎根本不起作用(即什么都没有发生)。
有一点相关的说明-SceneKit的物理引擎对我来说是相当不完整的,因为三维力导向图的绘制属于此类框架的典型使用。
例如,SceneKit没有3D版本的SKPhysicsJointSpring,这使得实现节点到节点的边缘吸引物理变得非常乏味。虽然它的特性是SCNPhysicsBehavior,但实际上并没有关于将其子类化以创建自定义行为的文档。
更糟糕的是,公共接口没有提供可重写的方法,这使得逆向工程对应用商店的使用具有风险和不安全性:

open class SCNPhysicsBehavior : NSObject, NSSecureCoding {
}

最佳答案

免责声明:我没有写任何SceneKit代码,这只是基于阅读文档,所以请接受这个答案与一个良好的大小粒盐。
SCNPhysicsField确定受影响节点的位置如何随时间变化。一次处理一个字段很简单,但当不同类型的字段交互时就不是这样了。我怀疑同时计算多个字段对一个节点的影响是不可能既正确又快速的,这就是为什么不能同时在一个节点上有physicsField的组合。
但是,您可以使用SCNPhysicsField.customField()在SceneKit中创建一个自定义字段,并使该字段仅应用于该字段节点的子节点。然后,在SCNFieldForceEvaluator的实现中,您可以执行处理胡克定律和库伦定律的计算来定位所有子节点。
一种更简单但不太准确的方法(我不确定它是否有效)是纯用电场来实现,子节点的极性与父节点的极性相反。

关于swift - 如何在SceneKit中结合物理场?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43299961/

10-11 08:10