プレイヤーが壁の内側に立つことができないようにしたい。ゲームのダニごとに、プレーヤーは少し距離を移動したり、回転したりします。
TL; DRは、ニアミスも返す古典的な線分->三角形交差アルゴリズムの変形を提供するか、別の方法で問題を解決して ください。線分が三角形の所定の距離内を通過する場合、線分は交差します。三角形の軌跡の角が丸くなっていることや、線分が三角形に接している場合など、問題には多くの微妙な点があります。
私は通常の光線/三角形の交差コードを持っています。
ただし、光線は移動するプレーヤーの非常に貧弱な近似です。プレーヤーの中央のエッジが欠落しているのに、プレーヤーのメッシュがエッジを通過するという問題があります。
プレイヤーが3D環境で壁や障害物と衝突するタイミングと場所を、どのように効率的に判断しますか?
一般的なアプローチの1つは、光線がボールキャップ付きの円柱であるニアミストライアングルコードを使用することです。
私が作成しようとした一般的な解決策は、プレーヤーが球体であると想像することです。これを裏返しにして、実際の壁よりも半径が大きいメッシュを作成し、その上で衝突光線を実行しようとしました。このメッシュの前に一定の距離があるメッシュを計算したいと思います。つまり、立方体は、エッジとコーナーが丸い少し大きい立方体に拡張されます。(私のメッシュは立方体よりも規則的ではありません。ボイラー室の内部のメッシュ表現を想像し、その部屋のすべての壁、ボイラー、ドアフレームなどから20 cmのメッシュを計算しようとしていると想像してください。)バレルの周りの単純なメッシュは次のとおりです。
各面について、サーフェス法線を計算できます。これは私がどちらの方向が「アウト」であるかを知る方法です。
私のブレーンストーミングでは、各面の法線に固定距離を掛けて、対応するオフセットを持つ三角形を放射することを想像します。
しかし、これはエッジに穴を残し、おそらく(?)いくつかのエッジが非常にタイトな鋭いコーナーを通過する原因になりますか?
また、各エッジをボールエンドシリンダーとして結合することも想像できます。
上記のバレルに使用したアプローチは、頂点を共有するすべての面の平均法線を計算し、それを衝突半径で乗算することです。鋭角にはうまく対応できません。反対側にある面間で頂点が誤って共有されている場合はどうすればよいでしょうか。
このメッシュを計算してから、Javacsriptで光線の交差を実行します。したがって、パフォーマンスも考慮事項です。詳細なメッシュが細かすぎると、衝突検出を行うのにコストがかかります。
十分な遺伝子座メッシュを効果的に計算するにはどうすればよいですか?または、軌跡を意識したファジー三角形の交差点ですか?それとも、衝突を行うためのより良い方法がありますか?それは、物事が直線ではなく弧を描いて動くことをどういうわけかモデル化できますか?