使用重力使 SCNNode 下降?

Make a SCNNode drop using gravity?

我有一个 SceneKit 设置,其中有一个 Sphere 设置为 Dynamic body。

我能够 运行 该应用程序并看到球体落在静态 body 地板上。

我想做的是设置场景,这样 sfere 最初就不会掉落。

然后当函数是 运行 我希望 sfere 下降。

使场景突然(可能在按下按钮或其他东西时)放下球体的正确逻辑/步骤是什么?

我也试过将球体设置为质量 0,然后将质量设置为 100,但它不会导致掉落...

仅当您希望它受重力影响时才将物理体设置为球体应该可行。

Mass doesn't control how fast something falls. 在现实世界中确实如此,但在走捷径而不是模拟现实世界物理的每个细节的模拟中更是如此。 (可悲的是,iOS 设备仍然没有 CPU 的能力来解释地球的旋转参考系,你的球体和任何靠近它的物体之间的范德瓦尔斯吸引力,强大的使其 三角形 原子保持在一起的力,等等)在 SceneKit 中,重力只是特定方向上的恒定加速度。

将质量设置为零并将其切换为其他东西会干扰 static/kinematic 和动态物体之间的区别...所以不要那样做。

,您可以 add/remove 球体中的物理体,当您希望它完全受物理影响或不受物理影响时。

但是,如果您出于其他原因想要保留球体的物理体,例如允许其他物体在您开始下落之前与其发生碰撞,该怎么办?您可以使用几种方法:

  • 将球体的damping设置为1.0。
  • 将球体的 velocityFactor 设置为零(至少在重力方向)。

当其他物体撞击它时,这两者都会阻止球体移动。如果你想让球被撞到周围,但不受重力影响,最好的办法可能是为物理场切换场景重力:

  1. scene.physicsWorld.gravity 设置为 SCNVector3Zero
  2. 将使用 linearGravityField 构造函数创建的 SCNPhysicsField 添加到您的场景,并设置其 directionstrength 以获得您想要的那种重力行为。
  3. 在你的球体和重力场上设置 categoryBitMasks,这样场会影响其他物体而不是球体。

无论您使用这些方法中的哪一种,您都可以在需要 "turn gravity on" 球体时更改它们:减少 damping、重置 velocityFactor,或更改球体的或重力场的 categoryBitMask.

从 iOS 9 开始,您可以将 isAffectedByGravity 属性 设置为 false 然后将值翻转为 true 以使球体下降: https://developer.apple.com/reference/scenekit/scnphysicsbody/1514738-isaffectedbygravity