![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?a65a0e2)
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を探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・「これはヤバかったな」という遅刻エピソード
- ・初めて自分の家と他人の家が違う、と意識した時
- ・いちばん失敗した人決定戦
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
大量のデータを読み込んで表示...
-
C#でのWNetAddConnection3の使...
-
C#で、あるクラスのメンバーす...
-
ユーザーコントロールを動的に...
-
C#でのオブジェクトのコピーに...
-
C#でキーイベントが発生しない...
-
プログラミング(Java)じゃん...
-
C#で別のFormへ複数の値を返そ...
-
Visual C♯ フォーム間での値の...
-
C# 親フォームで指定した値を...
-
[C#.net]スレッド化された別フ...
-
C# 半角カナの文字化けについて
-
C# WinForm のDataGridView Cel...
-
SortedSetならぬSortedListの良...
-
マルチスレッドプログラムから...
-
JSPやサーブレットでSystem.out...
-
IF関数でEmpty値を設定する方法。
-
System.err. printlnとSystem.o...
-
getStringの値がNULLの時の処理
-
ORA-01858: 数値を指定する箇所...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
大量のデータを読み込んで表示...
-
C#でのWNetAddConnection3の使...
-
C#で、あるクラスのメンバーす...
-
C# visibleプロパティをfalseに...
-
Junitテストでvoid戻り値メッソ...
-
C#で別のFormへ複数の値を返そ...
-
ボタンの複数割り当てについて
-
C#でキーイベントが発生しない...
-
Processingでマウスクリックで...
-
C# DataGridView列カスタマイズ
-
C# 矢印キーの取得
-
ユーザーコントロールを動的に...
-
エンターキーを押すとOKボタン...
-
ボタンのイベントで異なるウィ...
-
C# 半角カナの文字化けについて
-
javaアプレット repaintのタイ...
-
JScrollPaneで、表示がおかしく...
-
デスクトップマスコットのドラ...
-
未割り当てのローカル変数
-
[C#.net]スレッド化された別フ...
おすすめ情報