四角で縦横64,64px同士の当たり判定で100動いた時にすり抜けしまうバグを修正するためにベクトルの外積を使って回避するコードを組みたいです。困っているのは
1、ブロック(64,64)の座標をどうやって手に入れるか?
2、参考サイトの真ん中より下の方のスライドの[4っの端点に対して、線分のどちら側にあるのかを判定すればいい]スライド部の
ベクトル外積を計算して掛け算していますがこれを "プログラム上"でどうすればいいかわかりません。
(AB×AC)*(AB× AD) <= 0.0 &&
(CD×CA)*(CD× CB) <= 0.0
3、止まっている物体とプレイヤーの場合止まっている物体のベクトルの向きはどの向きにすればいいのか?
この場合はc Dの点線分ベクトルがブロックの場合は?
4、提示コードは調べて出てきたものなのですがこれはスライドの計算をプログラム上で計算していると思われるのですがなぜ真ん中で足し算しているのでしょうか?外積のクロス式を見ると - していますが(スライド上部)
追記 提示コードのネットから拾った版と自作版とで少し処理の書き方違うのですがこれはなぜでしょうか?
また自分が作った自作版の処理は正しいのでしょうか?
参考サイト: http://www.zengeren.com/content/data/05/05_2DCollision.pdf
using System; namespace ConsoleApp3 { class Program { class Position { public float x; public float y; public Position(float xx = 0.0f,float yy = 0.0f) { x = xx; y = yy; } } //ネットから拾った。 static bool vec_test(float ax,float ay,float bx,float by,float cx,float cy,float dx,float dy) { var ta = (cx - dx) * (ay - cy) + (cy - dy) * (cx - ax); var tb = (cx - dx) * (by - cy) + (cy - dy) * (cx - bx); var tc = (ax - bx) * (cy - ay) + (ay - by) * (ax - cx); var td = (ax - bx) * (dy - ay) + (ay - by) * (ax - dx); Console.WriteLine("a: " + tc * td); Console.WriteLine("b: " + ta * tb); if(tc * td <= 0.0f && ta * tb <= 0.0f) { return true; } else { return false; } } /*自作版*/ /*高速の当たり判定に対応した版*/ static bool cross_col(Position A,Position B,Position C,Position D) { Position AB,AC,AD,CA,CD,CB; AB = new Position(); AC = new Position(); AD = new Position(); CA = new Position(); CD = new Position(); CB = new Position(); /*線分を作る*/ AB.x = B.x - A.x; AB.y = B.y - A.y; AC.x = C.x - A.x; AC.y = C.y - A.y; AD.x = D.x - A.x; AD.y = D.y - A.y; CA.x = A.x - C.x; CA.y = A.y - C.y; CD.x = D.x - C.x; CD.y = D.y - C.y; CB.x = B.x - C.x; CB.y = B.y - C.y; /*ベクトル外積の公式 (A x B) = x0 * y1 - x1 * y0 */ float AB_AC = (AB.x * AC.y) - (AC.x * AB.y); float AB_AD = (AB.x * AD.y) - (AD.x * AB.y); float CD_CA = (CD.x * CA.y) - (CA.x * CD.y); float CD_CB = (CD.x * CB.y) - (CB.x * CD.y); float a = AB_AC * AB_AD; float b = CD_CA * CD_CB; Console.WriteLine("a: " + a); Console.WriteLine("b: " + b); if(a <= 0.0 != b <= 0.0) { return true; }else{ return false; } } static void Main(string[] args) { Position a = new Position(); Position b = new Position(); Position c = new Position(); Position d = new Position(); Console.Write("a.x: "); a.x = int.Parse(Console.ReadLine()); Console.Write("a.y: "); a.y = int.Parse(Console.ReadLine()); Console.WriteLine(); Console.Write("b.x: "); b.x = int.Parse(Console.ReadLine()); Console.Write("b.y: "); b.y = int.Parse(Console.ReadLine()); Console.WriteLine(); Console.Write("c.x: "); c.x = int.Parse(Console.ReadLine()); Console.Write("c.y: "); c.y = int.Parse(Console.ReadLine()); Console.WriteLine(); Console.Write("d.x: "); d.x = int.Parse(Console.ReadLine()); Console.Write("d.y: "); d.y = int.Parse(Console.ReadLine()); Console.WriteLine(); if(cross_col(a,b,c,d) == true) { Console.WriteLine("交差します。!"); }else{ Console.WriteLine("交差していません"); } Console.WriteLine(); Console.WriteLine(); Console.WriteLine("以下ネットのコピペ版"); if(vec_test(a.x,a.y,b.x,b.y,c.x,c.y,d.x,d.y) == true) { Console.WriteLine("交差しています。"); } else { Console.WriteLine("交差しています。"); } } } }
回答2件
あなたの回答
tips
プレビュー