ポータルの衝突検出を実装する方法は?


12

たとえば、このシナリオを考えてみてください(私の恐ろしい描画スキルを失礼します): 画像

これは、棒人間が青いポータル(赤いポータルにリンクされている)を通過する「ポータル」に基づいていますが、赤いポータルで彼を止める壁があります。したがって、彼はポータルを完全に通過できません。

だから私の質問はこれです:彼らと物理学/衝突検出を行うにはどうすればよいですか?プレーヤーをスライスしますか?それらをリンクする方法はありますか?これをサポートする物理エンジンはありますか?そうでない場合、どのように作成しますか?


私の知る限り、彼らはポータル1の開発者の解説でいくつかのことを説明しています。
Archy


@ Byte56、ありがとう、投稿を更新しました。これはそれをより明確にする必要があると思います:)
ミジン

1
ポータルはフリーフローティングプレースメントではないため、あなたが説明する状況はポータルでは非常にまれです(発生した場合)。それらは壁に配置され、特定の壁のみに配置されます。ポータルを配置できたが、ポータルの反対側に障害物があるためにポータルを通過できなかった状況を思い出せません。移行期間中に両方の場所でプレーヤーの一時的なコピーを作成できると思います。
マイケルハウス

2
@ Byte56:あまり覚えてはいけません。これはポータル1で行われたことを思い出します。ポータルを使用して死なないようにすることができる粉砕エリアを思い出すようです。ポータルの近くにあるものと衝突することはよくあることであり、エンジンはそれを簡単に処理します。
ニコルボーラス

回答:


7

ポータルゲームは、彼らがこの問題を解決したことにより、良い方法があります。

プレイヤーはソースポータル(青)を突き抜け、ターゲットポータル(オレンジ)から突き出ています。プレーヤーはターゲットポータルにコピーされ、そこをステップスルーします。ゲームは、2番目のカメラとテクスチャへのレンダリングを使用して、ソースポータルを通して見るときに表示される画像をレンダリングします。

ただし、ターゲットの場所にあるプレーヤーのコピーは物理学と相互作用しません。レンダリング目的でのみ存在します。代わりに、ソースポータルの反対側に仮想衝突オブジェクトを作成し、代わりにプレーヤーを衝突させます。これにより、物理がシンプルに保たれます。

これらの仮想オブジェクトは、プレーヤーがポータルを完全に通過せずに到達できる範囲でのみ必要です。プレイヤーがポータルを完全に通過するとすぐに、状況は逆転します。

説明する画像:青いポータルはソースポータル、オレンジのポータルはターゲットポータルです。破線の白いボックスは仮想衝突オブジェクトであり、実際のボックスはレンダリングされたオブジェクトです。プレーヤー(赤い点)は、周囲のオブジェクトとのみ相互作用します。オレンジ色のポータルのオブジェクトは完全に無視されます。

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


4
2台目のカメラとテクスチャをレンダリングするを使用する開発者は、ポータル1に関するコメントで、テクスチャをレンダリングすることを使用していないと明確に述べています。 )。代わりに、基本的に世界のバージョンをポータルの反対側に変換し、それを介して再レンダリングします。
ニコルボーラス

うわー、これはほとんどすべてに答えます!私はただ疑問に思っています、それはポータルが内部のオブジェクトを持つ穴であることによって動作しますか?
MiJyn

6

これが私がやってみようとする方法です。

ポータル内にいる間、物理エンジンにはプレイヤーのコピーが2つあります。各コピーは、ポータルの反対側にあるすべての衝突を無視します。その後、結果を組み合わせて、シミュレーション結果を両方のモデルに適用します。

理想的には、プレーヤーの半分ごとに重力を個別に適用しますが、プレーヤーの重心が位置するポータルの側面に重力を適用するだけで済む可能性があります。

これらの衝突を無視するには、適切なボリュームを設定し、ポイントがその中にあるかどうかをテストする必要があります。シリンダー(垂直方向に伸びている可能性があります)が良い選択肢のようです。テストは次のようなものですif (!collisionPoint.InsideCylinder(portal)) ProcessCollision(); else IgnoreCollision();

ほとんどの物理エンジンには、オブジェクトが衝突する可能性のあるものをフィルタリングするシステムがあるため、標準の物理エンジンを使用して可能になるはずです。例えば http://bulletphysics.org/mediawiki-1.5.8/index.php/Collision_Filtering#Custom_collision_filtering

結果を結合するための最も簡単なオプションは、おそらく2つの間に何らかの柔軟性のない制約を追加し、物理エンジンに処理させることです。


うーん、大丈夫、どうすればいいですか?プレイヤーをコピーすることについては理解していますが、それとは別に、私は無知です。反対側からの衝突をどのように無視しますか?結果をどのように組み合わせますか?
ミジン

詳細を編集しました。
アダム

おかげで、私はこれについて考えて、頭の中でこれをまっすぐに設定できたら後で返信します:)
MiJyn

どうもありがとう、あなたの答えとVirtlinkが私の質問に答えます:)さて、「正しい答え」を設定するものを決めるために...
-MiJyn

4

プレーヤーがどれだけダウンするかをどのように計算しますか?

なぜしたいのですか?プレイヤーがどれだけ「ダウン」するかを計算する必要はありません。オブジェクトがシミュレーションを通過する際にどれだけ下に行くかがわかります。

ポータルをどのように接続しますか?

純粋にゲーム内から見たポータルは、衝突を乱して衝突可能なオブジェクトを衝突不可能なオブジェクトに変える精巧なテレポーターにすぎません。オブジェクトがポータルに触れると、潜在的に反対側の物と衝突し始めます。オブジェクトがポータルを「十分に」通過すると、他のポータルに効果的にテレポートし、その位置と方向を瞬時に変更します。

物理学は、通常どおり単純に進みます。


When an object touches the portal, it starts potentially colliding with things on the other sideはい、正確に。物理エンジンでこれを行うにはどうすればよいですか?それは私の質問だったと思います:)
MiJyn

@MiJyn:それを行うことができる物理エンジンを作成します。Portalは、Portalを実際に機能させるために、本質的にSourceエンジンを破壊する必要がありました。商用またはオープンソースの物理エンジンでは、これを自然に行うことはできません。ポータルの人気にもかかわらず、市場にポータルクローンのスコアがないのには理由があります。
ニコルボーラス

興味深いのは、非常によく似たメカニズムを持つ他のゲームがたくさんあるためです(MinecraftのTARDIS modも参照してください)。私はそこになければならないことを確信しているいくつかの簡単にそれを行うための方法。
ミジン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.