7

プレイヤーが壁の内側に立つことができないようにしたい。ゲームのダニごとに、プレーヤーは少し距離を移動したり、回転したりします。

TL; DRは、ニアミスも返す古典的な線分->三角形交差アルゴリズムの変形を提供するか、別の方法で問題を解決して ください。線分が三角形の所定の距離内を通過する場合、線分は交差します。三角形の軌跡の角が丸くなっていることや、線分が三角形に接している場合など、問題には多くの微妙な点があります。

私は通常の光線/三角形の交差コードを持っています。

ただし、光線は移動するプレーヤーの非常に貧弱な近似です。プレーヤーの中央のエッジが欠落しているのに、プレーヤーのメッシュがエッジを通過するという問題があります。

プレイヤーが3D環境で壁や障害物と衝突するタイミングと場所を、どのように効率的に判断しますか?

一般的なアプローチの1つは、光線がボールキャップ付きの円柱であるニアミストライアングルコードを使用することです。

私が作成しようとした一般的な解決策は、プレーヤーが球体であると想像することです。これを裏返しにして、実際の壁よりも半径が大きいメッシュを作成し、その上で衝突光線を実行しようとしました。このメッシュの前に一定の距離があるメッシュを計算したいと思います。つまり、立方体は、エッジとコーナーが丸い少し大きい立方体に拡張されます。(私のメッシュは立方体よりも規則的ではありません。ボイラー室の内部のメッシュ表現を想像し、その部屋のすべての壁、ボイラー、ドアフレームなどから20 cmのメッシュを計算しようとしていると想像してください。)バレルの周りの単純なメッシュは次のとおりです。

ここに画像の説明を入力してください

各面について、サーフェス法線を計算できます。これは私がどちらの方向が「アウト」であるかを知る方法です。

私のブレーンストーミングでは、各面の法線に固定距離を掛けて、対応するオフセットを持つ三角形を放射することを想像します。

しかし、これはエッジに穴を残し、おそらく(?)いくつかのエッジが非常にタイトな鋭いコーナーを通過する原因になりますか?

また、各エッジをボールエンドシリンダーとして結合することも想像できます。

上記のバレルに使用したアプローチは、頂点を共有するすべての面の平均法線を計算し、それを衝突半径で乗算することです。鋭角にはうまく対応できません。反対側にある面間で頂点が誤って共有されている場合はどうすればよいでしょうか。

このメッシュを計算してから、Javacsriptで光線の交差を実行します。したがって、パフォーマンスも考慮事項です。詳細なメッシュが細かすぎると、衝突検出を行うのにコストがかかります。

十分な遺伝子座メッシュを効果的に計算するにはどうすればよいですか?または、軌跡を意識したファジー三角形の交差点ですか?それとも、衝突を行うためのより良い方法がありますか?それは、物事が直線ではなく弧を描いて動くことをどういうわけかモデル化できますか?

4

1 に答える 1

0

(誰も賞金を手に入れませんでした:( gamedev.stackexchange の Nathan Reed が用語を手伝ってくれました。カプセルと三角形の交差点と呼ばれます。)

その驚くほどトリッキーな数学とグーグルは、コピーする既成のコードをあまり見つけられません。

標準的な方法は、三角形を半径で押し出し、さらに 3 つの三角形の各エッジをカプセルとしてテストすることです。

三角形を押し出すには、三角形の法線をカプセル半径で乗算し、各三角形の角をその量だけオフセットしてから、それに対して法線セグメントの三角形テストを実行します。

各三角形エッジのカプセル テストは、3 回実行する必要があるため、かなりコストがかかります。トライアングル テストの重心座標を使用すると、一部のカプセル エッジ テストを回避できる可能性がありますが、これについては考えていません。また、十分に鈍い他の三角形と共有されているエッジでのカプセル テストを回避することもできます。これを計算して、それらのエッジをマークできます。私は(まだ)気にしていません。

各面の境界球を事前に計算し、カプセルの境界球との交差テストを行うことは、ほとんどの場合、この高価なテストを回避するための非常に安価な方法であることがわかりました。また、各面の法線も事前に計算しますが、それは小さな成果です。

テストは非常にコストがかかるため、プレーヤーを 1 つの球体として扱い、交差コードに面の交差のリストを与えることが最善の方法です。次に、プレーヤーを一連の小さな球体が編隊飛行するものとしてモデル化できます。カプセル面の交差コードを実行する必要があるのは、最初に大きな球体が見つかった面を通過したときだけです。

于 2012-09-20T09:03:10.507 に答える