7

私は現在、親ノード(物理体が添付されていない)と、それぞれが円体で構成される多くの子ノードで構成されるラグドールフィギュアを持っています。SKPhysicsJointPin円は、次のように、各円の間に を使用して互いに接続されます。

ラグドールフィギュア

それぞれSKPhysicsJointPinに があり、現在、とshouldEnableLimits = trueにそれぞれ -0.05 と 0.05 の値を使用しています。lowerAngleLimitupperAngleLimit

これは非常にうまく機能し、図形が全体的に上下逆さまになる場合を除いて、形状が過度に変形するのを防ぎます。その場合、すべての関節が突然収縮しようとします。

壊れたラグドール フィギュア

フィギュアが完全に逆さまになると、関節は非常に速く収縮します。彼が再び回転すると、すべての関節が正常に戻ります。なぜこれが起こるのですか?関節の正しい角度を維持するにはどうすればよいですか?

編集1:

奇妙なSwiftのバグが原因であった場合に備えて、Objective-Cでプロジェクトを書き直そうとしました。この問題はまだ Objective-C で発生していることが判明したため、Swift タグを削除しました。

現時点での私の最善の推測は、ジョイントが接続されているボディがいずれかの方向に 180° 以上回転している場合、ワールドに対するジョイントの角度が SpriteKit によって誤って計算されることです。基礎となる Box2D ジョイント。

ボディのワールド アングルに合わせて角度の下限と上限を継続的に更新する必要があるかどうかはわかりませんでしたが、ボディが逆さまになりそうになったときのように更新する必要はないようです。関節が正常に機能しなくなります。とにかく実験を続けます…</p>

編集2:

SpriteKit がzRotation値を -180° から 180° の間に保つように (正当な理由があると思いますが) 変更しているため、問題が発生することはかなり確信しています。たとえば、ノードが時計回りに回転していて、-180° に達した場合、SpriteKit はその値を自動的に +180° に戻します。このラップアラウンドが関節の異常な動作を引き起こしていることはかなり確信しています。それを打ち消す方法を見つける必要があるだけです…</p>

編集3:

この問題を示すサンプル アプリケーション (ビデオを含む) をアップロードしました。これは、最初に Apple から要求されたものです: Xcode Project / Video

4

2 に答える 2

0

「現在、lowerAngleLimit と upperAngleLimit にそれぞれ -0.05 と 0.05 の値を使用しています」

ドキュメントによると...

upperAngleLimit - ピン ジョイントに許容される最大角度(ラジアン) 。

...制限はラジアンです。

0.05 radians = 2.86478898 degrees

したがって、体が合計で約 5 度しか移動できないことになります。これは非常に小さな範囲です。私の経験から、SpriteKit は、ボディが範囲外に追いやられると、この奇妙なスナップ動作を開始します。

この動作は逆さまの体に固有のものではないと思います。私の最善の推測では、物理エンジンには、あるフレームで重力を適用し、次のフレームで範囲外に移動する前に体をキャッチするフレーム レートがないということです。

範囲を拡大する必要があります。度で指定することを好みます。例えば...

func degreesToRadians(degrees: CGFloat) -> CGFloat {
    return CGFloat(M_PI) * degrees / 180.0
}

pinJoint.shouldEnableLimits = true
pinJoint.lowerAngleLimit = degreesToRadians(-30.0)
pinJoint.upperAngleLimit = degreesToRadians(180.0)

物事がリアルに動くスイート スポットが見つかるまで、角度、質量、重力をいじる必要があります。

本当に可動範囲を小さくしたい場合は、完全に無効にすることを検討します。

circle.physicsBody?.allowsRotation = false
于 2015-03-05T06:57:21.590 に答える
0

これは SpriteKit のバグであることを確認できます。私の場合、ピン ジョイントで結合された 2 つのスプライトの最も単純なシナリオを使用しています。残念ながら、iOS 9でもまだ発生しています:(

于 2015-11-15T07:29:03.613 に答える