0

動的な物体に力を加える場合、力積を に設定しても、この力は持続しないようfalseです。

私はphysicsBodyを持つsphereNodeを持っています:動的、質量= 1および減衰= 0。ワールドの重力は (0,0,0) に設定されます。

ジェスチャ認識エンジンに力を加えると:

func Detected(sender: UILongPressGestureRecognizer) {

    if sender.state == UIGestureRecognizerState.Began {
        sphereNode.physicsBody!.applyForce(SCNVector3Make(1, 0, 0), impulse: false)
    }

    if sender.state == UIGestureRecognizerState.Ended {
        sphereNode.physicsBody!.clearAllForces()     
    }
}

その後、速度は0.0166あたかも力が 1 フレームの間だけ適用されたかのようになり、ジェスチャを再度トリガーしない限り一定のままになります。

真の一定の力として機能させる唯一の方法は、レンダラー ループで applyforce を呼び出すことですが、非インパルス applyforce との唯一の違いは 60 倍です。これは期待される動作ではないと思います。

4

1 に答える 1

2

それが機能するはずの方法だと思います。

瞬時に体の勢いを変えたい時にインパルスを使います。たとえば、インパルスを使用して大砲からボールを​​発射することができます。大砲のように、それは「発射して忘れる」です。メソッドを呼び出すと、ボールが何かに当たるまで飛んでいきます。

効果を持続させたいときは force( impulse:NO)を使います。つまり、継続的な効果は発生しません (そうでなければ、各ボディの個々の継続的な力を列挙してキャンセルするための API が必要になります)。継続的な効果を生み出します。

たとえば、ボタンを押したときに宇宙船を加速させたい場合は、力を使用し、ボタンを離すまで加速し続けます。ボタンを押している間は、メソッドが実行さapplyForceれるたびに呼び出すだけです。update

impulseトグルは、2 つのケースに対して 2 つのことを行います。

  • お気づきのように、各ケースに適した大きさの単位が変更されます。
  • を使用するimpulse:NOと、現在のフレーム サイクルが終了するまで評価が遅延されます。そのため、 1 つの 中に複数の異なる力を適用できますupdate。SceneKit が次のフレームの物理をシミュレートすると、力の合計が適用されます (clearAllForces最初に呼び出さない限り)。
于 2014-12-20T00:48:52.470 に答える