Java初心者で、いろいろ調べてみたのですが、わからなかったので質問します。
現在、物体にボールが当たったときの衝突モデルを作っているのですが、その当たる場合の衝突判定ができないで困っています。
物体の形状は円と矩形を組み合わせた少し複雑な形状で、すべて黒色で表しています。
また、その物体は回転もさせるようにしているので、「ボールの座標が黒色の部分に位置しているか」で当たり判定ができないかと考えています。
もしそういうメソッドがあるのであれば、そのクラスと簡単な例を教えてもらえないでしょうか?よろしくお願いします。
No.2ベストアンサー
- 回答日時:
補足ありがとうございます。
それでは「線分」と「円」の衝突ということになりますね。
http://www.dango-itimi.com/blog/archives/2006/00 …
をJavaに適当に置き換えたものですがこんな感じはいかがでしょう。
public class HitJudge {
public boolean isHit(Circle c, Line l) {
// 線分の始点から線分に沿ったベクトル
Vect2D v1 = l.src.getVectTo(l.dst);
// 線分の始点から円中心へのベクトル
Vect2D v2 = l.src.getVectTo(c.core);
// 内積
double n1 = v1.dotProduct(v2);
if (n1<0)
return l.src.distance(c.core) < c.r ? true : false;
//
double n2 = v1.dotProduct(v1);
if (n1>n2)
return l.dst.distance(c.core) < c.r ? true : false;
System.out.println( c.r);
return v2.dotProduct(v2)-(n1/n2)*n1 < c.r*c.r ? true : false;
}
public static void main(String[] str) {
Circle c = new Circle(new Point(0,0), 2);
Line l = new Line(new Point(1,-1), new Point(1,1));
HitJudge judge = new HitJudge();
System.out.println(judge.isHit(c,l));
}
}
class Line {
public Point src;
public Point dst;
public Line(Point s, Point d) {src=s; dst=d;}
}
class Circle {
public Point core;
public int r;
public Circle(Point core, int r) {this.core=core;this.r=r;}
}
class Point {
public int x,y;
public Point(int x, int y) {this.x=x; this.y=y;}
public double distance(Point p) {
return Math.sqrt(Math.pow(x-p.x,2) + Math.pow(y-p.y, 2));
}
public Vect2D getVectTo(Point p) {return new Vect2D(p.x-x, p.y-y);}
}
class Vect2D extends Point {
public Vect2D(int x, int y) {super(x, y);}
public double dotProduct(Vect2D v) {return x*v.x + y*v.y;}
}
物体の円の部分も衝突判定に入れるのであれば、
1.これに物体の円部分の衝突判定もあわせて行う
2.プレートと円をいっそのこと直方体としてあつかう
などがあげられるでしょうか。
円の衝突判定は非常に簡単なので1の方がやりやすいかもしれませんね。
参考URL:http://www.dango-itimi.com/blog/archives/2006/00 …
No.1
- 回答日時:
質問者様の仰るとおりボールのいる位置に物体があるか否かで判定する方法でも衝突判定が出来ますが、ボールの速度が速い場合にすり抜ける現象が起こる可能性があります。
例えば現在 t=i秒 の時に
==○ ■
という位置にあり、tをインクリメントした t=i+1秒のときに
■ ==○
と間をすり抜ける現象が起こり得ます。
これは時間を離散的に扱ってしまうとどうしても生じてしまう問題です。
恐らくボールは円(もしくは球?)として扱っていると思いますから半径とかは既知ですよね。
衝突に関することは以下のURLに詳しくまとめられているので目を通しておく価値はあります。恐らく「移動している球の衝突」や「2つの球を当てて跳ね返らせる」あたりが参考になるでしょう。
http://www.h6.dion.ne.jp/~game296o/COL_main.html
ただしソースはCであり、容易にJavaに書き換えられると思います。
直接の回答ではないですが一応参考にしてみて下さい。
参考URL:http://www.h6.dion.ne.jp/~game296o/COL_main.html
この回答への補足
説明があいまいで申し訳ございません。
このプログラムの大きな流れとしては、最初に目的地を指定します。
そして、物体を動かしてボールと衝突させることを繰り返しながら、目的地にボールを移動させることを目的としています。
少しわかりにくいかもしれませんが、物体の形状は下に示すとおりで、円の先にプレートを置いてそこにボールを衝突させようと考えています。
○| ←物体の形状(プレートと物体は重なっている)
それで、物体はまぁ一応ロボットという設定で考えていますので、プレートのある方向を前方向として前進と回転動作を行うようにしています。
衝突する位置は物体を動かしてプレート上で当てるようにしたいと思います。
また、大きさですが、ボールの直径を8とすると、物体の直径(?)は30にしています。
基本的にボールを物体に衝突させる訳ではなく、物体の方を移動させてボールにぶつけるという形なので、ボールの速度はさほど早くはありません。
このような形で衝突判定をしようと思っているのですが、最初の質問に限らず、他に優れた方法があるならば回答をよろしくお願いします。
まずは回答の件でお礼します。ありがとうございます。
asockさんのおっしゃったとおり、ボールの速度が速い場合にすり抜けるという現象は考えていました。
しかし、私の最初の説明不足で申し訳ないのですが、ボールの速度はさほど速くありません。補足の方でもう少し詳細に説明を加えます。
ですが、参考URLはとてもありがたく思っています。
さらに詳しく見てみたいと思います。どうもありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 数学 『4色問題⓵』 9 2022/10/24 06:54
- 物理学 角運動量の式変形が分かりません。 4 2022/08/03 21:04
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/17 18:41
- Excel(エクセル) エクセルのマクロについて教えてください。 1 2023/01/26 09:50
- 個人事業主・自営業・フリーランス 業務委託受託者は開業届を出すべきでしょうか? 4 2023/02/01 17:41
- その他(芸術・クラフト) カニを標本として保存する方法を教えて下さい! 1 2022/05/02 19:16
- 物理学 どうして放物線ですか? 15 2023/06/11 09:53
- TOEFL・TOEIC・英語検定 【英会話】[Would]を使った文章の和訳方法や使い方がなかなか理解出来ません。 理解出来ない例文 1 2022/08/08 13:04
- 物理学 長さaの軽い棒の各端に質量mの物体A,Bを取り付け、なめらかな床の上におき、これを棒の中点Oを中心と 2 2022/10/09 19:16
- 哲学 《日本における思想的座標軸》を問い求めておくことは 有効・有益ではないか? 30 2022/12/17 23:53
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~12/2】 国民的アニメ『サザエさん』が打ち切りになった理由を教えてください
- ・ちょっと先の未来クイズ第5問
- ・【お題】ヒーローの謝罪会見
- ・これが怖いの自分だけ?というものありますか?
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
LVM_SETITEMSTATEでListViewの...
-
大量のデータを読み込んで表示...
-
ボタンの複数割り当てについて
-
デバッグ中の変数参照について
-
[C#.net]スレッド化された別フ...
-
指定した座標の色を得るためには
-
struts2のchainで値の受け渡し...
-
C#で、あるクラスのメンバーす...
-
決められて時間が経過するとア...
-
C# 親フォームで指定した値を...
-
Jpanelにグラフを書くプ...
-
C# visibleプロパティをfalseに...
-
JButtonの画像をactionPerforme...
-
C#でのWNetAddConnection3の使...
-
VBAで配列の計算
-
ORA-01858: 数値を指定する箇所...
-
オブジェクトの中のプロパティ...
-
[JAVA]try 内の変数を外で!?
-
C言語のポインターに関する警告
-
IF関数でEmpty値を設定する方法。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
大量のデータを読み込んで表示...
-
C#で、あるクラスのメンバーす...
-
Junitテストでvoid戻り値メッソ...
-
C#でのWNetAddConnection3の使...
-
C# 矢印キーの取得
-
ボタンの複数割り当てについて
-
C# DataGridView列カスタマイズ
-
コンボボックスを使う時の警告
-
ユーザーコントロールを動的に...
-
アプレットでマウスイベントが...
-
C#で別のFormへ複数の値を返そ...
-
LVM_SETITEMSTATEでListViewの...
-
C#,listBoxのItem追加について...
-
C# MouseHoverを何度も呼ぶには
-
C# visibleプロパティをfalseに...
-
C# 親フォームで指定した値を...
-
C# 半角カナの文字化けについて
-
決められて時間が経過するとア...
-
javaを用いて,a列,b列の空白...
-
Processingでマウスクリックで...
おすすめ情報