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を使っています。
よろしくお願いします。