トップページ > 過去ログ > 記事閲覧
MV1CollCheck_Capsule関数のバグ?
名前:トルゥ 日時: 2011/02/19 14:22

バグと題名に書いて騒ぎ立てて自分のミスだとお恥ずかしいのですが・・ MV1CollCheck_Capsuleで取得した当たり判定結果ポリゴン配列構造体のHitPositonが必ず x=0.0f, y=0.0f, z=0.0f となってしまいます。 MV1CollCheck_Sphereに置き換えたところHitPositionを正しく取得し正常に動作しました。 以下サンプルプログラムです。 #include "DxLib.h" // カプセルの高さ #define CAPSULE_H 64.0f int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { ChangeWindowMode(TRUE); int ModelHandle ; int Add, y, i ; VECTOR CapsulePos1, CapsulePos2 ; MV1_COLL_RESULT_POLY_DIM HitPolyDim ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // 3Dモデルの読み込み ModelHandle = MV1LoadModel( "sample.mv1" ) ; // 3Dモデルを見える位置に移動する MV1SetPosition( ModelHandle, VGet( 320.0f, 300.0f, 600.0f ) ) ; // 描画先を裏画面に変更 SetDrawScreen( DX_SCREEN_BACK ) ; // モデル全体のコリジョン情報を構築 MV1SetupCollInfo( ModelHandle, -1, 8, 8, 8 ) ; // モデルの進行方向をセット Add = 8 ; // モデルの移動位置をセット y = 0 ; // ウインドウが閉じられるか何かキーが押されるまでループ while( ProcessMessage() == 0 && CheckHitKeyAll() == 0 ) { // 画面をクリア ClearDrawScreen() ; // 3Dモデルの移動位置を上下に移動させる y += Add ; if( y < 0 || y > 600 ) Add = -Add ; // 3Dモデルの描画 MV1DrawModel( ModelHandle ) ; // 当たり判定を行う球の位置をセット CapsulePos1 = VGet( 250.0f, y, 600.0f ) ; CapsulePos2 = VGet( 250.0f, y + CAPSULE_H, 600.0f ) ; // モデルとカプセルとの当たり判定 HitPolyDim = MV1CollCheck_Capsule( ModelHandle, -1, CapsulePos1, CapsulePos2, 100.0f ) ; //HitPolyDim = MV1CollCheck_Sphere( ModelHandle, -1, CapsulePos1, 100.0f ) ; // カプセルの描画 DrawCapsule3D( CapsulePos1, CapsulePos2, 100.0f, 8, GetColor( 255,255,0 ), GetColor( 255,255,255 ), FALSE ) ; // 当たったかどうかで処理を分岐 if( HitPolyDim.HitNum >= 1 ) { // 当たった場合は衝突の情報を描画する // 当たったポリゴンの数を描画 DrawFormatString( 0, 0, GetColor( 255,255,255 ), "Hit Poly Num %d", HitPolyDim.HitNum ) ; // 当たったポリゴンの数だけ繰り返し for( i = 0 ; i < HitPolyDim.HitNum ; i ++ ) { // 当たったポリゴンを描画 DrawTriangle3D( HitPolyDim.Dim[ i ].Position[ 0 ], HitPolyDim.Dim[ i ].Position[ 1 ], HitPolyDim.Dim[ i ].Position[ 2 ], GetColor( 0,255,255 ), TRUE ) ; DrawFormatString( 0, (i+1)*32, GetColor( 255,255,255 ), "x=%f, y=%f ,z=%f", HitPolyDim.Dim[ i ].HitPosition.x, HitPolyDim.Dim[ i ].HitPosition.y, HitPolyDim.Dim[ i ].HitPosition.z) ; } } // 当たり判定情報の後始末 MV1CollResultPolyDimTerminate( HitPolyDim ) ; // 裏画面の内容を表画面に反映 ScreenFlip() ; } // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }

Page: 1 |

Re: MV1CollCheck_Capsule関数のバグ? ( No.1 )
名前:いっち 日時:2011/02/19 20:29

"sample.mv1"をご提供いただけますか?
Re: MV1CollCheck_Capsule関数のバグ? ( No.2 )
名前:トルゥ 日時:2011/02/19 23:03

サンプルはただの平面であります。 tp://www.kent-web.com/pubc/book/test/uploader/uploader.cgi?mode=pwdwin&no=3822 pass:dx
Re: MV1CollCheck_Capsule関数のバグ? ( No.3 )
名前:いっち 日時:2011/02/20 00:42

リファレンスの MV1CollCheck_Capsule の項(://homepage2.nifty.com/natupaji/DxLib/function/dxfunc_3d.html#R9N8)では > // コリジョン結果代入用ポリゴン > struct MV1_COLL_RESULT_POLY > (略) > // 無効です > VECTOR HitPosition ; と、あるので HitPosition の値がすべて 0 であるのは仕様だと思います。
Re: MV1CollCheck_Capsule関数のバグ? ( No.4 )
名前:トルゥ(解決) 日時:2011/02/20 09:26

そういうことでしたか。自身の確認不足でした。 ご回答ありがとうございます。

Page: 1 |