バグと題名に書いて騒ぎ立てて自分のミスだとお恥ずかしいのですが・・
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 ;
}