在场景套件中,SCNPhysicsField.noiseField似乎在几秒钟后就终止了



SCNNode,添加物理体,

physicsBody = SCNPhysicsBody(type: .dynamic, shape: ..)
physicsBody?.isAffectedByGravity = false

现在添加一个物理字段,例如

physicsField = SCNPhysicsField.noiseField(smoothness: 0.2, animationSpeed: 0.01)
physicsField?.strength = 0.05

效果很好。在这种情况下,.noise,对象将左右摆动。

然而,几秒钟后(通常是7秒,有时是不同长度的时间),物体会停止移动。

(三个值,平滑,速度和强度,如果你改变它们,它仍然会在几秒钟后结束。)

这个谜的答案是什么?

只是为了清楚,我从未使用过SCNPhysicsField.noiseField,但我使用了一种类型SCNPhysicsField.linearGravity和另一种类型SCNPhysicsField.customField,它们都能正常工作,并且不会像您描述的那样停止意外。

下面是我的例子:

let attractionField = SCNPhysicsField.linearGravity()
attractionField.halfExtent = SCNVector3(250.0, 35.0, 60.0)
attractionField.direction = SCNVector3(-1.0, 0.0, 0.0)
attractionField.strength = 0.2 // 0.15

attractionNode.physicsField = attractionField

和另一个,(我用来制造龙卷风):

private func addCustomVortexField() {

// Tornado Particles Field
let worldOrigin = stormNode.presentation.worldPosition
let worldAxis = simd_float3(0.0, 1.0, 0.0)

let customVortexField = SCNPhysicsField.customField(evaluationBlock: { position, velocity, mass, charge, time in

let l = simd_float3(worldOrigin.x - position.x, 1.0, worldOrigin.z - position.z)
let t = simd_cross(worldAxis, l)
let d2: Float = l.x * l.x + l.z * l.z
let vs: Float = 27 / sqrt(d2) // diameter, the bigger the value the wider it becomes
let fy: Float = 1.0 - Float((min(1.0, (position.y / 240.0)))) // rotations, a higher value means more turn arounds (more screwed)
return SCNVector3Make(t.x * vs + l.x * 10 * fy, 0, t.z * vs + l.z * 10 * fy)

})

customVortexField.halfExtent = SCNVector3Make(100, 100, 100)
stormNode.physicsField = customVortexField
stormNode.physicsField?.categoryBitMask = BitMasks.BitmaskTornadoField

}

我希望这能在某种程度上帮助你。你也可以把你的项目提供给我,我看一下。

最新更新