何時もお世話になっております。
コリジョンについての仕様確認をさせていただきたく質問いたします。
自分は当初、コリジョンに関するリファレンスを読んだ上での解釈としては、
MV1SetupCollInfoが呼ばれない限り、そのモデルにはコリジョンは発生しない物と解釈しておりました。
しかし、下記コードを行った結果、MV1SetupCollInfoを行わなくてもコリジョンは発生している事を確認しました。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle;
int Mx, My;
VECTOR StartPos, EndPos;
MV1_COLL_RESULT_POLY HitPoly;
ChangeWindowMode( TRUE );
if ( DxLib_Init() < 0 ) return -1;
ModelHandle = MV1LoadModel( "SimpleModel.mqo" );
MV1SetPosition( ModelHandle, VGet( 320.0f, 300.0f, 600.0f ) );
SetDrawScreen( DX_SCREEN_BACK );
while ( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ) {
ClearDrawScreen();
MV1DrawModel( ModelHandle );
// マウス座標から線分始点・終点座標取得
GetMousePoint( &Mx, &My );
StartPos = ConvScreenPosToWorldPos( VGet( Mx, My, 0.0f ) );
EndPos = ConvScreenPosToWorldPos( VGet( Mx, My, 1.0f ) );
// 線分当り判定処理
HitPoly = MV1CollCheck_Line( ModelHandle, -1, StartPos, EndPos );
// 情報描画処理
if( HitPoly.HitFlag == 1 ){
DrawString( 0, 0, "Hit", GetColor( 255, 255, 255 ) );
DrawFormatString( 0, 40, GetColor( 255,255,255 ), "Hit Pos %f %f %f",
HitPoly.HitPosition.x, HitPoly.HitPosition.y, HitPoly.HitPosition.z );
DrawFormatString( 0, 60, GetColor( 255,255,255 ), "Frame %d", HitPoly.FrameIndex );
DrawFormatString( 0, 80, GetColor( 255,255,255 ), "Material %d", HitPoly.MaterialIndex );
}else{
DrawString( 0, 0, "No Hit", GetColor( 255, 255, 255 ) );
}
ScreenFlip();
}
DxLib_End();
return 0 ;
}
上記のコードはリファレンスのConvScreenPosToWorldPos関数に記載されている
サンプルコードに手を加えた物で、MV1SetupCollInfoを呼出していません。
以上の結果から考えられる事は、
1.MV1LoadModelされたモデルはMV1SetupCollInfoを行う、行わないに関わらず、
なんらかのデフォルト値でコリジョン情報を持っている。
2.もしくは、MV1SetupCollInfoを行っていないにも関わらず、
MV1CollCheck_Lineで当り判定処理を行おうとした為、
何らかのデフォルト値をもったコリジョン情報が自動生成された。
仮に1が真である場合、
MV1SetupCollInfoは適切な当り判定を行うための空間分割を設定する為の物であり、
コリジョン情報の有無に関与しない。
このような解釈をしたのですが、合っていますでしょうか?
これが仕様通りなのかどうかも含め、何方かお詳しい方がいらっしゃいましたら
お答えいただけますよう、よろしくお願いします。
上記テストコードはDxLib 3.05と3.05fで確認を行った物です。