SceneKit 中的径向重力节点先吸引然后排斥物体

问题描述 投票:0回答:2

我有一个简单的 sceneKit 场景,中间有一个 RadialGravity 节点:

let gravityNode = SCNNode()
let radialGravityField = SCNPhysicsField.radialGravity()
gravityNode.physicsField = radialGravityField
gravityNode.position = SCNVector3Make(0, 0, 0)
radialGravityField.strength = 0.5 // Same issue with 9.8
scene.rootNode.addChildNode(gravityNode)

然后我在场景中添加一些具有物理物体的盒子:

 let box = SCNBox(width: 0.5 , height: 0.5 , length: 0.5 , chamferRadius: CGFloat(0))
 let boxNode = SCNNode(geometry: box)
 boxNode.geometry!.firstMaterial?.diffuse.contents = UIColor.red
 boxNode.position=<based on clicked location on screen>
 boxNode.physicsBody = SCNPhysicsBody(type: .dynamic, shape: nil)
 boxNode.physicsBody?.mass=1
 scene.rootNode.addChildNode(boxNode)

然而,正如您所看到的,这些盒子被中心重力节点很好地吸引,但一旦它们到达它,就会立即被排斥,而我希望它们留在中心。

怎么会?

ios swift scenekit gravity
2个回答
0
投票

您需要在径向重力场的相同位置添加一个具有一定尺寸的静态物理体。您所看到的是完全预期的行为,因为那里没有具有物理实体的物体。(例如,您有一个半径为 0 的行星)。


0
投票

世界速度存在一个问题——完全没有必要——例如,如果速度下降,尝试将

self.physicsWorld.speed
设置为 0.25 甚至 0.20,许多重力相互作用异常就会消失。人们可以扩大相关物理的规模,它似乎仍然有效。

为什么我说没必要?负责重力场的库既没有使用多处理器,也没有使用GPU。 (这是基于 SpriteKit/GameplayKit 框架)。

无论如何,当使用移动重心时,重力场计算会被破坏:这可以通过两个接近但不同重力的非球形物体最容易注意到 - 在某些配置中(特别是在低恢复/摩擦和角度/线性的情况下)阻尼设置为 0.0)它们将沿着平行于其接触点的矢量加速 - 本质上表明底层物理计算中存在错误。这可能是因为场是在矢量场上运行的,并且非球形节点的质心计算存在错误。

© www.soinside.com 2019 - 2024. All rights reserved.