トップページ > 過去ログ > 記事閲覧
MV1CollCheck_Capsule()の衝突判定
名前:トム 日時: 2010/06/10 01:12

VC++でDXライブラリを使用しています。 MV1CollCheck_Capsule()で、モデルとカプセルが 明らかに衝突しているのにそう判定されない場合があります。 プログラムは、以下の通りです。 ------------------------------------------------------------------------------ #include "DxLib.h" static const float CoLineLength = 200.0f; // 軸の下のカプセルの長さ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { // ウインドウモードに変更 ChangeWindowMode(TRUE); // DXライブラリの初期化 // ・後始末をする必要がある if(DxLib_Init() < 0) { // エラーが発生したら直ちに終了 return -1 ; } // 描画先を裏画面に変更 SetDrawScreen(DX_SCREEN_BACK); // 3Dモデルの読み込み // ・後始末をする必要がある int ModelHandle_Jiku = MV1LoadModel("Jiku.mqo"); int ModelHandle_Ground = MV1LoadModel("Ground.mqo"); // 衝突判定が正しくされる MV1SetPosition(ModelHandle_Ground, VGet(0.0f, 0.0f, 0.0f)); // モデルのコリジョン情報を構築 // ・後始末をする必要がある MV1SetupCollInfo( ModelHandle_Ground, // モデルのハンドル -1, // コリジョンの情報を構築するフレームの番号 8, // コリジョン情報のX軸方向の空間分割数 8, // コリジョン情報のY軸方向の空間分割数 8 // コリジョン情報のZ軸方向の空間分割数 ); // 軸の座標を初期化 VECTOR JikuPos = VGet(0.0f, 150.0f, 0.0f); // ESCキーが押されるかウインドウが閉じられるまでループ while ((ProcessMessage() == 0) && (CheckHitKey(KEY_INPUT_ESCAPE) == 0)) { // 画面をクリア ClearDrawScreen() ; // キー入力とパッド1の入力状態を得る int PadData = GetJoypadInputState(DX_INPUT_KEY_PAD1); // 軸の移動 { // 上? if(PadData & PAD_INPUT_UP) { JikuPos.z += 2.0f; } // 下? else if(PadData & PAD_INPUT_DOWN) { JikuPos.z -= 2.0f; } // 左? if (PadData & PAD_INPUT_LEFT) { JikuPos.x -= 2.0f; } // 右? else if (PadData & PAD_INPUT_RIGHT) { JikuPos.x += 2.0f; } // R? if(PadData & PAD_INPUT_R) { JikuPos.y += 2.0f; } // L? else if(PadData & PAD_INPUT_L) { JikuPos.y -= 2.0f; } } // カメラ Set { VECTOR CameraEyePos, CameraAtPos; CameraAtPos = JikuPos; CameraEyePos.x = CameraAtPos.x; CameraEyePos.y = CameraAtPos.y + 400.0f; CameraEyePos.z = CameraAtPos.z - 800.0f; // SetCameraPositionAndTarget_UpVecY(CameraEyePos, CameraAtPos); } // Zバッファを有効にする SetUseZBuffer3D(TRUE); // Zバッファへの書き込みを有効にする SetWriteZBuffer3D(TRUE); // 地面のモデル { // 3Dモデルの描画 MV1DrawModel(ModelHandle_Ground); } // 軸のモデル { MV1SetPosition( ModelHandle_Jiku, JikuPos); // 3Dモデルの描画 MV1DrawModel(ModelHandle_Jiku); } // 衝突判定 { VECTOR StartPos, EndPos; StartPos = EndPos = JikuPos; EndPos.y -= CoLineLength; VECTOR CapsulePos1 = JikuPos; VECTOR CapsulePos2 = JikuPos; CapsulePos2.y -= CoLineLength; const float CapsuleR = 10.0f; // モデルとカプセルとの当たり判定 MV1_COLL_RESULT_POLY_DIM HitPolyDim = MV1CollCheck_Capsule( ModelHandle_Ground, // モデルのハンドル -1, // コリジョンの情報を更新するフレームの番号 CapsulePos1, CapsulePos2, CapsuleR ); // 当たったポリゴンの数を描画 DrawFormatString(0, 0, GetColor( 255,255,255 ), "Hit Poly:%d個", HitPolyDim.HitNum); // カプセルの描画 DrawCapsule3D( CapsulePos1, CapsulePos2, CapsuleR, 8, GetColor( 255,255,0 ), GetColor( 255,255,255 ), TRUE ); // 当たったかどうかで処理を分岐 if(HitPolyDim.HitNum >= 1) { int LineColor = GetColor(255,0,0); for (int i = 0; i < HitPolyDim.HitNum; i++) { MV1_COLL_RESULT_POLY* pCollResultPoly = &HitPolyDim.Dim[i]; VECTOR Pos0 = pCollResultPoly->Position[0]; VECTOR Pos1 = pCollResultPoly->Position[1]; VECTOR Pos2 = pCollResultPoly->Position[2]; // ちょっと持ち上げて重ならないようにする VECTOR SlideVec = VScale(pCollResultPoly->Normal, 0.5f); Pos0 = VAdd(Pos0, SlideVec); Pos1 = VAdd(Pos1, SlideVec); Pos2 = VAdd(Pos2, SlideVec); // ワイヤーフレーム描画 DrawLine3D(Pos0, Pos1, LineColor); DrawLine3D(Pos1, Pos2, LineColor); DrawLine3D(Pos2, Pos0, LineColor); } } // 当たり判定情報の後始末 MV1CollResultPolyDimTerminate(HitPolyDim); } // 裏画面の内容を表画面に反映 ScreenFlip(); } // コリジョン情報の後始末 MV1TerminateCollInfo(ModelHandle_Ground, -1); // モデルの後始末 MV1DeleteModel(ModelHandle_Jiku); MV1DeleteModel(ModelHandle_Ground); // DXライブラリの後始末 DxLib_End(); // ソフトの終了 return 0; } ------------------------------------------------------------------------------ カーソルキーの左右でカプセルを移動すると衝突しない場所があります。 ケアレスミスか設定ミスでないか、何度も確認しているのですが 自分ではわかりません。 Ver3.02eを使っています。 よろしくお願いします。

Page: 1 |

Re: MV1CollCheck_Capsule()の衝突判定 ( No.1 )
名前:トム 日時:2010/06/10 01:29

プログラムとモデルファイルを下記の場所にあげました。 ttp://www1.axfc.net/uploader/Sc/so/122247.lzh よろしくお願いします。
Re: MV1CollCheck_Capsule()の衝突判定 ( No.2 )
名前:管理人 日時:2010/06/13 03:29

ご報告&検証用ファイルのアップありがとうございます 早速試してみたのですが、明らかに衝突しているのに衝突が検出されないという現象は確認できませんでした もしかしたら Ver3.02e からの短期間ではありますが現在の手元のバージョンでは修正されているかもしれませんので、 よろしければこちらのバージョンをお使いになってみてください m(_ _)m http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe // VisualC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe // BorlandC++ 用 (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』、VCをお使いの場合は『リビルド』をして下さい) あと、もしこちらのバージョンでも同様の現象が発生しましたら、よろしければそのときの JikuPos の値を 教えていただけないでしょうか?
Re: MV1CollCheck_Capsule()の衝突判定 ( No.3 )
名前:いっち 日時:2010/06/14 00:48

トムさんではありませんが、問題となっているであろう部分のスクリーンショットを取ってみました。 傾きのあるポリゴンとカプセル型の円筒部分との当たり判定が取れていないように見受けられます。 > ttp://nukkorosu.80code.com/img/nukkorosu14726.png > ttp://www1.axfc.net/uploader/Sc/so/123618.lzh&key=DxLib (その他のスクリーンショットをまとめたものです) テストにはDxLib Ver 3.02f 6/13ぐらい版を利用しました。 以下のスレッドと似たような(逆?)感じでしょうか? > ttp://hpcgi2.nifty.com/natupaji/bbs/patio.cgi?mode=view&no=1751
Re: MV1CollCheck_Capsule()の衝突判定 ( No.4 )
名前:管理人 日時:2010/06/15 02:14

いっちさんご情報ありがとうございます そして、トムさんいっちさん、申し訳ありませんでした トムさんが以前アップしてくださったモデルファイルで検証用プログラムを実行していました orz 改めて今回トムさんがアップしてくださったモデルファイルで試してみたところ 私の環境でも件の現象が再現しました カプセルに対して斜めのポリゴンにカプセルの軸となる線分が貫通している場合に 当たっていないという判定がされていたようです 修正版をアップしましたので、よろしければお試し下さい http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe // VisualC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe // BorlandC++ 用 (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』、VCをお使いの場合は『リビルド』をして下さい) バグばかりで申し訳ありません m(_ _;m
Re: MV1CollCheck_Capsule()の衝突判定 ( No.5 )
名前:トム(解決) 日時:2010/06/15 21:53

管理人さん、いっちさん、どうもありがどうございます。 修正版で問題がない事を確認しました。

Page: 1 |