フリーゲーム・フリーソフトの開発過程を記録していく、TDtechnic公式ブログです。製品はカテゴリの「ダウンロード場」からダウンロードして頂けます。
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

<不死女・技術的な難関一覧>
0.DirectXの初期化
1.タスクシステム
2.スキンメッシュアニメーション
3.日本語入力画面をDirectXで表示
4.当たり判定
5.フォントテクスチャ

こんばんは。不死女の難関リストに当たり判定が加わりました。ただ、もう完成したのでご安心下さい。

私は昔から当たり判定(より厳密には当たり応答)が苦手でした。レースゲームの「首都高バトルTD」シリーズでは、すり抜けのないまともな当たり判定はついにできませんでした。そのため物理法則のあまり関係ない今回は、あまり精度にはこだわらず簡単で確実な当たり判定を採用しようと思っておりました。
しかーし!法線で押し返すだけといった単純な応答では、どう考えても3つ以上の物が同時に当たった時にすり抜けるのです。キャラ同士の判定をやめれば一応回避できますが、やはりキャラとキャラが透けるのはちょっとお粗末です。
結局採用したのは、「衝突する時間を離散的に近似し、衝突面の法線方向で速度を分配する」という、ほとんど物理計算みたいな当たり判定です(実際、高校物理の公式で「反発係数」を0にすれば今回使った式が出てきます)。もちろん、この方法の原理は自力で導いたのではなく本で調べたもので、ゲーム業界では当たり前なのかも知れませんので、今回はこれ自体の説明ではなくて細かい調整のコツ?の解説をしてみようと思います。

①角に挟まると、なかなか抜け出せない
この判定では多角形の辺を線分としてバラバラに判定しているので、凹多角形を処理できるという利点があります。しかし、普通にやると上記のように「挟まる」という、この利点を台無しにする仕様が生じてしまいます。これは、挟まっている時は常に判定が反応してしまい、抜けようとしても押し返しベクトルがマイナスになって「吸い付けベクトル」になるからです。これを防ぐには、壁から離れようとしているときは判定しないようにすればよいのです。数学的には、法線ベクトル(押し返し向き)と相対速度(自分基準)の内積が0以下になった場合を除外することになります。これで挟まりは一切なくなりました。

②長い直線的な壁を、滑らかに壁ズリできない
今回は壁の判定モデルを3Dモデラーで半自動的に出力している以上、頂点の数は最小にはなりません。特に一直線の長い壁は、線分一本で表せるところを連続するいくつかの線分に分けています。もちろん手作業でやれば解決できることではありますが、ちょっとプログラム側で工夫してみることにしました。
線分の判定は、線分自体の判定の他に端点を処理します。この端点の処理が、線分の繋ぎ目で微振動しているようなのです。であれば、「平行につながった線分の端は処理しない」とすれば解決します。具体的には判定データに処理するかどうかのフラグを追加して、「座標が等しい端点を持つ線分が他にあり、その線分と自分の線分が平行(外積が0)」となる端点のフラグをオフにしました。①と併せて、ようやく角も平面もヌルヌル壁ズリできるようになりました。

で、今回この方式の当たり判定ができたことには大きな意義があるんですよ。これ、結局は物理計算なので、物理法則がメインのゲームにも適用できます。つまり、レースゲームの開発が再開できるかも知れないのです!まあ不死女の次回作はほぼ決まってるのですぐではないと思いますが、いつか本来の目的であるレースゲーム製作が実現する日が来るかも知れません。
関連記事

[2014/08/28 22:05] | 不死女 -Immortal girl-
|
コメント:
この記事へのコメント:
コメント:を投稿
URL:

パスワード:
非公開コメント: 管理者にだけ表示を許可
 
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。