5

内部重力のある船/宇宙ステーションをシミュレートしようとしています。

これを達成するために、プレーヤーと船のすべてのコンテンツを船の子にしています。船自体にはコライダーがありますが、剛体コンポーネントはありません。アイデアは、船が移動すると、その内容もすべて移動するということです。これまでのところかなり簡単です。

船内の重力をシミュレートするために、プレイヤー コントローラーとすべての剛体のデフォルトの重力がオフになっています。標準の代わりに、各フレームに力が親船の負のアップ ベクトルに沿って適用されます。

この種の作業はうまくいきますが、これを確実にする前に解決しなければならない大きな問題が 1 つあります。すべての剛体は、船の内部を非常にゆっくりと滑ります。

これはおそらく床の更新された位置が重力と組み合わされてある種のせん断力が発生したためであることは承知しています。オブジェクトは常に船の回転に逆らってスライドします。

物理マテリアルから質量へのドラッグなど、すべての物理特性をいじってみました。どれもうまくいきませんでした。RB が動いていても、床が動いているという基本的な事実によるものだと確信しています。床がその一部であるオブジェクトの子です。

ある種のダクトテープではない、これに対する解決策を誰かが持っていますか? すべてをキネマティックにして、特定の外部衝突などが発生したときにのみ「目覚める」ようにすることもできますが、それは非常に面倒になる可能性があります。これが可能な限り汎用的な方法で機能する必要があります。

いくつかのコード:

船の上

void Update () 
{
    transform.Rotate(new Vector3(Time.deltaTime * 0.125f,Time.deltaTime*0.5f,0));
}

void FixedUpdate()
{
Vector3 tempVec;

foreach(Rigidbody rb in rigidBodies)
    {
        //Gravity!!

        tempVec = transform.up * -9.81f * rb.mass * Time.deltaTime;         
        rb.AddForce(tempVec, ForceMode.Acceleration);
    }

}

また、剛体の動きに船が追従するバージョンも作成しました。直接のペアレンティングはできなかったので、物理プロキシに一致するようにフレームごとに手動でトランスフォームを設定するだけで済みました。これでも上記と同じ効果が得られましたが、最終的には船をどのように動かしたいかということになるでしょう。

4

2 に答える 2

0

これを現実世界のシナリオと同一視すると、私たちが床の上を滑るのを止めているのは摩擦だけです。

物理ライブラリは、接触する材料に基づいて摩擦を正しく適用しますか? 一定量の摩擦 (またはそれを克服するために必要な最小限の力) を適用しない場合、床での滑りを防止する効果があるはずです。

これは上記のようにほとんど「ダクトテープ」ですが、それを強制する方法がまだ含まれていない場合は、物理エンジンにうまく収まり、拡張される可能性があります。

于 2013-10-02T09:22:59.987 に答える