• ベストアンサー

当たり判定のアルゴリズムを教えてください。

状況によって3角形、5角形、9角形、●角形・・・ というような不定形なオブジェクトの当たり判定のアルゴリズムは どのようにすればよいでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • clsdi99
  • ベストアンサー率63% (31/49)
回答No.2

この手の判定をきちんとする場合は、幾何学系の計算が必要になってきます。 No1さんの仰るように、ゲームなど高速かつ簡易的に判定するのであれば、四角形同士のあたり判定がよいでしょう。 四角形同士は r1.left < r2.right && r1.right > r2.left && r1.top < r2.bottom && r1.bottom > r2.top で判定できます。 もし多角形や円などさまざまな形同士であたり判定するならば、それぞれの形状同士のあたり判定(交差・オーバーラップ)を実装しなくてはいけません。 具体的なコードを書くと長いので、アドバイスとして以下のようなクラスを作ってみてはいかがでしょう? class line_seg { public: bool hittest (const line_seg &); bool hittest (const polygon &); bool hittest (const circle &); }; class polygon { public: bool hittest (const line_seg &); bool hittest (const polygon &); bool hittest (const circle &); }; class circle { public: bool hittest (const line_seg &); bool hittest (const polygon &); bool hittest (const circle &); }; あと、多角形同士の判定の場合、線分の交差判定のみでは、内包されるようなパターンの時にだめですので、気をつけてください。

nihon_no_samurai
質問者

お礼

返事が遅れましてすいませんでした。 ありがとうございます!

その他の回答 (3)

  • amru05
  • ベストアンサー率63% (33/52)
回答No.4

「衝突判定」「コリジョン」で検索すると多くの有用な情報が得られますので検索してみてください。 http://www.gamespp.com/algorithms/collisiondetection/ 他の回答者と殆ど同じですが、一般的には、高速に判定するために簡単な方法で関係ない組み合わせを除き、その後は、線分交差が有れば衝突、ない場合でも内包されている場合は衝突、それ以外は衝突していない。。ような判定を行います。 1)高速な衝突しない図形判定   図形データをエリア分けしておき、離れているエリア図形とは衝突しないので除く。   同一エリアや隣接エリア図形とは、図形を円や長方形で近似した図形同士で簡単に衝突しない図形は除く。 2)1)で除かれなかった図形は衝突の可能性が有るので詳細な衝突判定を行う。

参考URL:
http://hspwiki.nm.land.to/?%BE%D7%C6%CD%C8%BD%C4%EA
nihon_no_samurai
質問者

お礼

返事が遅れましてすいませんでした。 ありがとうございます!

  • FAY
  • ベストアンサー率49% (95/193)
回答No.3

物体が移動することを考えると速度的に厳しいかもしれませんが・・・ 当たり判定「されるもの」と「するもの」のリージョンをそれぞれ作成し、 その2つのリージョンで共有される領域があるかどうかを調べる方法もあります。

nihon_no_samurai
質問者

お礼

返事が遅れましてすいませんでした。 ありがとうございます!

  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.1

もしゲームのあたり判定であればグラフィックリソースとは別に 四角形のあたり判定属性を用意するのが普通。(3Dなら直方体) n角形とm角形の辺り判定を厳密に判定するには 各線分が交差するかどうかをみていけば良いでしょう。 (ax1,ay1)-(ax2,ay2)・・・線分1 (bx1,by1)-(bx1,by1)・・・線分2 が交差する条件 (ay1-ay2)(bx1-ax1)-(ax1-ax2)(by1-ay1)・・・(1)式 (ay1-ay2)(bx2-ax1)-(ax1-ax2)(by2-ay1)・・・(2)式 (by1-by2)(ax1-bx1)-(bx1-bx2)(ay1-by1)・・・(3)式 (by1-by2)(ax2-bx1)-(bx1-bx2)(ay2-by1)・・・(4)式 (1)式*(2)式 <= 0 && (3)式*(4)式 <= 0 これがが成立するとき線分が交差します。

nihon_no_samurai
質問者

お礼

返事が遅れましてすいませんでした。 ありがとうございます!

関連するQ&A

  • 傾いた長方形と、傾いていない普通の長方形の当たり判定のアルゴリズム教えて!

    ゲームを作ろうとして行き詰ってます。 質問はタイトルのとおりです。 一方は傾いた長方形。もう一方は普通の長方形(傾いていない)。これらの当たり判定を取る方法というかアルゴリズム的なものを教えてください。 ただし以下の条件がつきます。 ・これら2つのオブジェクトは毎フレーム動く。 知恵を貸してください。 ちなみにこれは何かというと、シューティングゲームの敵の撃つレーザーが「傾いた長方形」で、「傾いていない長方形」が自機です。

  • 当たり判定

    ゲームで欠かせない処理それが「当たり判定」ですよね。 攻撃によるダメージ、倒したり、倒されたり。 アイテム獲得や複雑な地形に対する行動範囲設定。 複雑な形をした敵(ボスキャラなど)の当たり判定など。 当たり判定にも多数あり、それぞれメリット・デメリットがあると思います。 最近はゲームも2Dから3Dに移りつつあるので方法は余計に増えてきたと思います。 その「当たり判定」の方法とメリット・デメリットを出来るだけたくさん教えてください。

  • FlashLite1.1での当り判定

    円と円、矩形と矩形の当たり判定はいろいろなサイト等をめぐり把握できたのですが、 円と矩形の当たり判定の方法がわかりません。 どなたか教えていただけませんか??

    • ベストアンサー
    • Flash
  • FPS,TPSの当たり判定

    3DのFPS,TPS,レイルシューターなどのゲームを遊んでいると、射撃対象のオブジェクトの実際の見た目と被弾判定範囲とのギャップがほとんど、というより全く無いように思えるのですが、 そのような精密で、かつ高速な当たり判定はどのように実現されているのでしょうか。 オブジェクトのモデルと全く同じ衝突判定用モデルを用いれば可能でしょうが、何千というポリゴンから成る最近のゲームキャラクターに対しては現実的な方法では無いと思います。 可能であればざっくりとした解説をお願いします。 補足: 実際の作品例を以下に挙げます。 HALOシリーズ,GOWシリーズ,バイオハザード4,罪と罰 宇宙の継承者

  • visual basicで当たり判定

    Call BitBlt(Form1.Hdc,x1,y1,50,50,Picture1.Hdc,0,0,VBSrcCopy) Call BitBlt(Form1.Hdc,x2,y2,50,50,Picture2.Hdc,0,0,VBSrcCopy) 二つのBITBLT同士で当たり判定を付けたいのですがよくわかりません 簡単な当たり判定でいいですのでご教示ください

  • 当たり判定に特許性はあるのでしょうか?

    以下の4つのことを、教えて下さい。 (1)当たり判定に特許性はあるのでしょうか? (2)また、当たり判定を特許権として請求したものはあるのでしょうか? (3)ある場合、どのようなクレームでしょうか? (4)特許番号がお分かりでしたら、お教え下さい。 以上、ご回答下さいますよう、よろしくお願いいたします。

  • 簡単な当たり判定作りたい

    環境FLASH MX  ボタンオンでスタート、もう一回押すと画面上ハズレ、又は当たり表示という簡単な判定機を作りたいです。 プログラムの確率は1/10とします。ただし、完全確率方式でハズレをいったんもとに戻す。またルーレットのように回るような抽選でなく ランダム式がよいです。 ぜひ、アドバイスおねがいします!

    • ベストアンサー
    • Flash
  • 当たり判定のデータを残したい

    前回、簡単な当たり判定作りたいの追加希望です。 振り返りますと現状 sassakunさん回答ANo.3参考のフロー出来上がりました。 今回質問1です。 前回フロー(4)の判定結果を履歴と残し表示させたいのです。 つまり、フロー途中で・・・              ↓ (4)プログラム判定結果、画面上スベリで当たりor外れ表示              ↓ (4.1)    履歴 当たり○回 外れ○回 を適当に付近へ表示              ↓ としたいです。もちろん繰り返しフローですので 外れ及び当たりの履歴は増えていきます。(できたら履歴を0にする リセット機能もあれば便利です) 質問2 タイムラインでなくダイナミックテキストのみでスクロールさせて いますがフロー(2)~(4)の最中サウンドは可能なのでしょうか、 つまりボタン“オン”で音楽スタート→(2)・・(4)の判定後表示と同時にサウンド停止。 以上ここまでの(追加部分)フローをまとめます (1)ボタン“オン”      ↓ (2)音楽スタート(今回追加) 画面上当たり、ハズレ、当たり、はずれ・・とループ横スクロール       ↓ (3)ボタン“オン” 音楽再生中・・      ↓ (4)プログラム判定結果、画面上スベリで当たりor外れ表示同時に再生 中の音楽ストップ   同時に当たり○回 外れ○回 を適当に付近へ表示(今回追加)      ↓ (5)ボタン“オン”      ↓      (2)へ 質問3  フロー(4)“スベリ”部分速度って調節可能ですか? 質問4 当たりのときにタイムフレームへ移動、画面上演出したいのでが複雑になりかけているので今後の希望にします。 何度もお手数かけています。           

    • ベストアンサー
    • Flash
  • 回転する四角や円で当たり判定をしたいのですが

    回転する四角や円で当たり判定をしたいのですが 数学に弱いものでよくわかりません どうやって当たりを判定すればいいでしょうか? わかり難い質問ですいません よろしくお願いします

  • アイコンの当たり判定を小さくする方法

    アイコンの当たり判定を小さくする方法

専門家に質問してみよう