回転する短形と四角形の当たり判定について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
エミリア

回転する短形と四角形の当たり判定について

#1

投稿記事 by エミリア » 5年前

現在アクションゲームを作っています。そこでボスの攻撃で薙ぎ払いビームを作っているのですが、
ビームとプレイヤーの当たり判定の考え方がわかりません。
プレイヤーは四角で判定を取るつもりです。
考え方やおすすめのサイトなどがあれば教えてください。

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 13年前
住所: 北海道札幌市
連絡を取る:

Re: 回転する短形と四角形の当たり判定について

#2

投稿記事 by Dixq (管理人) » 5年前

四角形と四角形の当たり判定を求めるとき、
四角形を2つの三角形だとして考え、
三角形と三角形の当たり判定を計算することで解決できます。
多角形はほぼすべて三角形がいくつか集まったものをみなせます。

https://www.google.com/search?q=%E4%B8% ... 4%E5%AE%9A

もし任意の四角形と円との当たり判定であれば、うちのサイトをご覧ください。
https://dixq.net/rp/34.html

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 13年前
住所: 北海道札幌市
連絡を取る:

Re: 回転する短形と四角形の当たり判定について

#3

投稿記事 by Dixq (管理人) » 5年前

ところで「短形」って「矩形(くけい)」のことを意味していますか?

アバター
usao
記事: 1887
登録日時: 11年前

Re: 回転する短形と四角形の当たり判定について

#4

投稿記事 by usao » 5年前

分離直線が存在するか否かを調べればよいのでは.
(矩形同士なら4*4の16本の線について調べれば良さそうだけど,計算量が多いかな?)

エミリア

Re: 回転する短形と四角形の当たり判定について

#5

投稿記事 by エミリア » 5年前

返信ありがとうございます。
短形じゃなくて矩形だったんですね。間違えて使ってました。
いくつか三角形の当たり判定のサイトを見てみましたが理解するのに結構時間がかかりそう…がんばります。

アバター
usao
記事: 1887
登録日時: 11年前

Re: 回転する短形と四角形の当たり判定について

#6

投稿記事 by usao » 5年前

とりあえず点の座標を表すこんなのがあったとして…

コード:

//2次元ベクトル
struct Vec
{
	Vec( double X=0, double Y=0 ) : X(X),Y(Y) {}
	Vec operator+( const Vec &rhs ) const {	return Vec( X+rhs.X, Y+rhs.Y );	}
	Vec operator-( const Vec &rhs ) const {	return Vec( X-rhs.X, Y-rhs.Y );	}
	void operator*=( double s ){	X*=s;	Y*=s;	}
	double Norm() const {	return sqrt( X*X + Y*Y );	}

	double X,Y;
};

//Z成分を0として3次元ベクトルとみなしたときの外積のZ成分
inline double CP( const Vec &lhs, const Vec &rhs ){	return  lhs.X*rhs.Y -lhs.Y*rhs.X;	}
矩形を4頂点の座標(Vec[4])で表すとき,当たり判定はこんな感じでどうでしょう?

コード:

//IsCollide()から使われる作業関数.
//A[iA]とB[iA]を通る直線がAとBを分離するかどうか調べる
bool DivisionCheck( const Vec (&A)[4], const Vec (&B)[4], int iA, int iB )
{
	Vec L = A[iA] - B[iB];
	if( L.Norm() <= std::numeric_limits<double>::epsilon() )return false;
	double Base = CP( A[ (iA+1)%4 ] - B[iB], L );
	for( int i=2; i<4; ++i )
	{
		if( Base * CP( A[ (iA+i)%4 ] - B[iB], L ) < 0 )return false;
	}
	for( int i=1; i<4; ++i )
	{
		if( Base * CP( B[ (iB+i)%4 ] - B[iB], L ) > 0 )return false;
	}
	return true;
}

//矩形Aと矩形Bとの間の当たり判定
bool IsCollide( const Vec (&A)[4], const Vec (&B)[4] )
{
	for( int iA=0; iA<4; ++iA )
	{
		for( int iB=0; iB<4; ++iB )
		{
			if( DivisionCheck( A,B, iA,iB ) )return false;
		}
	}
	return true;
}

返信

“C言語何でも質問掲示板” へ戻る