ラベル Collision の投稿を表示しています。 すべての投稿を表示
ラベル Collision の投稿を表示しています。 すべての投稿を表示

2011/04/03

2Dの壁コリジョンをどうやって計算する?

先日思いついた2Dゲームで壁との衝突判定をどうやって行うかについてまとめておきます。

スーパーマリオやチャレンジャーなどファミコン時代によく遊んだ2Dゲームで壁に衝突すると壁に潜ってしまう方向の移動要素以外は生きて横に移動するというような操作を覚えている人も多いかと思います。
これはそんな感じにするための衝突判定です。

例えば横にのびている壁に斜めにあたった場合に、縦の移動は阻害されるけど、横への移動は許可されるというようなことです。

以下の図を見てください。
青い四角はキャラクター。
緑の四角は壁、白い矢印はキャラクターの移動方向となります。



壁に衝突する際に、キャラクター移動後のA,B,Cの3点での潜りを調べます。
キャラクターの進行方向にしたがって調べるべきA,B,Cの位置は変化しますが、要は移動に関係する3点です。

まずは左上の図を元に説明すると、
1:A,B,Cのすべてが潜らなければ希望する移動は許可される。
2:1でいずれかが衝突する場合には縦横どちらか、あるいは両方の移動が阻害されるので3以降の判定を行う。
3:Cが潜らなければ横方向の移動を許可し、縦方向は阻害される。


左下の図の場合は、
4:Aが潜らなければ縦方向の移動を許可し、横方向は阻害される。

さらにL字の壁の隅に移動しようとした場合などが当てはまりますが、
5:C,Aの両方が潜る場合はすべての移動が阻害される。

とすることでうまいこと壁との衝突を調べることが出来ます。

なお、派生系として右上と右下の場合もキャラクターのサイズを考慮して壁の角との潜りを調べて対応できます。
(おかしな判定を行うと角ギリギリを攻めると半分埋まりながら移動可能になってしまったりしますからね)

てなわけで、壁との判定をまとめてみました。
ひょっとすると1での判定はBのみの潜りを調べることで済むかもしれませんが、どうなんでしょう。

2009/04/19

ズーム機能


 ズーム機能を入れました。あと、カメラを回す機能もついでに。インターフェース的には左下のアイコンを触れているときだけ臨時で機能がオンになる仕様。これならiPhoneを左手で持ちながら一時的にズームにして、右手で色を塗ったり操作できるという感じになります。

 こないだのレイキャストによるコリジョン計算が、プロジェクションの逆マトリクスを使用して原点からカメラ座標へ逆変換するということをしてるのですが、この逆変換がどうやらカメラの移動に関しては効かない様子。カメラ座標を若干移動した分に関しては自前で逆変換しないとだめなようでした。

2009/04/18

より正確なコリジョン計算を


 なかなかいろいろな進展がありました。

 まずは、描画で、面と面の継ぎ目部分をつないでしまうと隣の面の側面が表面まで出てきてチラチラしてしまう問題がありましたが、それを完全に解消しました。隣のキューブの存在の有無を調べてそれに応じて面の表示をするかどうかを変えるようにしたところ、表示もきれいになったのは当然として(左の画像)、画面に描画されている無駄なポリゴンがなくなったことでだいぶ高速に動作するようになりました。いまでは20x20x20くらいでもヌルヌルです。

 そして、コリジョン関係をより丁寧なものに変更。見えている中での判別としたかったので、キューブが隣り合う面のどちらから見えているのかによってオブジェクトとしての法線を用意し、その法線とレイキャスト用のベクトルでキューブが見えているかどうかを判定するようにしました。それによって、すべてに対してレイキャスト計算をしないでよくなったため、若干の高速化も達成。高解像度キューブでの動作が多少快適になりました。

 あと、カメラ操作。ちょっとしたアイデアでしたが、画面端の方をフリックする際には視点座標系のZ軸を中心に回転するようなニュアンスにしました。普通の3Dツールだとそういうのはありませんが、これはこれでいい感じかと。

 そんなこんなで盛りだくさんな更新でした。そろそろ完成が見えてきたかな?