メッシュ関係

宣言int MV1GetMeshNum( int MHandle ) ;

概略モデルに含まれるメッシュの数を取得する

引数 int MHandle : モデルのハンドル
戻り値0以上:モデルに含まれるメッシュの数
 -1:エラー発生

解説  MHandle のモデルハンドルが示すモデルに含まれるメッシュの数を取得します。

サンプル

  モデルファイル DxChara.x に含まれるメッシュの情報を表示します。

Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int ModelHandle, MeshNum, i ; VECTOR Position ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // 3Dモデルの読み込み ModelHandle = MV1LoadModel( "DxChara.x" ) ; // モデルに含まれるメッシュの数を取得する MeshNum = MV1GetMeshNum( ModelHandle ) ; // メッシュの数だけループ for( i = 0 ; i < MeshNum ; i ++ ) { // 画面をクリア ClearDrawScreen() ; // メッシュが使用しているマテリアルの描画 DrawFormatString( 0, 0, GetColor( 255,255,255 ), "Material %d", MV1GetMeshMaterial( ModelHandle, i ) ) ; // メッシュに含まれる三角形ポリゴンの数を描画 DrawFormatString( 0, 16, GetColor( 255,255,255 ), "Triangle Polygon Num %d", MV1GetMeshTriangleNum( ModelHandle, i ) ) ; // メッシュの表示・非表示状態を描画 DrawFormatString( 0, 32, GetColor( 255,255,255 ), "Visible %d", MV1GetMeshVisible( ModelHandle, i ) ) ; // メッシュに半透明要素があるかどうかを描画 DrawFormatString( 0, 48, GetColor( 255,255,255 ), "Semi Trans State %d", MV1GetMeshSemiTransState( ModelHandle, i ) ) ; // メッシュがバックカリングを行うかどうかを描画 DrawFormatString( 0, 64, GetColor( 255,255,255 ), "Back Culling %d", MV1GetMeshBackCulling( ModelHandle, i ) ) ; // メッシュの頂点ディフューズカラーを使用するかどうかを描画 DrawFormatString( 0, 80, GetColor( 255,255,255 ), "Use Vertex Dif Color %d", MV1GetMeshUseVertDifColor( ModelHandle, i ) ) ; // メッシュの頂点スペキュラカラーを使用するかどうかを描画 DrawFormatString( 0, 96, GetColor( 255,255,255 ), "Use Vertex Spc Color %d", MV1GetMeshUseVertSpcColor( ModelHandle, i ) ) ; // メッシュに含まれる頂点のローカル座標の最大座標値を描画 Position = MV1GetMeshMaxPosition( ModelHandle, i ) ; DrawFormatString( 0, 112, GetColor( 255,255,255 ), "Max Position x %f y %f z %f", Position.x, Position.y, Position.z ) ; // メッシュに含まれる頂点のローカル座標の最小座標値を描画 Position = MV1GetMeshMinPosition( ModelHandle, i ) ; DrawFormatString( 0, 128, GetColor( 255,255,255 ), "Min Position x %f y %f z %f", Position.x, Position.y, Position.z ) ; // キーの入力待ち WaitKey() ; } // モデルハンドルの削除 MV1DeleteModel( ModelHandle ) ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言int MV1GetMeshMaterial( int MHandle, int MeshIndex ) ;

概略メッシュが使用しているマテリアルの番号を取得する

引数 int MHandle : モデルのハンドル
int MeshIndex : メッシュの番号
戻り値0以上:マテリアルの番号
 -1:エラー発生

解説  MHandle のモデルハンドルが示すモデルの指定のメッシュで使用されているマテリアルの番号を取得します。

サンプル

 MV1GetMeshNum関数 のサンプルを参照してください。



宣言int MV1GetMeshTriangleNum( int MHandle, int MeshIndex ) ;

概略メッシュに含まれる三角形ポリゴンの数を取得する

引数 int MHandle : モデルのハンドル
int MeshIndex : メッシュの番号
戻り値0以上:三角形ポリゴンの数
 -1:エラー発生

解説  MHandle のモデルハンドルが示すモデルの指定のメッシュに含まれる三角形ポリゴンの数を取得します。

サンプル

 MV1GetMeshNum関数 のサンプルを参照してください。



宣言int MV1SetMeshVisible( int MHandle, int MeshIndex, int VisibleFlag ) ;

概略メッシュの表示・非表示状態を変更する

引数 int MHandle : モデルのハンドル
int MeshIndex : メッシュの番号
int VisibleFlag : 変更後の表示状態( TRUE:表示 FALSE:非表示 )
戻り値 0:成功
 -1:エラー発生

解説  MHandle のモデルハンドルが示すモデルの指定のメッシュの表示状態を変更します。

 VisibleFlag を FALSE にした場合、MV1DrawModel 等の描画関数を呼んでも描画されなくなります。

サンプル

  モデルファイル DxChara.x に含まれる1番目のメッシュを非表示にして描画します。

Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int ModelHandle ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // 3Dモデルの読み込み ModelHandle = MV1LoadModel( "DxChara.x" ) ; // 画面に映る位置に3Dモデルを移動 MV1SetPosition( ModelHandle, VGet( 320.0f, -300.0f, 600.0f ) ) ; // 1番のメッシュの表示状態を「非表示」にする MV1SetMeshVisible( ModelHandle, 1, FALSE ) ; // 3Dモデルの描画 MV1DrawModel( ModelHandle ) ; // モデルハンドルの削除 MV1DeleteModel( ModelHandle ) ; // キーの入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言int MV1GetMeshVisible( int MHandle, int MeshIndex ) ;

概略メッシュの表示・非表示状態を取得する

引数 int MHandle : モデルのハンドル
int MeshIndex : メッシュの番号
戻り値0以上:メッシュの表示状態( TRUE:表示 FALSE:非表示 )
 -1:エラー発生

解説  MHandle のモデルハンドルが示すモデルの指定のメッシュの表示状態を取得します。

サンプル

 MV1GetMeshNum関数 のサンプルを参照してください。



宣言int MV1SetMeshDifColorScale( int MHandle, int MeshIndex, COLOR_F Scale ) ;

概略フレームのディフューズカラーのスケール値を設定する

引数 int MHandle : モデルのハンドル
int MeshIndex : メッシュの番号
COLOR_F Scale : スケール値( 各色 0.0f ~ 1.0f )
戻り値 0:成功
 -1:エラー発生

解説  MHandle のモデルハンドルが示すモデルの指定のメッシュを描画する際に行うマテリアルのディフューズカラーに対するスケーリングの値を設定します。

 モデル中の一部分だけ色を変えたい場合などに使用します。

サンプル

  モデルファイル SimpleModel.mqo に含まれる0番のメッシュのディフューズカラーを赤にします。

Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int ModelHandle ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // 3Dモデルの読み込み ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ; // 画面に映る位置に3Dモデルを移動 MV1SetPosition( ModelHandle, VGet( 320.0f, 300.0f, 600.0f ) ) ; // 0番のメッシュのディフューズカラーを赤にする MV1SetMeshDifColorScale( ModelHandle, 0, GetColorF( 1.0f, 0.0f, 0.0f, 1.0f ) ) ; // 3Dモデルの描画 MV1DrawModel( ModelHandle ) ; // モデルハンドルの削除 MV1DeleteModel( ModelHandle ) ; // キーの入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言COLOR_F MV1GetMeshDifColorScale( int MHandle, int MeshIndex ) ;

概略メッシュのディフューズカラーのスケール値を取得する

引数 int MHandle : モデルのハンドル
int MeshIndex : メッシュ番号
戻り値メッシュのディフューズカラーのスケール値

解説  MHandle のモデルハンドルが示すモデルの指定のメッシュを描画する際に行うマテリアルのディフューズカラーに対するスケーリングの値を取得します。

 MV1SetMeshDifColorScale 関数で設定された値をそのまま返すだけの関数です。

サンプル

ありません



宣言int MV1SetMeshSpcColorScale( int MHandle, int MeshIndex, COLOR_F Scale ) ;

概略フレームのスペキュラカラーのスケール値を設定する

引数 int MHandle : モデルのハンドル
int MeshIndex : メッシュの番号
COLOR_F Scale : スケール値( 各色 0.0f ~ 1.0f )
戻り値 0:成功
 -1:エラー発生

解説  MHandle のモデルハンドルが示すモデルの指定のメッシュを描画する際に行うマテリアルのスペキュラカラーに対するスケーリングの値を設定します。

 モデル中の一部分だけ色を変えたい場合などに使用します。

サンプル

  モデルファイル DxChara.x に含まれる1番のメッシュのスペキュラカラーを緑にします。

Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int ModelHandle ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // 3Dモデルの読み込み ModelHandle = MV1LoadModel( "DxChara.x" ) ; // 画面に映る位置に3Dモデルを移動 MV1SetPosition( ModelHandle, VGet( 320.0f, -300.0f, 600.0f ) ) ; // 1番のメッシュのスペキュラカラーを緑にする MV1SetMeshSpcColorScale( ModelHandle, 1, GetColorF( 0.0f, 1.0f, 0.0f, 0.0f ) ) ; // 3Dモデルの描画 MV1DrawModel( ModelHandle ) ; // モデルハンドルの削除 MV1DeleteModel( ModelHandle ) ; // キーの入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言COLOR_F MV1GetMeshSpcColorScale( int MHandle, int MeshIndex ) ;

概略メッシュのスペキュラカラーのスケール値を取得する

引数 int MHandle : モデルのハンドル
int MeshIndex : メッシュ番号
戻り値メッシュのスペキュラカラーのスケール値

解説  MHandle のモデルハンドルが示すモデルの指定のメッシュを描画する際に行うマテリアルのスペキュラカラーに対するスケーリングの値を取得します。

 MV1SetMeshSpcColorScale 関数で設定された値をそのまま返すだけの関数です。

サンプル

ありません



宣言int MV1SetMeshEmiColorScale( int MHandle, int MeshIndex, COLOR_F Scale ) ;

概略フレームのエミッシブカラーのスケール値を設定する

引数 int MHandle : モデルのハンドル
int MeshIndex : メッシュの番号
COLOR_F Scale : スケール値( 各色 0.0f ~ 1.0f )
戻り値 0:成功
 -1:エラー発生

解説  MHandle のモデルハンドルが示すモデルの指定のメッシュを描画する際に行うマテリアルのエミッシブカラーに対するスケーリングの値を設定します。

 モデル中の一部分だけ色を変えたい場合などに使用します。

サンプル

  モデルファイル SimpleModel.mqo に含まれる1番のメッシュのエミッシブカラーを青にします。

Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int ModelHandle ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // 3Dモデルの読み込み ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ; // 画面に映る位置に3Dモデルを移動 MV1SetPosition( ModelHandle, VGet( 320.0f, 300.0f, 600.0f ) ) ; // 1番のメッシュのエミッシブカラーを青にする MV1SetMeshEmiColorScale( ModelHandle, 1, GetColorF( 0.0f, 0.0f, 1.0f, 1.0f ) ) ; // 3Dモデルの描画 MV1DrawModel( ModelHandle ) ; // モデルハンドルの削除 MV1DeleteModel( ModelHandle ) ; // キーの入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言COLOR_F MV1GetMeshEmiColorScale( int MHandle, int MeshIndex ) ;

概略メッシュのエミッシブカラーのスケール値を取得する

引数 int MHandle : モデルのハンドル
int MeshIndex : メッシュ番号
戻り値メッシュのエミッシブカラーのスケール値

解説  MHandle のモデルハンドルが示すモデルの指定のメッシュを描画する際に行うマテリアルのエミッシブカラーに対するスケーリングの値を取得します。

 MV1SetMeshEmiColorScale 関数で設定された値をそのまま返すだけの関数です。

サンプル

ありません



宣言int MV1SetMeshAmbColorScale( int MHandle, int MeshIndex, COLOR_F Scale ) ;

概略フレームのアンビエントカラーのスケール値を設定する

引数 int MHandle : モデルのハンドル
int MeshIndex : メッシュの番号
COLOR_F Scale : スケール値( 各色 0.0f ~ 1.0f )
戻り値 0:成功
 -1:エラー発生

解説  MHandle のモデルハンドルが示すモデルの指定のメッシュを描画する際に行うマテリアルのアンビエントカラーに対するスケーリングの値を設定します。

 モデル中の一部分だけ色を変えたい場合などに使用します。

サンプル

  モデルファイル SimpleModel.mqo に含まれる3番のメッシュのアンビエントカラーを黄色にします。

Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int ModelHandle ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // 3Dモデルの読み込み ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ; // 画面に映る位置に3Dモデルを移動 MV1SetPosition( ModelHandle, VGet( 320.0f, 300.0f, 600.0f ) ) ; // 3番のメッシュのアンビエントカラーを黄色にする MV1SetMeshAmbColorScale( ModelHandle, 3, GetColorF( 0.0f, 0.0f, 1.0f, 1.0f ) ) ; // 3Dモデルの描画 MV1DrawModel( ModelHandle ) ; // モデルハンドルの削除 MV1DeleteModel( ModelHandle ) ; // キーの入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言COLOR_F MV1GetMeshAmbColorScale( int MHandle, int MeshIndex ) ;

概略メッシュのアンビエントカラーのスケール値を取得する

引数 int MHandle : モデルのハンドル
int MeshIndex : メッシュ番号
戻り値メッシュのアンビエントカラーのスケール値

解説  MHandle のモデルハンドルが示すモデルの指定のメッシュを描画する際に行うマテリアルのアンビエントカラーに対するスケーリングの値を取得します。

 MV1SetMeshAmbColorScale 関数で設定された値をそのまま返すだけの関数です。

サンプル

ありません



宣言int MV1SetMeshOpacityRate( int MHandle, int MeshIndex, float Rate ) ;

概略メッシュの不透明度を設定する

引数 int MHandle : モデルのハンドル
int MeshIndex : メッシュの番号
float Rate : 不透明度( 0.0f ~ 1.0f )
戻り値 0:成功
 -1:エラー発生

解説  MHandle のモデルハンドルが示すモデルの指定のメッシュの不透明度を設定します。

 Rate の値が 0.0f に近いほど不透明度が下がり( 透明度が上がり )、 1.0f に近いほど不透明度が上がり( 透明度が下がり )ます。
 モデルの一部のメッシュを半透明で表示したかったり、だんだん透明になって消えていくなどの演出をしたい場合に使用します。

サンプル

  モデルファイル SimpleModel.mqo の0番目のメッシュの不透明度を50%にして描画します。

Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int ModelHandle ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // 3Dモデルの読み込み ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ; // 透明で描画されているということが分かるように画面全体を赤で塗りつぶす DrawBox( 0, 0, 640, 480, GetColor( 255,0,0 ), TRUE ) ; // 画面に映る位置に3Dモデルを移動 MV1SetPosition( ModelHandle, VGet( 320.0f, 100.0f, 600.0f ) ) ; // 3Dモデルの0番目のメッシュの不透明度を50%にする MV1SetMeshOpacityRate( ModelHandle, 0, 0.5f ) ; // 3Dモデルの描画 MV1DrawModel( ModelHandle ) ; // モデルハンドルの削除 MV1DeleteModel( ModelHandle ) ; // キー入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言float MV1GetMeshOpacityRate( int MHandle, int MeshIndex ) ;

概略メッシュの不透明度を取得する

引数 int MHandle : モデルのハンドル
int MeshIndex : メッシュの番号
戻り値メッシュに設定されている不透明度

解説  MHandle のモデルハンドルが示すモデルの指定のメッシュに設定されている不透明度を取得します。
 MV1SetMeshOpacityRate でセットした値を取得するだけの関数です。

サンプル

ありません



宣言int MV1SetMeshDrawBlendMode( int MHandle, int MeshIndex, int BlendMode ) ;

概略メッシュの描画ブレンドモードを設定する

引数 int MHandle : モデルのハンドル
int MeshIndex : メッシュの番号
int BlendMode : 描画ブレンドモード( DX_BLENDMODE_ALPHA 等 )
戻り値0:成功
 -1:エラー発生

解説  MHandle のモデルハンドルが示すモデルに含まれるメッシュの描画ブレンドモードを変更します。
 マテリアルにも描画ブレンドモードの設定がありますので、この関数はマテリアルの設定を無視して描画ブレンドモードを変更したい場合に使用します。 ( BlendMode を -1 にすると、マテリアルのブレンドモードが使用されるようになります )

 尚、現在モデル描画で正常に動作するブレンドモードは DX_BLENDMODE_ALPHA, DX_BLENDMODE_ADD の2種類のみです。 ( ハードウエアが対応している場合は DX_BLENDMODE_SUB も正常に機能します )
 ブレンドモードの説明に関しては SetDrawBlendMode 関数の解説を参照してください。

 ブレンドモードのパラメータの変更は関数 MV1SetMeshDrawBlendParam を使用します。

サンプル

  モデルファイル DxChara.x に含まれる1番目のメッシュの描画ブレンドモードを加算ブレンド( DX_BLENDMODE_ADD )に変更します。

Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int ModelHandle ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // 3Dモデルの読み込み ModelHandle = MV1LoadModel( "DxChara.x" ) ; // ブレンドモードが変更されたことがわかるように画面全体を青色で塗りつぶす DrawBox( 0, 0, 640, 480, GetColor( 0,0,255 ), TRUE ) ; // 画面に映る位置に3Dモデルを移動 MV1SetPosition( ModelHandle, VGet( 320.0f, -300.0f, 600.0f ) ) ; // 3Dモデルに含まれる1番目のメッシュの描画ブレンドモードを DX_BLENDMODE_ADD に変更する MV1SetMeshDrawBlendMode( ModelHandle, 1, DX_BLENDMODE_ADD ) ; // 3Dモデルの描画 MV1DrawModel( ModelHandle ) ; // モデルハンドルの削除 MV1DeleteModel( ModelHandle ) ; // キーの入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言int MV1GetMeshDrawBlendMode( int MHandle, int MeshIndex ) ;

概略指定のマテリアルの描画ブレンドモードを取得する

引数 int MHandle : モデルのハンドル
int MeshIndex : メッシュの番号
戻り値描画ブレンドモード( DX_BLENDMODE_ALPHA 等 )
 -1:エラー発生

解説  MHandle のモデルハンドルが示すモデルに含まれるメッシュのの描画ブレンドモードを取得します。

 MV1SetMeshDrawBlendMode 関数で設定した値を返すだけの関数です。


サンプル

ありません



宣言int MV1SetMeshDrawBlendParam( int MHandle, int MeshIndex, int BlendParam ) ;

概略メッシュの描画ブレンドパラメータを設定する

引数 int MHandle : モデルのハンドル
int MeshIndex : メッシュの番号
int BlendParame : 描画ブレンドパラメータ( 0 ~ 255 )
戻り値0:成功
 -1:エラー発生

解説  MHandle のモデルハンドルが示すモデルに含まれるメッシュのブレンドパラメータを変更します。
( ブレンドパラメータの説明に関しては SetDrawBlendMode 関数の解説を参照してください )

 尚、ブレンドモードの変更は MV1SetMeshDrawBlendMode 関数を使用してください。

サンプル

  モデルファイル DxChara.x に含まれる1番目のメッシュの描画ブレンドモードを加算ブレンド( DX_BLENDMODE_ADD )に変更して、 ブレンドパラメータを128にして描画します。

Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int ModelHandle ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // 3Dモデルの読み込み ModelHandle = MV1LoadModel( "DxChara.x" ) ; // ブレンドモードが変更されたことがわかるように画面全体を青色で塗りつぶす DrawBox( 0, 0, 640, 480, GetColor( 0,0,255 ), TRUE ) ; // 画面に映る位置に3Dモデルを移動 MV1SetPosition( ModelHandle, VGet( 320.0f, -300.0f, 600.0f ) ) ; // 3Dモデルに含まれる1番目のメッシュの描画ブレンドモードを DX_BLENDMODE_ADD に変更する MV1SetMeshDrawBlendMode( ModelHandle, 1, DX_BLENDMODE_ADD ) ; // モデルに含まれる1番目のメッシュのブレンドパラメータを 128 に変更する MV1SetMeshDrawBlendParam( ModelHandle, 1, 128 ) ; // 3Dモデルの描画 MV1DrawModel( ModelHandle ) ; // モデルハンドルの削除 MV1DeleteModel( ModelHandle ) ; // キーの入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言int MV1GetMeshDrawBlendParam( int MHandle, int MeshIndex ) ;

概略メッシュの描画ブレンドパラメータを取得する

引数 int MHandle : モデルのハンドル
int MeshIndex : メッシュの番号
戻り値描画ブレンドパラメータ( 0 ~ 255 )
 -1:エラー発生

解説  MHandle のモデルハンドルが示すモデルに含まれるメッシュの描画ブレンドパラメータを取得します。

 この関数は MV1SetMeshDrawBlendParam 関数で設定した値を返すだけの関数です。


サンプル

ありません



宣言int MV1SetMeshBackCulling( int MHandle, int MeshIndex, int CullingFlag ) ;

概略メッシュのバックカリングを行うかどうかを設定する

引数 int MHandle : モデルのハンドル
int MeshIndex : メッシュの番号
int CullingFlag : バックカリングを行うかどうか( TRUE:行う FALSE:行わない )
戻り値0:成功
 -1:エラー発生

解説  MHandle のモデルハンドルが示すモデルに含まれるメッシュを描画する際にバックカリング( 反対向きのポリゴンを描画しない )を行うかどうか変更します。

 ポリゴンは多くの場合裏から見られることはありませんので、基本的にはバックカリングを行うという設定にしておくことで描画負荷を下げることが出来、それで何も問題はありませんが、 例えばペラペラの紙やスカート等、態々裏面のポリゴンを用意するのはポリゴン数的に勿体無いという場合はこの関数でバックかリングを無効にします。

 ただし裏面のポリゴンを描画する際も表面のポリゴンを描画する際もライティング計算に使用される法線は同じものとなりますので、 ライティングの影響が強いメッシュに対してバックカリングを無効にすると見た目が変になります。( その場合は仕方が無いので裏面用に別のポリゴンを用意するしかありません )

サンプル

  モデルファイル BackCulling.mqo に含まれる0番目のメッシュのバックカリングを有効な状態と無効にした状態での2パターンで描画します。

Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int ModelHandle ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // 3Dモデルの読み込み ModelHandle = MV1LoadModel( "BackCulling.mqo" ) ; // バックカリングされているのがわかり易いように画面全体を青で塗りつぶす DrawBox( 0, 0, 640, 480, GetColor( 0,0,255 ), TRUE ) ; // 画面に映る位置に3Dモデルを移動 MV1SetPosition( ModelHandle, VGet( 490.0f, 50.0f, 600.0f ) ) ; // 最初は何もせずに3Dモデルを描画 MV1DrawModel( ModelHandle ) ; // 最初の位置から少し移動 MV1SetPosition( ModelHandle, VGet( 50.0f, 50.0f, 600.0f ) ) ; // 3Dモデルに含まれる0番目のバックカリングを無効にする MV1SetMeshBackCulling( ModelHandle, 0, FALSE ) ; // 3Dモデルの描画 MV1DrawModel( ModelHandle ) ; // モデルハンドルの削除 MV1DeleteModel( ModelHandle ) ; // キーの入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言int MV1GetMeshBackCulling( int MHandle, int MeshIndex ) ;

概略メッシュのバックカリングを行うかどうかを取得する

引数 int MHandle : モデルのハンドル
int MeshIndex : メッシュの番号
戻り値0以上:バックカリングを行うかどうか( TRUE:行う FALSE:行わない )
 -1:エラー発生

解説  MHandle のモデルハンドルが示すモデルの指定のメッシュでバックカリングを行うかどうかを取得します。

サンプル

 MV1GetMeshNum関数 のサンプルを参照してください。



宣言VECTOR MV1GetMeshMaxPosition( int MHandle, int MeshIndex ) ;

概略メッシュに含まれる頂点のローカル座標での最大値を取得する

引数 int MHandle : モデルのハンドル
int MeshIndex : メッシュの番号
戻り値メッシュに含まれる頂点のローカル座標での最大値

解説  MHandle のモデルハンドルが示すモデルの指定のメッシュに含まれる頂点のローカル座標での最大値を取得します。

サンプル

 MV1GetMeshNum関数 のサンプルを参照してください。



宣言VECTOR MV1GetMeshMinPosition( int MHandle, int MeshIndex ) ;

概略メッシュに含まれる頂点のローカル座標での最小値を取得する

引数 int MHandle : モデルのハンドル
int MeshIndex : メッシュの番号
戻り値メッシュに含まれる頂点のローカル座標での最小値

解説  MHandle のモデルハンドルが示すモデルの指定のメッシュに含まれる頂点のローカル座標での最小値を取得します。

サンプル

 MV1GetMeshNum関数 のサンプルを参照してください。



宣言int MV1GetMeshTListNum( int MHandle, int MeshIndex ) ;

概略メッシュに含まれるトライアングルリストの数を取得する

引数 int MHandle : モデルのハンドル
int MeshIndex : メッシュの番号
戻り値0以上:メッシュに含まれるトライアングルリストの数
 -1:エラー発生

解説  MHandle のモデルハンドルが示すモデルの指定のメッシュに含まれるトライアングルリストの数を取得します。( メッシュは1つ又は複数のトライアングルリスト( ポリゴンの塊 )で構成されています )

サンプル

  モデルファイル DxChara.x の1番目のメッシュに含まれるトライアングルリストの情報を表示します。

Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int ModelHandle, TriangleListNum, i, TriangleListIndex ; int y ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // 3Dモデルの読み込み ModelHandle = MV1LoadModel( "DxChara.x" ) ; // 1番目のメッシュに含まれるトライアングルリストの数を取得する TriangleListNum = MV1GetMeshTListNum( ModelHandle, 1 ) ; // トライアングルリストの数だけループ y = 0 ; for( i = 0 ; i < TriangleListNum ; i ++ ) { // トライアングルリスト番号の取得 TriangleListIndex = MV1GetMeshTList( ModelHandle, 1, i ) ; // トライアングルリスト番号を描画 DrawFormatString( 0, y, GetColor( 255,255,255 ), "TriangleListIndex %d", TriangleListIndex ) ; // トライアングルリストの頂点タイプを描画 switch( MV1GetTriangleListVertexType( ModelHandle, TriangleListIndex ) ) { case DX_MV1_VERTEX_TYPE_1FRAME : DrawString( 0, y + 16, "頂点タイプ:1フレームの影響を受ける頂点", GetColor( 255,255,255 ) ) ; break ; case DX_MV1_VERTEX_TYPE_4FRAME : DrawString( 0, y + 16, "頂点タイプ:1~4フレームの影響を受ける頂点", GetColor( 255,255,255 ) ) ; break ; case DX_MV1_VERTEX_TYPE_8FRAME : DrawString( 0, y + 16, "頂点タイプ:1~8フレームの影響を受ける頂点", GetColor( 255,255,255 ) ) ; break ; case DX_MV1_VERTEX_TYPE_FREE_FRAME : DrawString( 0, y + 16, "頂点タイプ:9フレーム以上の影響を受ける頂点", GetColor( 255,255,255 ) ) ; break ; case DX_MV1_VERTEX_TYPE_NMAP_1FRAME : DrawString( 0, y + 16, "頂点タイプ:法線マップ用の情報が含まれる1フレームの影響を受ける頂点", GetColor( 255,255,255 ) ) ; break ; case DX_MV1_VERTEX_TYPE_NMAP_4FRAME : DrawString( 0, y + 16, "頂点タイプ:法線マップ用の情報が含まれる1~4フレームの影響を受ける頂点", GetColor( 255,255,255 ) ) ; break ; case DX_MV1_VERTEX_TYPE_NMAP_8FRAME : DrawString( 0, y + 16, "頂点タイプ:法線マップ用の情報が含まれる1~8フレームの影響を受ける頂点", GetColor( 255,255,255 ) ) ; break ; case DX_MV1_VERTEX_TYPE_NMAP_FREE_FRAME : DrawString( 0, y + 16, "頂点タイプ:法線マップ用の情報が含まれる9フレーム以上の影響を受ける頂点", GetColor( 255,255,255 ) ) ; break ; } // トライアングルリストのポリゴン数と頂点数を描画 DrawFormatString( 0, y + 32, GetColor( 255,255,255 ), "ポリゴン数:%-5d 頂点数:%-5d", MV1GetTriangleListPolygonNum( ModelHandle, TriangleListIndex ), MV1GetTriangleListVertexNum( ModelHandle, TriangleListIndex ) ) ; // 描画Y座標を進める y += 64 ; } // モデルハンドルの削除 MV1DeleteModel( ModelHandle ) ; // キーの入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言int MV1GetMeshTList( int MHandle, int MeshIndex, int Index ) ;

概略メッシュに含まれるトライアングルリストを取得する

引数 int MHandle : モデルのハンドル
int MeshIndex : メッシュの番号
int Index : メッシュ内トライアングルリストの番号
戻り値0以上:トライアングルリストの番号
 -1:エラー発生

解説  MHandle のモデルハンドルが示すモデルの指定のメッシュに含まれるトライアングルリストの番号を取得します。

 Index に MV1GetMeshTListNum 関数の戻り値以上の値を渡すとエラーになります。

 取得したトライアングルリストの番号は MV1DrawTriangleList や MV1GetTriangleListVertexType などの関数で使用します。

サンプル

 MV1GetMeshTListNum関数 のサンプルを参照してください。



宣言int MV1GetMeshSemiTransState( int MHandle, int MeshIndex ) ;

概略メッシュに半透明要素があるかどうかを取得する

引数 int MHandle : モデルのハンドル
int MeshIndex : メッシュの番号
戻り値TRUE:半透明要素がある FALSE:半透明要素は無い
 -1:エラー発生

解説  MHandle のモデルハンドルが示すモデルの指定のメッシュに半透明の要素があるかどうかを取得します。

 例えば、メッシュが使用しているマテリアルのテクスチャに半透明の部分があったり、 メッシュの不透明度が 1.0f ではなかったりすると TRUE が返ってきます。

 半透明要素を持つメッシュをZソートする場合に、各メッシュに半透明要素があるかどうかを判定する際などに使用します。

サンプル

  モデルファイル DxChara.x の0番目のメッシュの不透明度を上下キーで操作できるようにした上で、 画面上に MV1GetMeshSemiTransState 関数の戻り値を表示して半透明要素があるかどうかを確認できるようにしています。

Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int ModelHandle ; float OpacityRate ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // 3Dモデルの読み込み ModelHandle = MV1LoadModel( "DxChara.x" ) ; // 描画先を裏画面に変更 SetDrawScreen( DX_SCREEN_BACK ) ; // 画面に映る位置に3Dモデルを移動 MV1SetPosition( ModelHandle, VGet( 320.0f, -300.0f, 600.0f ) ) ; // 不透明度を初期化 OpacityRate = 1.0f ; // ESCキーが押されるかウインドウが閉じられるまでループ while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ) { // 画面のクリア ClearDrawScreen() ; // 上キーが押されたら不透明度を上げる if( CheckHitKey( KEY_INPUT_UP ) ) { OpacityRate += 0.05f ; if( OpacityRate > 1.0f ) { OpacityRate = 1.0f ; } } // 下キーが押されたら不透明度を下げる if( CheckHitKey( KEY_INPUT_DOWN ) ) { OpacityRate -= 0.05f ; if( OpacityRate < 0.0f ) { OpacityRate = 0.0f ; } } // 3Dモデルの1番目のメッシュの不透明度を設定する MV1SetMeshOpacityRate( ModelHandle, 1, OpacityRate ) ; // 3Dモデルの描画 MV1DrawModel( ModelHandle ) ; // 現在の不透明度と、MV1GetMeshSemiTransState の戻り値を描画する DrawFormatString( 0, 0, GetColor( 255,255,255 ), "ESC Key:Exit OpacityRate:%f SemiTransState:%d", OpacityRate, MV1GetMeshSemiTransState( ModelHandle, 1 ) ) ; // 裏画面の内容を表画面に反映 ScreenFlip() ; } // モデルハンドルの削除 MV1DeleteModel( ModelHandle ) ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言int MV1SetMeshUseVertDifColor( int MHandle, int MeshIndex, int UseFlag ) ;

概略メッシュの頂点ディフューズカラーをマテリアルのディフューズカラーの代わりに使用するかどうかを設定する

引数 int MHandle : モデルのハンドル
int MeshIndex : メッシュの番号
int UseFlag : 頂点ディフューズカラーをマテリアルのディフューズカラーの代わりに使用するかどうか( TRUE:使用する FALSE:使用しない )
戻り値 0:成功
 -1:エラー発生

解説  MHandle のモデルハンドルが示すモデルの指定のメッシュに含まれる頂点ディフューズカラーをマテリアルのディフューズカラーの代わりに使用するかどうかを設定します。
( デフォルトでは頂点ディフューズカラーは使用しません )

 この関数で頂点ディフューズカラーを使用する設定にした場合はマテリアルのディフューズカラー設定は無視され、代わりに頂点ディフューズカラーが使用されます。

 モデリングソフトでライティングの結果を頂点カラーに反映した場合等に使用します。
 尚、ライティング計算を SetUseLighting 関数で無効にした場合はこの関数の設定に関係なくマテリアルのディフューズカラーは無視され、頂点ディフューズカラーが使用されます。

サンプル

  モデルファイル SimpleModelVertexColor.mqo を最初は普通に描画し、キーが押された後3番目のメッシュの頂点ディフューズカラーを
 有効にして( マテリアルのディフューズカラーを無効にして )再度モデルを描画します。
  3番目のメッシュの頂点ディフューズカラーは真っ黒なので、キーが押された後はエミッシブカラー( 自己発光色 )と
 アンビエントカラー( 環境光色 )のみの平坦な見た目に変化します。
Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int ModelHandle ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // 3Dモデルの読み込み ModelHandle = MV1LoadModel( "SimpleModelVertexColor.mqo" ) ; // 画面に映る位置に3Dモデルを移動 MV1SetPosition( ModelHandle, VGet( 320.0f, 300.0f, 600.0f ) ) ; // 3Dモデルの描画 MV1DrawModel( ModelHandle ) ; // キーの入力待ち WaitKey() ; // 画面をクリア ClearDrawScreen() ; // 3番目のメッシュの頂点ディフューズカラーを使用する設定に変更する MV1SetMeshUseVertDifColor( ModelHandle, 3, TRUE ) ; // 3Dモデルの描画 MV1DrawModel( ModelHandle ) ; // モデルハンドルの削除 MV1DeleteModel( ModelHandle ) ; // キーの入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言int MV1GetMeshUseVertDifColor( int MHandle, int MeshIndex ) ;

概略メッシュの頂点ディフューズカラーをマテリアルのディフューズカラーの代わりに使用するかどうかの設定を取得する

引数 int MHandle : モデルのハンドル
int MeshIndex : メッシュの番号
戻り値頂点ディフューズカラーをマテリアルのディフューズカラーの代わりに使用するかどうか( TRUE:使用する FALSE:使用しない )

解説  MHandle のモデルハンドルが示すモデルの指定のメッシュに含まれる頂点のディフューズカラーをマテリアルのディフューズカラーの代わりに使用するかどうかを取得します。

サンプル

 MV1GetMeshNum関数 のサンプルを参照してください。



宣言int MV1SetMeshUseVertSpcColor( int MHandle, int MeshIndex, int UseFlag ) ;

概略メッシュの頂点スペキュラカラーをマテリアルのスペキュラカラーの代わりに使用するかどうかを設定する

引数 int MHandle : モデルのハンドル
int MeshIndex : メッシュの番号
int UseFlag : 頂点スペキュラカラーをマテリアルのスペキュラカラーの代わりに使用するかどうか( TRUE:使用する FALSE:使用しない )
戻り値 0:成功
 -1:エラー発生

解説  MHandle のモデルハンドルが示すモデルの指定のメッシュに含まれる頂点スペキュラカラーをマテリアルのスペキュラカラーの代わりに使用するかどうかを設定します。

 この関数で頂点スペキュラカラーを使用する設定にした場合はマテリアルのスペキュラカラー設定は無視され、代わりに頂点スペキュラカラーが使用されます。

 ただ、現時点ではライブラリのモデルデータ読みこみプログラムに頂点のスペキュラカラーを設定する処理が組み込まれていないので、 この関数で頂点スペキュラカラーを有効にしてもマテリアルのスペキュラカラーが無効化されるだけとなります。

サンプル

ありません



宣言int MV1GetMeshUseVertSpcColor( int MHandle, int MeshIndex ) ;

概略メッシュの頂点スペキュラカラーをマテリアルのスペキュラカラーの代わりに使用するかどうかの設定を取得する

引数 int MHandle : モデルのハンドル
int MeshIndex : メッシュの番号
戻り値頂点スペキュラカラーをマテリアルのスペキュラカラーの代わりに使用するかどうか( TRUE:使用する FALSE:使用しない )

解説  MHandle のモデルハンドルが示すモデルの指定のメッシュに含まれる頂点のスペキュラカラーをマテリアルのスペキュラカラーの代わりに使用するかどうかを取得します。

サンプル

 MV1GetMeshNum関数 のサンプルを参照してください。





シェイプ関数

宣言int MV1GetShapeNum( int MHandle ) ;

概略モデルに含まれるシェイプの数を取得する

引数 int MHandle : モデルのハンドル
戻り値0以上:モデルに含まれるシェイプの数
 -1:エラー発生

解説  MHandle のモデルハンドルが示すモデルに含まれるシェイプ( キャラクターモデルの表情などに使用される一部の頂点の変形情報 )の数を取得します。

サンプル

ありません



宣言int MV1SearchShape( int MHandle, char *ShapeName ) ;

概略指定名のシェイプをモデル中から検索する

引数 int MHandle : モデルのハンドル
char *ShapeName : 検索するシェイプの名前
戻り値0以上:指定名のシェイプの番号
  -2:指定名のシェイプが見つからなかった
  -1:エラー発生

解説  MHandle のモデルハンドルが示すモデルに含まれるシェイプ( キャラクターモデルの表情などに使用される一部の頂点の変形情報 )から、指定の名前のものを検索します。

 同名のシェイプが複数含まれる場合は番号の若いシェイプが返ってきます。

サンプル

ありません



宣言int MV1SetShapeRate( int MHandle, int ShapeIndex, float Rate ) ;

概略シェイプの適用率を設定する

引数 int MHandle : モデルのハンドル
int ShapeIndex : 有効率を変更するシェイプの番号
float Rate : 適用率( 0.0f(0%) ~ 1.0f(100%) )
戻り値 0:成功
 -1:エラー発生

解説  MHandle のモデルハンドルが示すモデルに含まれるシェイプ( キャラクターモデルの表情などに使用される一部の頂点の変形情報 )の適用率を変更します。
 第二引数の ShapeIndex で渡すシェイプの番号はDXライブラリ付属のモデルビューアー( DxLibModelViewer.exe )で確認できる他に、 MV1SearchShape を使用してシェイプの名前から検索することもできます。
 第三引数の Rate でシェイプの適用率を float 型の値で指定します、有効な値は 0.0f( 0% )から 1.0f( 100% )となります。

サンプル

ありません


宣言float MV1GetShapeRate( int MHandle, int ShapeIndex ) ;

概略シェイプの適用率を取得する

引数 int MHandle : モデルのハンドル
int ShapeIndex : 適用率を取得するシェイプの番号
戻り値 0.0f以上:シェイプの適用率( 0.0f(0%) ~ 1.0f(100%) )
 -1.0f:エラー発生

解説  MHandle のモデルハンドルが示すモデルに含まれるシェイプ( キャラクターモデルの表情などに使用される一部の頂点の変形情報 )の適用率を取得します。
 第二引数の ShapeIndex で渡すシェイプの番号はDXライブラリ付属のモデルビューアー( DxLibModelViewer.exe )で確認できる他に、 MV1SearchShape を使用してシェイプの名前から検索することもできます。

サンプル

ありません





トライアングルリスト関係

宣言int MV1GetTriangleListNum( int MHandle ) ;

概略モデルに含まれるトライアングルリストの数を取得する

引数 int MHandle : モデルのハンドル
戻り値0以上:モデルに含まれるトライアングルリストの数
 -1:エラー発生

解説  MHandle のモデルハンドルが示すモデルに含まれるトライアングルリストの数を取得します。

サンプル

  モデルファイル DxChara.x に含まれるトライアングルリストの情報を表示します。

Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int ModelHandle, TriangleListNum, i ; int y ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // 3Dモデルの読み込み ModelHandle = MV1LoadModel( "DxChara.x" ) ; // モデルに含まれるトライアングルリストの数を取得する TriangleListNum = MV1GetTriangleListNum( ModelHandle ) ; // トライアングルリストの数だけループ y = 0 ; for( i = 0 ; i < TriangleListNum ; i ++ ) { // トライアングルリスト番号を描画 DrawFormatString( 0, y, GetColor( 255,255,255 ), "No %d", i ) ; // トライアングルリストのポリゴン数と頂点数を描画 DrawFormatString( 48, y, GetColor( 255,255,255 ), "ポリゴン数:%-5d 頂点数:%-5d", MV1GetTriangleListPolygonNum( ModelHandle, i ), MV1GetTriangleListVertexNum( ModelHandle, i ) ) ; // トライアングルリストの頂点タイプを描画 switch( MV1GetTriangleListVertexType( ModelHandle, i ) ) { case DX_MV1_VERTEX_TYPE_1FRAME : DrawString( 0, y + 16, "頂点タイプ:1フレームの影響を受ける頂点", GetColor( 255,255,255 ) ) ; break ; case DX_MV1_VERTEX_TYPE_4FRAME : DrawString( 0, y + 16, "頂点タイプ:1~4フレームの影響を受ける頂点", GetColor( 255,255,255 ) ) ; break ; case DX_MV1_VERTEX_TYPE_8FRAME : DrawString( 0, y + 16, "頂点タイプ:1~8フレームの影響を受ける頂点", GetColor( 255,255,255 ) ) ; break ; case DX_MV1_VERTEX_TYPE_FREE_FRAME : DrawString( 0, y + 16, "頂点タイプ:9フレーム以上の影響を受ける頂点", GetColor( 255,255,255 ) ) ; break ; case DX_MV1_VERTEX_TYPE_NMAP_1FRAME : DrawString( 0, y + 16, "頂点タイプ:法線マップ用の情報が含まれる1フレームの影響を受ける頂点", GetColor( 255,255,255 ) ) ; break ; case DX_MV1_VERTEX_TYPE_NMAP_4FRAME : DrawString( 0, y + 16, "頂点タイプ:法線マップ用の情報が含まれる1~4フレームの影響を受ける頂点", GetColor( 255,255,255 ) ) ; break ; case DX_MV1_VERTEX_TYPE_NMAP_8FRAME : DrawString( 0, y + 16, "頂点タイプ:法線マップ用の情報が含まれる1~8フレームの影響を受ける頂点", GetColor( 255,255,255 ) ) ; break ; case DX_MV1_VERTEX_TYPE_NMAP_FREE_FRAME : DrawString( 0, y + 16, "頂点タイプ:法線マップ用の情報が含まれる9フレーム以上の影響を受ける頂点", GetColor( 255,255,255 ) ) ; break ; } // 描画Y座標を進める y += 32 ; } // モデルハンドルの削除 MV1DeleteModel( ModelHandle ) ; // キーの入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言int MV1GetTriangleListVertexType( int MHandle, int TListIndex ) ;

概略トライアングルリストの頂点データタイプを取得する

引数 int MHandle : モデルのハンドル
int TListIndex : トライアングルリストの番号
戻り値0以上:頂点データタイプ
 -1:エラー発生

解説  MHandle のモデルハンドルが示すモデルの指定のトライアングルリストに含まれる頂点のデータタイプを取得します。
 オリジナルの頂点シェーダープログラムを使用する場合は頂点のデータタイプによって頂点シェーダープログラムを変えなければならないので、 主にどの頂点シェーダープログラムを使用するべきかを判断する際にこの関数を使用します。

 頂点データのシェーダー内での具体的なデータ形式については関数 LoadVertexShader の解説をご覧ください。

頂点データタイプ一覧

DX_MV1_VERTEX_TYPE_1FRAME

 1フレームの影響のみ受ける頂点データタイプです。
 1頂点が複数のフレームの影響を受けないモデルはこのデータタイプになります。

DX_MV1_VERTEX_TYPE_4FRAME

 1~4フレームの影響を受ける頂点データタイプです。
 1頂点が2フレーム以上4フレーム以下の影響を受ける頂点が一つでも存在するトライアングルリストは
 このデータタイプになります。
 PMDモデルは基本的に全てこの頂点データタイプになります。

DX_MV1_VERTEX_TYPE_8FRAME

 1~8フレームの影響を受ける頂点データタイプです。
 1頂点が5フレーム以上4フレーム以下の影響を受ける頂点が一つでも存在するトライアングルリストは
 このデータタイプになります。
 普通の人型モデルなどでは普通1頂点が5フレーム以上の影響を受けることはありませんので、
 特殊なモデルのみこの形式になります。

DX_MV1_VERTEX_TYPE_FREE_FRAME

 9フレーム以上の影響を受ける頂点データタイプです。
 1頂点が9フレーム以上の影響を受ける頂点が一つでも存在するトライアングルリストは
 このデータタイプになります。
 滅多にこの形式になることはありません。
 尚、DirectX9 では一般的な方法では頂点シェーダーで1頂点9フレーム以上を扱う手段が無いので、
 この形式の場合は頂点シェーダーを使用することはできません。

DX_MV1_VERTEX_TYPE_NMAP_1FRAME
DX_MV1_VERTEX_TYPE_NMAP_4FRAME
DX_MV1_VERTEX_TYPE_NMAP_8FRAME
DX_MV1_VERTEX_TYPE_NMAP_FREE_FRAME

 それぞれ NMAP が付いていない名称のタイプに法線マップの情報が追加されたものです。
 MV1GetMaterialNormalMapTexture の戻り値が -1 以外のマテリアルを使用するメッシュに含まれる
 トライアングルリストは全て上記4タイプのいずれかになります。

サンプル

 MV1GetTriangleListNum関数 のサンプルを参照してください。



宣言int MV1GetTriangleListPolygonNum( int MHandle, int TListIndex ) ;

概略トライアングルリストに含まれるポリゴンの数を取得する

引数 int MHandle : モデルのハンドル
int TListIndex : トライアングルリストの番号
戻り値0以上:三角形ポリゴンの数
 -1:エラー発生

解説  MHandle のモデルハンドルが示すモデルの指定のトライアングルリストに含まれる三角形ポリゴンの数を取得します。

サンプル

 MV1GetTriangleListNum関数 のサンプルを参照してください。



宣言int MV1GetTriangleListVertexNum( int MHandle, int TListIndex ) ;

概略トライアングルリストに含まれる頂点の数を取得する

引数 int MHandle : モデルのハンドル
int TListIndex : トライアングルリストの番号
戻り値0以上:頂点の数
 -1:エラー発生

解説  MHandle のモデルハンドルが示すモデルの指定のトライアングルリストに含まれる頂点データの数を取得します。

サンプル

 MV1GetTriangleListNum関数 のサンプルを参照してください。






コリジョン( 衝突判定 )関係

宣言int MV1SetupCollInfo( int MHandle, int FrameIndex, int XDivNum, int YDivNum, int ZDivNum ) ;

概略コリジョン情報を構築する

引数 int MHandle : モデルのハンドル
int FrameIndex : コリジョンの情報を構築するフレームの番号
int XDivNum : コリジョン情報のX軸方向の空間分割数
int YDivNum : コリジョン情報のY軸方向の空間分割数
int ZDivNum : コリジョン情報のZ軸方向の空間分割数
戻り値 0:成功
 -1:エラー発生

解説  MHandle のモデルハンドルが示すモデルの指定のフレーム( 若しくはモデル全体 )に含まれるポリゴンとの当たり判定を行うための情報のセットアップを行います。

 3Dを扱うゲームでは多くの場合3Dモデルとの当たり判定を行っています。 この MV1SetupCollInfo を含むコリジョン関係関数は、その当たり判定処理の手助けをするものです。

 その使い方ですが、コリジョン関係の機能を使用するにはまずこの関数でコリジョン情報として使用したいポリゴンを持つフレームのポリゴンをコリジョン情報として使うための準備をしてやる必要があります。 そのフレームは FrameIndex で指定しますが、ここで FrameIndex を -1 にすることでモデル全体のポリゴンをコリジョン情報として準備することができます。
 因みにコリジョン処理は非常に負荷の高い処理ですので、 例えばステージモデルとの当たり判定を行う場合等は描画用のステージモデルをそのまま当たり判定用のモデルとして使うのではなく、 当たり判定用の粗いポリゴンメッシュを収めるフレームを用意して、 そのフレームに対して MV1SetupCollInfo をした方が良いです。 ( そしてそのフレームは MV1SetFrameVisible 関数で描画されないようにしておきます )

 セットアップ時に指定する XDivNum, YDivNum, ZDivNum ですが、 コリジョン処理の仕組みとして、 あるコリジョン処理をする際にコリジョン用のフレーム内に存在するすべてのポリゴンと接触判定をすると大変な処理負荷になってしまいますので、 コリジョン用のポリゴンはまずポリゴンが存在する空間を格子状に区切ってどの枠にどのポリゴンが存在するかを整理して、 コリジョン処理を行いたい領域の周辺に存在するポリゴンとだけ接触判定をするようにして、 処理負荷があまり大きくならないようにします。
 分割数の最適値ですが、 一つの格子が、コリジョン処理を行うオブジェクトの大きさとコリジョン用ポリゴンの平均的な大きさを比較して、 大きい方と同じくらいになる分割数が良いです。 検索対象となるポリゴンが多くなるのは問題ですが、検索対象となる格子の数が多すぎるのもまた問題ですので・・・ ( 例えば人型キャラクターが登場するステージの分割数でしたら、 人型キャラクターのモデルとコリジョン用ポリゴンの平均的な大きさを比較して、 人型キャラクターモデルの方が大きい場合は格子一つのサイズが人型キャラクターと同じ位の大きさになる分割数、 コリジョン用ポリゴンの平均的な大きさのほうが大きい場合は格子一つのサイズがコリジョン用ポリゴンの平均的な大きさと同じくらいの大きさになる分割数が最適となります )

 ちなみにコリジョン情報の構築は負荷の高い処理ですので、 コリジョン情報の更新は MV1RefreshCollInfo 関数を使用して明示的に行う必要があります。
 動かないモデルをコリジョンとして使用する場合は一度この関数でコリジョン情報をセットアップした後は何もする必要はありませんが、 動くモデルをコリジョンとして使用する場合は MV1RefreshCollInfo を呼ばないとコリジョン情報の形状が最後に更新したときの状態のままとなってしまいますので注意してください。

サンプル

  モデルファイル SimpleModel.mqo の0番目のフレーム( 中心の球体 )と線分の当たり判定をし、
 当たったところまで線分を描画します。
  あと、当たっているのかどうかを判断するために上下キーで線分を移動できるようにしています。
Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int ModelHandle ; float y ; VECTOR StartPos, EndPos ; MV1_COLL_RESULT_POLY HitPoly ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // 3Dモデルの読み込み ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ; // 描画先を裏画面に変更 SetDrawScreen( DX_SCREEN_BACK ) ; // 画面に映る位置に3Dモデルを移動 MV1SetPosition( ModelHandle, VGet( 320.0f, 300.0f, 600.0f ) ) ; // モデルの0番目のフレームのコリジョン情報を構築 MV1SetupCollInfo( ModelHandle, 0, 8, 8, 8 ) ; // 当たり判定用のラインを出すY座標を初期化 y = 300.0f ; // ウインドウが閉じられるかESCキーが押されるまでループ while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ) { // 画面をクリア ClearDrawScreen() ; // 上下キーで線分の y 座標を操作できる if( CheckHitKey( KEY_INPUT_UP ) == 1 ) { y += 16.0f ; } if( CheckHitKey( KEY_INPUT_DOWN ) == 1 ) { y -= 16.0f ; } // 3Dモデルの描画 MV1DrawModel( ModelHandle ) ; // 0番のフレームと線分との当たり判定 StartPos = VGet( 0.0f, y, 600.0f ) ; EndPos = VGet( 1000.0f, y, 600.0f ) ; HitPoly = MV1CollCheck_Line( ModelHandle, 0, StartPos, EndPos ) ; // 当たった場合はその位置を描画する線分の終点とする if( HitPoly.HitFlag == 1 ) { EndPos = HitPoly.HitPosition ; } // 線分の描画 DrawLine3D( StartPos, EndPos, GetColor( 255,255,0 ) ) ; // 当たったかどうかを表示する DrawFormatString( 0, 0, GetColor( 255,255,255 ), "HIT:%d", HitPoly.HitFlag ) ; // 裏画面の内容を表画面に反映 ScreenFlip() ; } // モデルハンドルの削除 MV1DeleteModel( ModelHandle ) ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言int MV1TerminateCollInfo( int MHandle, int FrameIndex ) ;

概略コリジョン情報の後始末をする

引数 int MHandle : モデルのハンドル
int FrameIndex : コリジョンの情報の後始末を行うフレームの番号
戻り値 0:成功
 -1:エラー発生

解説  MHandle のモデルハンドルが示すモデルの指定のフレーム( 若しくはモデル全体 )に含まれるポリゴンとの当たり判定を行うための情報の後始末を行います。

 この関数を使用して明示的に情報を破棄しなくても、 MV1DeleteModelDxLib_End が呼ばれた際にモデル情報と共にコリジョン情報の後始末は行われますので、 この関数を使用する機会はあまり無いかもしれません。

 尚、MV1SetupCollInfo で FrameIndex を -1 にした場合は、この関数でも FrameIndex を -1 にする必要があります。

サンプル

  ありません



宣言int MV1RefreshCollInfo( int MHandle, int FrameIndex ) ;

概略コリジョン情報を更新する

引数 int MHandle : モデルのハンドル
int FrameIndex : コリジョンの情報を更新するフレームの番号
戻り値 0:成功
 -1:エラー発生

解説  MHandle のモデルハンドルが示すモデルの指定のフレーム( 若しくはモデル全体 )に含まれるポリゴンとの当たり判定を行うための情報の更新を行います。

 動作させないモデルをコリジョンポリゴンとして使用している場合はこの関数を呼ぶ必要はありませんが、 MV1SetPosition で座標を移動したり、アニメーションを流したりするモデルをコリジョンポリゴンとして使用している場合はこの関数を使用して明示的にコリジョン情報を更新する必要があります。 ( 更新しない場合は最後に更新した状態のままとなります )

 尚、MV1SetupCollInfo で FrameIndex を -1 にした場合は、この関数でも FrameIndex を -1 にする必要があります。

サンプル

  モデルファイル SimpleModel.mqo の0番目のフレーム( 中心の球体 )と線分の当たり判定をし、
 当たったところまで線分を描画します。
  そして、モデルを上下に動かしながら MV1RefreshCollInfo でコリジョン情報を更新しています。
Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int ModelHandle ; int Add, y ; VECTOR StartPos, EndPos ; MV1_COLL_RESULT_POLY HitPoly ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // 3Dモデルの読み込み ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ; // 描画先を裏画面に変更 SetDrawScreen( DX_SCREEN_BACK ) ; // モデルの0番目のフレームのコリジョン情報を構築 MV1SetupCollInfo( ModelHandle, 0, 8, 8, 8 ) ; // モデルの進行方向をセット Add = 8 ; // モデルの移動位置をセット y = 0 ; // ウインドウが閉じられるかESCキーが押されるまでループ while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ) { // 画面をクリア ClearDrawScreen() ; // 3Dモデルの移動位置を上下に移動させる y += Add ; if( y < -300 || y > 300 ) Add = -Add ; // 3Dモデルの位置を変更する MV1SetPosition( ModelHandle, VGet( 320.0f, 300.0f + y, 600.0f ) ) ; // 0番目のフレームのコリジョン情報を更新する MV1RefreshCollInfo( ModelHandle, 0 ) ; // 3Dモデルの描画 MV1DrawModel( ModelHandle ) ; // 0番のフレームと線分との当たり判定 StartPos = VGet( 0.0f, 300.0f, 600.0f ) ; EndPos = VGet( 1000.0f, 300.0f, 600.0f ) ; HitPoly = MV1CollCheck_Line( ModelHandle, 0, StartPos, EndPos ) ; // 当たった場合はその位置を描画する線分の終点とする if( HitPoly.HitFlag == 1 ) { EndPos = HitPoly.HitPosition ; } // 線分の描画 DrawLine3D( StartPos, EndPos, GetColor( 255,255,0 ) ) ; // 当たったかどうかを表示する DrawFormatString( 0, 0, GetColor( 255,255,255 ), "HIT:%d", HitPoly.HitFlag ) ; // 裏画面の内容を表画面に反映 ScreenFlip() ; } // モデルハンドルの削除 MV1DeleteModel( ModelHandle ) ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言MV1_COLL_RESULT_POLY MV1CollCheck_Line( int MHandle, int FrameIndex, VECTOR PosStart, VECTOR PosEnd ) ;

概略線分とモデルの当たり判定

引数 int MHandle : モデルのハンドル
int FrameIndex : コリジョンの情報を更新するフレームの番号
VECTOR PosStart : 当たり判定で使用する線分の始点
VECTOR PosEnd : 当たり判定で使用する線分の終点
戻り値当たり判定結果構造体

解説  MHandle のモデルハンドルが示すモデルの指定のフレーム( 若しくはモデル全体 )に含まれるポリゴンと線分との当たり判定を行います。
( この関数でモデルのポリゴンと線分との当たり判定を行う場合は対象となるフレーム( 若しくはモデル全体 )に対して事前に MV1SetupCollInfo を呼んで準備を行っておく必要があります、 また、MV1SetupCollInfo で FrameIndex を -1 にした場合は、この関数でも FrameIndex を -1 にする必要があります )

 戻り値である MV1_COLL_RESULT_POLY は当たり判定の結果が代入されている構造体で、以下のような内容になっています。

// コリジョン結果代入用ポリゴン struct MV1_COLL_RESULT_POLY { // どれかのポリゴンに当たったかどうか // ( 1:当たった 0:当たらなかった ) int HitFlag ; // 線分とポリゴンが交差した座標 VECTOR HitPosition ; // 当たったポリゴンが含まれるフレームの番号 int FrameIndex ; // 当たったポリゴンのフレーム内番号 int PolygonIndex ; // 当たったポリゴンが使用しているマテリアルの番号 int MaterialIndex ; // 当たったポリゴンを形成する三点の座標 VECTOR Position[ 3 ] ; // 当たったポリゴンの法線 VECTOR Normal ; } ;
 注釈の通りですが、 どれかのポリゴンに当たったかどうかはメンバ変数 HitFlag が 1 かどうかで判断することができ、 線分とポリゴンが交差した座標は HitPosition に代入されます。
 当たったポリゴンが含まれるメッシュを所有しているフレームの番号はメンバ変数 FrameIndex に、 当たったポリゴンが使用しているマテリアルの番号はメンバ変数 MaterialIndex に、 当たったポリゴンを形成する三頂点の座標はメンバ配列 Position に、 当たったポリゴンの法線はメンバ変数 Normal にそれぞれ代入されます。
サンプル

  モデルファイル SimpleModel.mqo と上下に動く線分との当たり判定をして、当たったところまでの線分の描画と、
 当たり判定の結果を画面に描画します。
Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int ModelHandle ; int Add, y ; VECTOR StartPos, EndPos ; MV1_COLL_RESULT_POLY HitPoly ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // 3Dモデルの読み込み ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ; // 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 ) ; // モデルと線分との当たり判定 StartPos = VGet( -300.0f, y, 600.0f ) ; EndPos = VGet( 1000.0f, y, 600.0f ) ; HitPoly = MV1CollCheck_Line( ModelHandle, -1, StartPos, EndPos ) ; // 当たった場合はその位置を描画する線分の終点とする if( HitPoly.HitFlag == 1 ) { EndPos = HitPoly.HitPosition ; } // 線分の描画 DrawLine3D( StartPos, EndPos, GetColor( 255,255,0 ) ) ; // 当たったかどうかで処理を分岐 if( HitPoly.HitFlag == 1 ) { // 当たった場合は衝突の情報を描画する // 交差した座標を描画 DrawFormatString( 0, 0, GetColor( 255,255,255 ), "Hit Pos %f %f %f", HitPoly.HitPosition.x, HitPoly.HitPosition.y, HitPoly.HitPosition.z ) ; // 当たったポリゴンが含まれるフレームの番号を描画 DrawFormatString( 0, 16, GetColor( 255,255,255 ), "Frame %d", HitPoly.FrameIndex ) ; // 当たったポリゴンが使用しているマテリアルの番号を描画 DrawFormatString( 0, 32, GetColor( 255,255,255 ), "Material %d", HitPoly.MaterialIndex ) ; // 当たったポリゴンを形成する三頂点の座標を描画 DrawFormatString( 0, 48, GetColor( 255,255,255 ), "Position %f %f %f", HitPoly.Position[ 0 ].x, HitPoly.Position[ 0 ].y, HitPoly.Position[ 0 ].z ) ; DrawFormatString( 0, 64, GetColor( 255,255,255 ), " %f %f %f", HitPoly.Position[ 1 ].x, HitPoly.Position[ 1 ].y, HitPoly.Position[ 1 ].z ) ; DrawFormatString( 0, 80, GetColor( 255,255,255 ), " %f %f %f", HitPoly.Position[ 2 ].x, HitPoly.Position[ 2 ].y, HitPoly.Position[ 2 ].z ) ; // 当たったポリゴンの法線を描画 DrawFormatString( 0, 96, GetColor( 255,255,255 ), "Normal %f %f %f", HitPoly.Normal.x, HitPoly.Normal.y, HitPoly.Normal.z ) ; } else { // 当たらなかった場合は衝突しなかった旨だけ描画する DrawString( 0, 0, "NO HIT", GetColor( 255,255,255 ) ) ; } // 裏画面の内容を表画面に反映 ScreenFlip() ; } // モデルハンドルの削除 MV1DeleteModel( ModelHandle ) ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言MV1_COLL_RESULT_POLY_DIM MV1CollCheck_Sphere( int MHandle, int FrameIndex, VECTOR CenterPos, float r ) ;

概略球とモデルの当たり判定

引数 int MHandle : モデルのハンドル
int FrameIndex : コリジョンの情報を更新するフレームの番号
VECTOR CenterPos : 当たり判定で使用する球の中心座標
float r : 当たり判定で使用する球の半径
戻り値当たり判定結果ポリゴン配列構造体

解説  MHandle のモデルハンドルが示すモデルの指定のフレーム( 若しくはモデル全体 )に含まれるポリゴンと球との当たり判定を行います。
( この関数でモデルのポリゴンと線分との当たり判定を行う場合は対象となるフレーム( 若しくはモデル全体 )に対して事前に MV1SetupCollInfo を呼んで準備を行っておく必要があります、 また、MV1SetupCollInfo で FrameIndex を -1 にした場合は、この関数でも FrameIndex を -1 にする必要があります )

 戻り値である MV1_COLL_RESULT_POLY_DIM は当たり判定の結果が代入されている構造体で、以下のような内容になっています。

// コリジョン結果代入用ポリゴン配列 struct MV1_COLL_RESULT_POLY_DIM { // 当たったポリゴンの数 int HitNum ; // 当たったポリゴンの配列へのポインタ // ( 配列の要素数は HitNum です ) MV1_COLL_RESULT_POLY *Dim ; } ;
 また、MV1_COLL_RESULT_POLY_DIM 構造体で使用されている MV1_COLL_RESULT_POLY 構造体は以下のような内容になっています。

// コリジョン結果代入用ポリゴン struct MV1_COLL_RESULT_POLY { // どれかのポリゴンに当たったかどうか // ( 球との当たり判定の場合は必ず 1 ) int HitFlag ; // 球とポリゴンの最近点の座標 VECTOR HitPosition ; // 当たったポリゴンが含まれるフレームの番号 int FrameIndex ; // 当たったポリゴンが使用しているマテリアルの番号 int MaterialIndex ; // 当たったポリゴンを形成する三点の座標 VECTOR Position[ 3 ] ; // 当たったポリゴンの法線 VECTOR Normal ; } ;
 構造体の説明ですが、まず球とフレーム( 若しくはモデル全体 )との当たり判定を行うと戻り値として MV1_COLL_RESULT_POLY_DIM 構造体が返ってきます。
 この構造体の中身にはメンバ変数 HitNum と Dim があり、当たったポリゴンの数が HitNum に代入されています。
 この HitNum が 0 だったら球は対象のフレーム( 若しくはモデル全体 )に含まれるポリゴンに一枚も当たらなかったということです。
 そして当たった場合は、当たったポリゴンの数が HitNum に代入され、 どんなポリゴンと当たったかに関する情報がポインタ Dim が示すアドレスに当たったポリゴンの数だけ要素がある配列として格納されます。

 当たったかどうかだけを判断する場合は HitNum が 0 かどうかを判定するだけで、 当たったポリゴンに関する情報を扱いたい場合は Dim の先にある配列にアクセスするという使い方になります。

( Dim へのアクセスの仕方についてはサンプルプログラムを見ていただくとわかりやすいと思います )  また、この関数は当たるポリゴンの数が不定である関係上、動的にメモリを確保していますので、 戻り値の情報が必要なくなった場合は MV1CollResultPolyDimTerminate 関数に戻り値の構造体を渡して後始末を行う必要があります。

サンプル

  モデルファイル SimpleModel.mqo と上下に動く球の当たり判定をして、球と当たったポリゴンとの最近点を表示します。

Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int ModelHandle ; int Add, y, i ; VECTOR SpherePos ; MV1_COLL_RESULT_POLY_DIM HitPolyDim ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // 3Dモデルの読み込み ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ; // 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 ) ; // 当たり判定を行う球の位置をセット SpherePos = VGet( 250.0f, y, 600.0f ) ; // モデルと球との当たり判定 HitPolyDim = MV1CollCheck_Sphere( ModelHandle, -1, SpherePos, 100.0f ) ; // 球の描画 DrawSphere3D( SpherePos, 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 ) ; } } // 当たり判定情報の後始末 MV1CollResultPolyDimTerminate( HitPolyDim ) ; // 裏画面の内容を表画面に反映 ScreenFlip() ; } // モデルハンドルの削除 MV1DeleteModel( ModelHandle ) ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言MV1_COLL_RESULT_POLY_DIM MV1CollCheck_Capsule( int MHandle, int FrameIndex, VECTOR Pos1, VECTOR Pos2, float r ) ;

概略カプセル形状とモデルの当たり判定

引数 int MHandle : モデルのハンドル
int FrameIndex : コリジョンの情報を更新するフレームの番号
VECTOR Pos1 : カプセルを形成する二点中の一点の座標
VECTOR Pos2 : カプセルを形成する二点中の一点の座標
float r : カプセルの半径
戻り値当たり判定結果ポリゴン配列構造体

解説  MHandle のモデルハンドルが示すモデルの指定のフレーム( 若しくはモデル全体 )に含まれるポリゴンとカプセル形状( 二つの球を円筒で繋いだ形状 )との当たり判定を行います。
( この関数でモデルのポリゴンと線分との当たり判定を行う場合は対象となるフレーム( 若しくはモデル全体 )に対して事前に MV1SetupCollInfo を呼んで準備を行っておく必要があります、 また、MV1SetupCollInfo で FrameIndex を -1 にした場合は、この関数でも FrameIndex を -1 にする必要があります )

 戻り値である MV1_COLL_RESULT_POLY_DIM は当たり判定の結果が代入されている構造体で、以下のような内容になっています。

// コリジョン結果代入用ポリゴン配列 struct MV1_COLL_RESULT_POLY_DIM { // 当たったポリゴンの数 int HitNum ; // 当たったポリゴンの配列へのポインタ // ( 配列の要素数は HitNum です ) MV1_COLL_RESULT_POLY *Dim ; } ;
 また、MV1_COLL_RESULT_POLY_DIM 構造体で使用されている MV1_COLL_RESULT_POLY 構造体は以下のような内容になっています。

// コリジョン結果代入用ポリゴン struct MV1_COLL_RESULT_POLY { // どれかのポリゴンに当たったかどうか // ( カプセルとの当たり判定の場合は必ず 1 ) int HitFlag ; // 無効です VECTOR HitPosition ; // 当たったポリゴンが含まれるフレームの番号 int FrameIndex ; // 当たったポリゴンが使用しているマテリアルの番号 int MaterialIndex ; // 当たったポリゴンを形成する三点の座標 VECTOR Position[ 3 ] ; // 当たったポリゴンの法線 VECTOR Normal ; } ;
 構造体の説明ですが、まずカプセルとフレーム( 若しくはモデル全体 )との当たり判定を行うと戻り値として MV1_COLL_RESULT_POLY_DIM 構造体が返ってきます。
 この構造体の中身にはメンバ変数 HitNum と Dim があり、当たったポリゴンの数が HitNum に代入されています。
 この HitNum が 0 だったら球は対象のフレーム( 若しくはモデル全体 )に含まれるポリゴンに一枚も当たらなかったということです。
 そして当たった場合は、当たったポリゴンの数が HitNum に代入され、 どんなポリゴンと当たったかに関する情報がポインタ Dim が示すアドレスに当たったポリゴンの数だけ要素がある配列として格納されます。

 当たったかどうかだけを判断する場合は HitNum が 0 かどうかを判定するだけで、 当たったポリゴンに関する情報を扱いたい場合は Dim の先にある配列にアクセスするという使い方になります。

( Dim へのアクセスの仕方についてはサンプルプログラムを見ていただくとわかりやすいと思います )  また、この関数は当たるポリゴンの数が不定である関係上、動的にメモリを確保していますので、 戻り値の情報が必要なくなった場合は MV1CollResultPolyDimTerminate 関数に戻り値の構造体を渡して後始末を行う必要があります。

サンプル

  モデルファイル SimpleModel.mqo と上下に動くカプセルの当たり判定をして、カプセルと当たったポリゴンとの最近点を表示します。

Windows用
#include "DxLib.h" // カプセルの高さ #define CAPSULE_H 64.0f int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { 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( "SimpleModel.mqo" ) ; // 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 ) ; // カプセルの描画 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 ) ; } } // 当たり判定情報の後始末 MV1CollResultPolyDimTerminate( HitPolyDim ) ; // 裏画面の内容を表画面に反映 ScreenFlip() ; } // モデルハンドルの削除 MV1DeleteModel( ModelHandle ) ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言MV1_COLL_RESULT_POLY MV1CollCheck_GetResultPoly( MV1_COLL_RESULT_POLY_DIM ResultPolyDim, int PolyNo ) ;

概略当たり判定結果ポリゴン配列から指定番のポリゴン情報を取得する

引数 MV1_COLL_RESULT_POLY_DIM ResultPolyDim : 当たり判定結果ポリゴン配列構造体
int PolyNo : 取得したいポリゴンの番号
戻り値当たり判定結果ポリゴン

解説  MHandle のモデルハンドルが示すモデルと球の当たり判定を MV1CollCheck_Sphere で行った結果の MV1_COLL_RESULT_POLY_DIM 構造体から指定番号の当たったポリゴンの情報を取得するための関数です。
 MV1_COLL_RESULT_POLY_DIM 関数の中にある Dim が示す配列から情報を返すだけの関数ですが、 ポインタが苦手な方はこちらの関数を使用してください。

サンプル

  モデルファイル SimpleModel.mqo と上下に動く球の当たり判定をして、球と当たったポリゴンとの最近点を表示します。
  ( MV1CollCheck_Sphere 関数のサンプルを MV1CollCheck_GetResultPoly を使用するように変更したものです )

Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int ModelHandle ; int Add, y, i ; VECTOR SpherePos ; MV1_COLL_RESULT_POLY_DIM HitPolyDim ; MV1_COLL_RESULT_POLY HitPoly ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // 3Dモデルの読み込み ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ; // 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 ) ; // 当たり判定を行う球の位置をセット SpherePos = VGet( 250.0f, y, 600.0f ) ; // モデルと球との当たり判定 HitPolyDim = MV1CollCheck_Sphere( ModelHandle, -1, SpherePos, 100.0f ) ; // 球の描画 DrawSphere3D( SpherePos, 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 ++ ) { // 当たったポリゴンとの最近点の座標を描画 HitPoly = MV1CollCheck_GetResultPoly( HitPolyDim, i ) ; DrawFormatString( 0, 16 + 16 * i, GetColor( 255,255,255 ), "Position %f %f %f", HitPoly.HitPosition.x, HitPoly.HitPosition.y, HitPoly.HitPosition.z ) ; } } // 当たり判定情報の後始末 MV1CollResultPolyDimTerminate( HitPolyDim ) ; // 裏画面の内容を表画面に反映 ScreenFlip() ; } // モデルハンドルの削除 MV1DeleteModel( ModelHandle ) ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言int MV1CollResultPolyDimTerminate( MV1_COLL_RESULT_POLY_DIM ResultPolyDim ) ;

概略当たり判定結果ポリゴン配列の後始末をする

引数 MV1_COLL_RESULT_POLY_DIM ResultPolyDim : 当たり判定結果ポリゴン配列構造体
戻り値 0:成功
 -1:エラー発生

解説  MV1CollCheck_Sphere 関数の戻り値である ResultPolyDim 構造体の後始末を行います。

 MV1CollCheck_Sphere 関数が返す構造体 MV1_COLL_RESULT_POLY_DIM は当たるポリゴンの数が不定な関係上、 当たり判定結果を代入するメモリ領域を動的に確保しているので、 当たり判定結果を使った処理が終了した際はこの関数で構造体の後始末を行う必要があります。

サンプル

 MV1CollCheck_Sphere関数 のサンプルを参照してください。



参照用メッシュ関係

宣言int MV1SetupReferenceMesh( int MHandle, int FrameIndex, int IsTransform ) ;

概略参照用メッシュのセットアップ

引数 int MHandle : モデルのハンドル
int FrameIndex : 参照用メッシュを構築するフレームの番号
int IsTransform : 参照用メッシュは頂点座標変換を施したものにするかどうか
      ( TRUE:変換を施したもの FALSE:変換を施さないローカル座標のもの )
戻り値 0:成功
 -1:エラー発生

解説  MHandle のモデルハンドルが示すモデルの指定のフレーム( 若しくはモデル全体 )に含まれるポリゴンの座標や法線、UV値などの情報にアクセスするための準備を行います。

 3Dを扱うゲームを作成していると、 しばしば3Dモデルを描画する以外の用途で3Dモデルのポリゴンの頂点座標や法線座標を扱いたくなるときがあります、 最も一般的な例はモデルとの当たり判定ですが、 それ以外の用途でも・・・あんまり一般的な例は思いつきませんがあったりします。
 参照用メッシュはそんなときに有効なモデルの頂点座標やポリゴン情報にアクセスするための機能です。

 その使い方ですが、参照用メッシュの機能を使用するにはまずこの関数で参照したいポリゴンを参照するための準備を行う必要があります。 参照対象としたいフレームを引数 FrameIndex で指定して( FrameIndex を -1 にすることでモデル全体のポリゴンを参照するための準備をすることができます )、 加えて参照用メッシュの頂点座標を、 頂点座標変換を施した頂点にするかどうかを引数 IsTransform で指定します。 ( TRUE にすると MV1SetPositionMV1AttachAnim 等で設定された頂点座標変換が行われたものが、 FALSE にすると MV1SetPosition や MV1AttachAnim 等の設定を無視して何も頂点座標変換が行われていないものがそれぞれ取得できます )
 因みに参照用メッシュの構築処理はそれなりに負荷の高い処理ですので、 できる限り参照したいポリゴンを持つフレームのみを指定した方が良いです。

 セットアップが完了した後は参照用メッシュの情報が入った構造体 MV1_REF_POLYGONLIST を戻り値として返してくる関数 MV1GetReferenceMesh を使用して、実際にポリゴンの情報を取得します。
// 参照用ポリゴンデータ構造体 struct MV1_REF_POLYGONLIST { // ポリゴンの数 int PolygonNum ; // 頂点の数 int VertexNum ; // 頂点座標の最小値 VECTOR MinPosition ; // 頂点座標の最大値 VECTOR MaxPosition ; // ポリゴン構造体の配列へのポインタ MV1_REF_POLYGON *Polygons ; // 頂点構造体の配列へのポインタ MV1_REF_VERTEX *Vertexs ; } ;
int PolygonNum
 参照用メッシュに含まれるポリゴンの数です。
 参照の対象をフレームにした場合はフレームに含まれるメッシュが持つポリゴンの総数が、 参照の対象をモデルにした場合はモデルに含まれる全メッシュが持つポリゴンの総数が代入されます。

int VertexNum
 参照用メッシュに含まれる頂点の数です。
 参照の対象をフレームにした場合はフレームに含まれるメッシュが持つ頂点の総数が、 参照の対象をモデルにした場合はモデルに含まれる全メッシュが持つ頂点の総数が代入されます。

VECTOR MinPosition
 参照用メッシュに含まれる頂点座標の最小値です。
 座標値は頂点座標変換をする指定をしていた場合は座標変換されたものの最小値となります。

VECTOR MaxPosition
 参照用メッシュに含まれる頂点座標の最大値です。
 座標値は頂点座標変換をする指定をしていた場合は座標変換されたものの最大値となります。

MV1_REF_POLYGON *Polygons
 参照用メッシュに含まれるポリゴン情報の配列へのポインタです。
 配列の要素数は PolygonNum 個で、 中身はポリゴンが含まれているフレームの番号、 ポリゴンに使用されているマテリアルの番号、 ポリゴンの形成に使用されている頂点の番号3つなどです。

MV1_REF_VERTEX *Vertexs
 参照用メッシュに含まれる頂点情報の配列へのポインタです。
 配列の要素数は VertexNum 個で、 中身は頂点の位置・法線・テクスチャ座標・頂点カラーなどです。
 ポリゴンの情報と頂点の情報が分かれているのは多くの場合一つの頂点は複数のポリゴンで使用されているので、 ポリゴンの情報の中に頂点の情報を含めてしまうと同じ頂点情報が幾つものポリゴン情報の中に含まれてデータサイズが無駄に大きくなってしまうからです。

 次に頂点の情報が格納される構造体 MV1_REF_VERTEX は次のような内容になっています。
struct MV1_REF_VERTEX { // 位置 VECTOR Position ; // 法線 VECTOR Normal ; // テクスチャ座標 UV TexCoord[ 2 ] ; // ディフューズカラー COLOR_U8 DiffuseColor ; // スペキュラカラー COLOR_U8 SpecularColor ; } ;
VECTOR Position
 頂点の座標です。
 頂点座標変換をする指定をした場合は MV1SetPositionMV1AttachAnim などの設定が反映された座標が、 座標変換をしないようにした場合は読み込み時のメッシュのローカル座標そのままが代入されます。
 座標変換をする指定をした場合は MV1RefreshReferenceMesh 関数を呼ぶことで座標値が更新されます。

VECTOR Normal
 頂点の法線です。
 頂点座標変換をする指定をした場合は MV1SetRotation や MV1AttachAnim などの設定が反映された法線ベクトルが、 座標変換をしないようにした場合は読み込み時のメッシュのローカル法線がそのまま代入されます。
 座標変換をする指定をした場合は MV1RefreshReferenceMesh 関数を呼ぶことで法線値が更新されます。

UV TexCoord[ 2 ]
 頂点のテクスチャ座標です。
 UV は構造体で、中身は float u, v となっています。
 一応マルチテクスチャを考慮して2つのテクスチャ座標を代入できるようになっていますが、 現在のバージョンでは TexCoord[ 0 ] しか使いません。

COLOR_U8 DiffuseColor
 頂点のディフューズカラーです。
 メッシュに頂点カラーが無かった場合はポリゴンが使用しているマテリアルのディフューズカラーが代入されています。

COLOR_U8 SpecularColor
 頂点のスペキュラカラーです。
 現在のバージョンでは必ず r, g, b, a すべての要素が 0.0f となります。

 次にポリゴンの情報が格納される構造体 MV1_REF_POLYGON は以下のような内容になっています。
struct MV1_REF_POLYGON { // ポリゴンが含まれるメッシュを持っているフレームの番号 unsigned short FrameIndex ; // 使用しているマテリアルの番号 unsigned short MaterialIndex ; // VIndex が指すインデックスの参照先( 1:フレーム 0:モデル全体 ) int VIndexTarget ; // 三角形ポリゴンを形成する三頂点の番号 int VIndex[ 3 ] ; // 三角形ポリゴンを形成する三頂点の座標の最小値 VECTOR MinPosition ; // 三角形ポリゴンを形成する三頂点の座標の最大値 VECTOR MaxPosition ; } ;
unsigned short FrameIndex
 ポリゴンが含まれるメッシュを持っているフレームの番号です。
 すべてのポリゴンはどれかのメッシュに含まれていて、 すべてのメッシュはどれかのフレームに含まれているので、 この変数の値が不定になることはありません。

unsigned short MaterialIndex
 ポリゴンが使用しているマテリアルの番号です。

int VIndexTarget
 VIndex 配列が示すインデックスの参照先を表す番号が代入されています。
 ライブラリ内部で使用されている変数なので、通常ではこの値を利用することはありません。

int VIndex[ 3 ]  三角形ポリゴンを形成する三頂点の番号です。
 例えば0番目のポリゴンで使用されている三頂点の座標を取得したい場合は以下のように記述します。
VECTOR Position[ 3 ] ; Position[ 0 ] = PolygonList.Vertexs[ PolygonList.Polygons[ 0 ].VIndex[ 0 ] ].Position ; Position[ 1 ] = PolygonList.Vertexs[ PolygonList.Polygons[ 0 ].VIndex[ 1 ] ].Position ; Position[ 2 ] = PolygonList.Vertexs[ PolygonList.Polygons[ 0 ].VIndex[ 2 ] ].Position ;
VECTOR MinPosition
 ポリゴンを形成する三頂点の座標の最小値です。
 座標値は頂点座標変換をする指定をしていた場合は座標変換されたものの最小値となります。

VECTOR MaxPosition
 ポリゴンを形成する三頂点の座標の最大値です。
 座標値は頂点座標変換をする指定をしていた場合は座標変換されたものの最大値となります。

 尚、参照用メッシュの情報を構築する処理はそれなりに負荷の高い処理ですので、 頂点座標変換を行う設定にした場合でも MV1SetPositionMV1SetAttachAnimTime などで状態を変更しただけでは参照用メッシュの頂点座標と頂点法線は更新されません。
 状態を変更した後に MV1RefreshReferenceMesh 関数で明示的に参照用メッシュをする必要がありますのでご注意ください。

サンプル

  モデルファイル SimpleModel.mqo 全体の参照用メッシュを構築したあと、ポリゴン一枚一枚の座標を利用して
 モデルのワイヤーフレームを描画します。

Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int ModelHandle ; int i ; MV1_REF_POLYGONLIST RefPoly ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // 3Dモデルの読み込み ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ; // 3Dモデルを見える位置に移動する MV1SetPosition( ModelHandle, VGet( 320.0f, 300.0f, 600.0f ) ) ; // モデル全体の参照用メッシュを構築 MV1SetupReferenceMesh( ModelHandle, -1, TRUE ) ; // 参照用メッシュ情報の取得 RefPoly = MV1GetReferenceMesh( ModelHandle, -1, TRUE ) ; // ポリゴンの数だけ繰り返し for( i = 0 ; i < RefPoly.PolygonNum ; i ++ ) { // ポリゴンを形成する三頂点を使用してワイヤーフレームを描画する DrawLine3D( RefPoly.Vertexs[ RefPoly.Polygons[ i ].VIndex[ 0 ] ].Position, RefPoly.Vertexs[ RefPoly.Polygons[ i ].VIndex[ 1 ] ].Position, GetColor( 255,255,0 ) ) ; DrawLine3D( RefPoly.Vertexs[ RefPoly.Polygons[ i ].VIndex[ 1 ] ].Position, RefPoly.Vertexs[ RefPoly.Polygons[ i ].VIndex[ 2 ] ].Position, GetColor( 255,255,0 ) ) ; DrawLine3D( RefPoly.Vertexs[ RefPoly.Polygons[ i ].VIndex[ 2 ] ].Position, RefPoly.Vertexs[ RefPoly.Polygons[ i ].VIndex[ 0 ] ].Position, GetColor( 255,255,0 ) ) ; } // モデルハンドルの削除 MV1DeleteModel( ModelHandle ) ; // キー入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言int MV1TerminateReferenceMesh( int MHandle, int FrameIndex, int IsTransform ) ;

概略参照用メッシュの後始末をする

引数 int MHandle : モデルのハンドル
int FrameIndex : 参照用メッシュの後始末を行うフレームの番号
int IsTransform : 後始末の対象の参照用メッシュ
  ( TRUE:頂点座標変換を施した参照用メッシュ FALSE:頂点座標変換を施さない参照用メッシュ )
戻り値 0:成功
 -1:エラー発生

解説  MHandle のモデルハンドルが示すモデルの指定のフレーム( 若しくはモデル全体 )用に構築した参照用メッシュの後始末を行います。

 この関数を使用して明示的に参照用メッシュを破棄しなくても、 MV1DeleteModelDxLib_End が呼ばれた際にモデル情報と参照用メッシュの後始末は行われますので、 この関数を使用する機会はあまり無いかもしれません。

 尚、MV1SetupReferenceMesh で FrameIndex を -1 にした場合は、この関数でも FrameIndex を -1 にする必要があります。

サンプル

  ありません



宣言int MV1RefreshReferenceMesh( int MHandle, int FrameIndex, int IsTransform ) ;

概略参照用メッシュを更新する

引数 int MHandle : モデルのハンドル
int FrameIndex : 参照用メッシュを更新するフレームの番号
int IsTransform : 更新する参照用メッシュは頂点座標変換を施したものかどうか
      ( TRUE:変換を施したもの FALSE:変換を施していないもの )
戻り値 0:成功
 -1:エラー発生

解説  MHandle のモデルハンドルが示すモデルの指定のフレーム( 若しくはモデル全体 )の参照用メッシュを更新します。

 モデルを動かさない場合は参照用メッシュを更新する必要はありませんが、 動くモデルをコリジョンポリゴンとして使用している場合はこの関数を使用して明示的にコリジョン情報を更新する必要があります。 ( 更新しない場合は最後に更新した状態のままとなります )

 尚、MV1SetupReferenceMesh で FrameIndex を -1 にした場合は、この関数でも FrameIndex を -1 にする必要があります。

サンプル

  モデルファイル SimpleModel.mqo の0番目のフレームの参照用メッシュを構築したあと、上下にモデルを移動しながら
 ポリゴン一枚一枚の座標を利用して0番目のフレームのワイヤーフレームを描画します。

Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int ModelHandle ; int Add, y, i ; MV1_REF_POLYGONLIST RefPoly ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // 3Dモデルの読み込み ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ; // 描画先を裏画面に変更 SetDrawScreen( DX_SCREEN_BACK ) ; // 0番目のフレームの参照用メッシュを構築 MV1SetupReferenceMesh( ModelHandle, 0, TRUE ) ; // モデルの進行方向をセット Add = 8 ; // モデルの移動位置をセット y = 0 ; // ウインドウが閉じられるか何かキーが押されるまでループ while( ProcessMessage() == 0 && CheckHitKeyAll() == 0 ) { // 画面をクリア ClearDrawScreen() ; // 3Dモデルの移動位置を上下に移動させる y += Add ; if( y < 0 || y > 600 ) Add = -Add ; // 3Dモデルを移動する MV1SetPosition( ModelHandle, VGet( 320.0f, y, 600.0f ) ) ; // 0番目のフレームの参照用メッシュを更新する MV1RefreshReferenceMesh( ModelHandle, 0, TRUE ) ; // 0番目のフレームの参照用メッシュの取得 RefPoly = MV1GetReferenceMesh( ModelHandle, 0, TRUE ) ; // ポリゴンの数だけ繰り返し for( i = 0 ; i < RefPoly.PolygonNum ; i ++ ) { // ポリゴンを形成する三頂点を使用してワイヤーフレームを描画する DrawLine3D( RefPoly.Vertexs[ RefPoly.Polygons[ i ].VIndex[ 0 ] ].Position, RefPoly.Vertexs[ RefPoly.Polygons[ i ].VIndex[ 1 ] ].Position, GetColor( 255,255,0 ) ) ; DrawLine3D( RefPoly.Vertexs[ RefPoly.Polygons[ i ].VIndex[ 1 ] ].Position, RefPoly.Vertexs[ RefPoly.Polygons[ i ].VIndex[ 2 ] ].Position, GetColor( 255,255,0 ) ) ; DrawLine3D( RefPoly.Vertexs[ RefPoly.Polygons[ i ].VIndex[ 2 ] ].Position, RefPoly.Vertexs[ RefPoly.Polygons[ i ].VIndex[ 0 ] ].Position, GetColor( 255,255,0 ) ) ; } // 裏画面の内容を表画面に反映 ScreenFlip() ; } // モデルハンドルの削除 MV1DeleteModel( ModelHandle ) ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言MV1_REF_POLYGONLIST MV1GetReferenceMesh( int MHandle, int FrameIndex, int IsTransform ) ;

概略参照用メッシュを取得する

引数 int MHandle : モデルのハンドル
int FrameIndex : 参照用メッシュを取得するフレームの番号
int IsTransform : 取得する参照用メッシュは頂点座標変換を施したものかどうか
      ( TRUE:変換を施したもの FALSE:変換を施していないもの )
戻り値参照用メッシュを参照するための構造体

解説  MHandle のモデルハンドルが示すモデルの指定のフレーム( 若しくはモデル全体 )の参照用メッシュを取得します。
( この関数で参照用メッシュの構造体を取得する場合は、対象となるフレーム( 若しくはモデル全体 )に対して事前に MV1SetupReferenceMesh を呼んで準備を行っておく必要があります、 また、MV1SetupReferenceMesh で FrameIndex を -1 にした場合は、この関数でも FrameIndex を -1 にする必要があります )

 この関数の戻り値である MV1_REF_POLYGONLIST の詳細は MV1SetupReferenceMesh 関数の解説を参照してください。

サンプル

 MV1SetupReferenceMesh関数 のサンプル、又は MV1RefreshReferenceMesh関数 のサンプルを参照してください。




戻る