1

Unity 3d の物理演算に問題があります。ボールが壁に当たって跳ね返り、別の方向に進むことを望んでいます。ボールが壁に当たると、ボールはまっすぐ跳ね返ります。壁に当たる方向と直角になるように向きを変えてみましたが、向きは変わりません。このため、ボールは壁にぶつかり続け、まっすぐ跳ね返ります。

次に、ボールが壁をすり抜けることがあります。壁にはボックス コライダーがあり、ボールには球コライダーがあります。それらはすべて、衝突検出モードとして連続ダイナミックを持っています。

4

3 に答える 3

1

たぶん、球と壁の間の衝突点を取得してから、剛体の速度をキャッチし、衝突点の法線で元に戻してみてください。

それを行うスクリプトの例 ---> (このスクリプトをコライダーのある壁に置く)

C# スクリプト:

public class WallBumper : MonoBehaviour
{
    private Vector3 _revertDirection;
    public int speedReflectionVector = 2;
    /***********************************************
    * name : OnCollisionEnter
    * return type : void
    * Make every gameObject with a RigidBody bounce againt this platform
    * ********************************************/
    void OnCollisionEnter(Collision e)
    {
        ContactPoint cp = e.contacts[0];
        _revertDirection = Vector3.Reflect(e.rigidbody.velocity, cp.normal * -1);
        e.rigidbody.velocity = (_revertDirection.normalized * speedReflectionVector);
    }
}
于 2015-02-23T18:54:54.513 に答える
1

同様のスレッドへのリンクは次のとおりです。

http://forum.unity3d.com/threads/22063-I-shot-an-arrow-up-in-the-air...?highlight=shooting+arrow

個人的には、GargarathSunman がこのリンクで提案しているように、LookAt を使用してローテーションをコーディングしますが、物理学でそれを行いたい場合は、リンクで他の人が示唆しているように、おそらく少なくともいくつかの部分でジャベリンを構築する必要があります。 、おそらく密度も同様に、各パーツに異なる抗力と角度抗力の値を追加します。空気抵抗が非常に重要な役割を果たしているため、ジャベリンを真空に投げた場合、ポイントが着地することはありません(質量に関係なく、すべてのものは同じ速度で落下します。アイザック・ニュートン卿に感謝します). 物理エンジンが正しく動作するのは難しいシミュレーションです。

于 2011-03-28T08:10:26.460 に答える
0

最近、速度が原因でロケットがターゲットを通過するという問題があり、継続的な動的衝突検出を使用しても、これが頻繁に発生するのを防ぐことができませんでした。

wiki.unity3d.comに投稿されたスクリプト「DontGoThroughThings」を使用してこれを解決しました。これは、現在の位置と前の位置の間でレイキャスティングを使用し、OnTrigger イベントのメッセージに接続されたコライダーでフレームが終了するようにします。それ以来、いつでも機能しており、スクリプトを添付するだけなので、非常に使いやすいです。

物理学の答えは、他の人が異なるドラッグで複数のコンポーネントを使用することを提案しているようなものだと思いますが、通常、親には単一の RigidBody のみが必要だと思います。transform.LookAt を使用する方向の代わりに、rigidbody.velocity から Quaternion.LookRotation を使用して計算を試みることができます。次に、Vector3.Angle を使用して、どの程度ずれているかを調べます。角度差が大きいほど、より多くの力を経験する必要があり、RigidBody.ApplyTorque を使用します。おそらく、Sin(angleDifference) * 定数を使用して、適切な回転に近づくにつれてトルクに加えられる力が小さくなるようにします。

ロケットで使用したコードを次に示しますが、固定されたターゲットを指していたため、いくつかのものを置き換える必要があり、速度を使用する必要があります。

var rotationDirection = Quaternion.LookRotation(lockedTarget.transform.position - this.transform.position);
var anglesToGo = Vector3.Angle(this.transform.rotation.eulerAngles, rotationDirection.eulerAngles);

if (anglesToGo > RotationVelocity)
{
    var rotationDirectionToMake = (rotationDirection * Quaternion.Inverse(this.transform.rotation)).eulerAngles.normalized * RotationVelocity;

    transform.Rotate(rotationDirectionToMake);
}
于 2017-08-20T18:36:51.647 に答える