Unityのonコリジョンイベントは、発生したコリジョンに関するいくつかの情報を提供するCollisionオブジェクトを提供します(ヒット法線を持つContactPointsのリストを含む)。
しかし、得られないのは、衝突したコライダーの表面法線です。これは説明するためのスクリーンショットです。赤い線はからContactPoint.normal
、青い線はからRaycastHit.normal
です。
これは、簡素化されたAPIを提供する情報を隠すUnityのインスタンスですか?または、標準の3Dリアルタイム衝突検出技術でこの情報が収集されないのですか?
そして質問の2番目の部分について、衝突の表面法線を取得するための確実で比較的効率的な方法は何ですか?
レイキャスティングによって表面の法線が得られることはわかっていますが、これをすべてのシナリオで実現するには、いくつかのレイキャストを行う必要があるようです(接触点と通常の組み合わせで最初のキャストのコライダーが欠落するか、すべての平均を行う必要があるかもしれません)最良の結果を得るための接触点の法線)。
私の現在の方法:
Collision.contacts[0].point
通常のヒットに沿ってバックアップします否定ヒットダウンレイキャスト通常のため
float.MaxValue
に、Collision.collider
それが失敗した場合、通常の否定されていない状態でステップ1と2を繰り返します。
それが失敗する場合は、ステップ1〜3を試してください。
Collision.contacts[1]
成功するまで、またはすべての接点がなくなるまで4を繰り返します。
あきらめて、戻り
Vector3.zero
ます。
これはすべてをキャッチしているようですが、これらすべてのレイキャストは私をうるさくします、そしてこれが十分なケースで機能することをテストする方法がわかりません。もっと良い方法はありますか?
編集 これが本当に3Dコリジョンでの方法である場合、一般的な場合の理由の概要は、Unityに固有の何かと同様に歓迎されます。