当り判定について

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

当り判定について

#1

投稿記事 by konacchi » 17年前

VC++6.0 DirextX9.0 Windows2000
D3DXVECTOR3 vStartPoint( 0, 0, 0);//Rayのスタートポイント
	D3DXVECTOR3 vEndPoint( 0, -1, 0);//Rayを伸ばす方向
	BOOL	bHit;//当り判定フラグ
	float	fDistance;//距離
	D3DXVECTOR3 vRayDir;//Rayを伸ばす角度
	
	///////m_MtrxMe-自機用マトリクス  LPD3DXMESH ppMesh-対象Mesh
	
	//*
			メッシュのロード、行列演算、描画、各種設定 省略
	*//
	
	//--------下RayとMeshの当り判定 
	D3DXVec3TransformCoord( &vStartPoint, &vStartPoint, &m_MtrxMe );
	D3DXVec3TransformCoord( &vEndPoint, &vEndPoint, &m_MtrxMe);
	D3DXVec3Subtract( &vRayDir, &vEndPoint, &vStartPoint);
	D3DXVec3Normalize( &vRayDir, &vRayDir );
	D3DXIntersect(ppMesh, &vStartPoint, &vRayDir, &bHit, NULL, NULL, NULL, &fDistance, NULL, NULL);
	if( bHit ){
		//-------------- 位置補正 ---------------//
		//省略
		//-------------- fDistance表示 ---------------//
		//省略
	}


いつも楽しく拝見させていただいております。
書き込むのは初めてで、プログラミングスキルも拙いので、
質問を巧く皆様に伝えられるかどうか不安ですが、質問させて頂きます。

ただいま上記のようにレイを使って自機とメッシュの当り判定を行っています。
当り判定もメッシュとの距離も希望通り取得する事ができています。

ですが、対象メッシュに移動行列、回転行列、拡大行列を演算すると、
当り判定がうまくいきません。

具体的には、

1.(0,0,0)
↓対象メッシュ移動
2.(10,10,10)
↓当り判定
1.との当り判定が返って来る。

以上の結果になります。
移動だけではなく、拡大、縮小、回転も同じ結果です。

移動、形が変わるものにレイ判定は使用しない方がよろしいでしょうか。
横長になったりもするのでバウンディングスフィアも適応し難いです。
凹凸があったりもしますのでバウンディングボックスも辛いです。

対象メッシュはマップみたいなものを想像していただけると良いかと思われます。
それが斜めになったり細長くなったり動いたりします。

任意で定めた仮座標
(例えば、対象メッシュの範囲内で10pixelごとからレイを飛ばす)
との当り判定だと、メッシュが大きくなったときとかも考慮すると重くなりそうで現実的ではないような・・・。
すべてのポリゴンとの判定もおなじ理由で難しそうです。

何か良い方法はありますでしょうか。
また、同じ理由で困っている人、困った事がある人はいませんか?

Justy

Re:当り判定について

#2

投稿記事 by Justy » 17年前

 D3DXIntersect()はメッシュのローカル座標で判定するので、
レイを飛ばすならレイの座標とベクトルをメッシュのローカル座標系のものに変換してから
使ってみて下さい。

御津凪

Re:当り判定について

#3

投稿記事 by 御津凪 » 17年前

前にやっていたもので、今は余り覚えていないのですが、
確か、カメラの逆行列を使って算出していたような気がします…。

konacchi

Re:当り判定について

#4

投稿記事 by konacchi » 17年前

Justy様<
ありがとうございます。
私の知識ではいきなりポンと変換できるようなものではなさそうなので色々調べてみます。
できるだけ早く帰ってきます。

御津凪様<
ありがとうございます。
どこかで聞いた事があるような気がします。
調べてみますね。

konacchi

Re:当り判定について

#5

投稿記事 by konacchi » 17年前

途中経過です。

// 視点を計算
m_vec3Eye.x = m_vec3MePos.x + 800 * sinf(m_fCameraAngle);
m_vec3Eye.z = m_vec3MePos.z + 800 * cosf(m_fCameraAngle);
m_vec3Eye.y = m_vec3MePos.y + 400;
// 注視点を計算
m_vec3At.x = m_vec3MePos.x;
m_vec3At.z = m_vec3MePos.z;
m_vec3At.y = m_vec3MePos.y;

//ビュー行列取得
D3DXMatrixLookAtLH(&m_LookAtCamera,&m_vec3Eye,&m_vec3At,&D3DXVECTOR3(0,1,0));

D3DXMATRIX m_LookAtCameraRev;//ビューの逆行列用
//逆行列生成
D3DXMatrixInverse(&m_LookAtCameraRev,NULL,&m_LookAtCamera);

逆行列を生成するところまではできました。
逆行列と自機行列を演算し、
その行列をレイのスタート地点と方向の両方にトランスフォームしました。

が、まだ希望する判定ではないです、訳判らない場所と判定してますので、
引き続き追います。
というよりも全然違う事やっているのかもしれません(苦笑

また進み次第報告致します。
時間がかかって申し訳ございません。

Justy

Re:当り判定について

#6

投稿記事 by Justy » 17年前

 メッシュの逆行列をレイのデータに与えればいいような気がしますが、
どうでしょう?

konacchi

Re:当り判定について

#7

投稿記事 by konacchi » 17年前

遅くなりましたが実装報告します。
D3DXMATRIX m_MtrxTemp;//一時格納
D3DXMATRIX m_MtrxTargetRev;//逆行列用
D3DXMATRIX m_MtrxTarget;//対象メッシュ用
D3DXMATRIX m_MtrxMe;//自機用
D3DXMATRIX m_MtrxRotX;//回転用
D3DXMATRIX m_MtrxScl;//拡大縮小用
D3DXMATRIX m_MtrxMove;//移動用
D3DXVECTOR3 vStartPoint = vec3MePos;//Rayのスタートポイントを自機に設定
D3DXVECTOR3 vEndPoint( 0, -1, 0);//Rayを伸ばす方向
BOOL	bHit;//当り判定フラグ
float	fDistance;//距離
D3DXVECTOR3 vRayDir;//Rayを伸ばす角度

//*
		メッシュのロード、描画、各種設定 省略
*//

vStartPoint = m_vec3MePos;
//回転行列生成
D3DXMatrixRotationX(&m_MtrxRotX, Rot*PI/180);
//スケール行列生成
D3DXMatrixScaling(&m_MtrxScl,Scl.x,Scl.y,Scl.z);
//移動行列生成
D3DXMatrixTranslation(&m_MtrxMove,Move.x,Move.y,Move.z);
m_MtrxTemp = m_MtrxScl * m_MtrxRotX *m_MtrxMove;//演算

//演算した行列をトランスフォーム
D3DXVec3TransformCoord( &vEndPoint, &vEndPoint, &m_MtrxTemp);
vEndPoint += vStartPoint;//方向決定

//対象メッシュの逆行列を取得
D3DXMatrixTranslation (&m_MtrxTarget,m_vec3Target.x,m_vec3Target.y,m_vec3Target.z);
D3DXMatrixInverse(&m_MtrxTargetRev,NULL,&m_MtrxTarget);
//逆行列をトランスフォーム
D3DXVec3TransformCoord( &vStartPoint, &vStartPoint, &m_MtrxTargetRev );
D3DXVec3TransformCoord( &vEndPoint, &vEndPoint, &m_MtrxTargetRev);

vRayDir = vEndPoint - vStartPoint;
//--------下RayとMeshの当り判定 
D3DXIntersect(ppMesh, &vStartPoint, &vRayDir, &bHit, NULL, NULL, NULL, &fDistance, NULL, NULL);
if( bHit ){
	//-------------- 位置補正 ---------------//
	//省略
	//-------------- fDistance表示 ---------------//
	//省略
}
正常に当り判定がとれました!!!
教えて頂きありがとうございます。

またお世話になると思いますが宜しくお願いします。
ちょいちょい雑談などにも横槍(笑)を入れていきたいと思います。


カメラの逆行列は ビルボードで使用するっぽいですね。
せっかくカメラの逆行列取得したのでビルボードも実装してみます。

konacchi

Re:当り判定について

#8

投稿記事 by konacchi » 17年前

↑記述忘れです。
Justy様の仰る通り、メッシュの逆行列で通りました。

あと解決マークも忘れてました・・・。

閉鎖

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