モデルの読み込み・複製関係の関数

宣言int MV1LoadModel( char *FileName ) ;

概略モデルの読み込み

引数 FileName : ロードする3Dモデルファイルのパス文字列のアドレス
戻り値 -1    : エラー発生
-1以外 : モデルのハンドル

解説  3Dモデルファイルをメモリにロードします。
DXライブラリで3Dモデルを扱うときに必ず使用する関数です。
 この関数が成功するとモデルハンドルというものが返ってきます。
これはメモリに読み込んだ3Dモデルファイルの識別番号で int 型の数値です。
 読み込んだモデルを扱う際にこの識別番号を使用することになりますので、 MV1LoadModel の戻り値は必ずなんらかの変数に格納しておく必要があります。

例  DxChara.x をロードして、戻り値であるモデルハンドルを
  int 型変数 MHandle に保存します

int MHandle ; MHandle = MV1LoadModel( "DxChara.x" ) ;

読み込むことのできるモデルファイル形式は x, mqo, mv1, pmd( + vmd ), pmx( + vmd ) の4種類です。
( 但し、pmx は pmd 相当の機能だけを使用していた場合のみ正常に読み込める仮対応状態です )


 尚、形状情報とアニメーション(アニメーション)情報はファイルの内容通りに読み込めますが、 マテリアル情報は各ファイル形式それぞれで異なる表現をしているものを無理矢理DXライブラリのマテリアル表現で扱おうとするため、 大抵の場合モデリングソフト上とは異なった見た目になってしまいます。
 なので、そのような場合はDXライブラリに合わせてモデルファイルのマテリアルを調整していただくか、 DXライブラリの3Dツールでマテリアルを調整してからライブラリの専用形式である mv1 形式で保存して、そのファイルを使っていただくことになります。
 また、モデルファイルで使用されているテクスチャはモデルファイルの中には含まれませんので、 モデルファイルで指定されているフォルダにテクスチャファイルを格納しておく必要があります。


MMD( MikuMikuDance )のモデルファイル( pmd or pmx )とモーションファイル( vmd )について。

<対応度について>

 一応モーションの再生と取れに伴うIK、物理演算に対応していますが、完全に本家 MikuMikuDance と同じというわけではありません。


<読み込みについて>

 MikuMikuDance ではトゥーン用のテクスチャ( toon01.bmp 等 )はモデルファイル( pmd or pmx )が存在するテクスチャとは別のフォルダにあっても問題なく読み込むことが出来ますが、 DXライブラリではトゥーン用のテクスチャもモデルファイル( pmd or pmx )と同じフォルダに格納しておく必要があります。( トゥーン用のデフォルトテクスチャは MikuMikuDance の Dataフォルダの中にあります )

 また、DXライブラリでは MMD のモデルファイル形式( pmd or pmx )とモーションファイル形式( vmd )の読み込みに対応していますが、 モーションファイル( vmd )はモデルファイル( pmd or pmx )を読み込む際に一緒に読み込まれるようになっています。
 ただ、MV1LoadModel にはモーションファイルのファイル名を渡す引数はありませんので、 次のようなルールでモデルファイル( pmd or pmx )用のモーションファイルを検索します。

 1.モデルファイル名に3桁の番号がついたモーションファイルがあるか検索して、あったら読み込む
   ( 検索する番号は 000 から )

     例えば、Miku.pmd ( 若しくは Miku.pmx ) というファイル名を FileName として渡した場合は、
     最初に Miku000.vmd というモーションファイルが存在するか調べます。

 2.検索する番号を000から順に1づつ増やしていき、存在しないファイル名になるまで読み込む

     例えば、Miku000.vmd、Miku001.vmd、Miku002.vmd と数字の繋がった3つのモーションファイルが
     あった場合は3つとも読み込まれます。
     仮に Miku000.vmd, Miku001.vmd, Miku005.vmd のように、番号が途切れていたら、Miku000.vmd と
     Miku001.vmd の二つだけ読み込まれ、Miku005.vmd は読み込まれません。

 尚、読み込み時にIK計算を行いますので、xファイルやmv1ファイルに比べて読み込み時間が非常に長くなっています。


<ループ再生するモーションについて>

 モーションの中には歩きや走りといったループさせて再生を行う用途のモーションがあると思います。

 そのようなモーションの vmd ファイルは、<読み込みについて>の解説にあったファイル名の付け方にある3桁のモーションの番号の最後に半角の L をつけてください。

例:Miku000.vmd ~ Miku002.vmd の3つのファイルがあり、Miku000.vmd と Miku002.vmd が
  ループ再生用途のモーションの場合

 Miku000.vmd Miku001.vmd Miku002.vmd

         ↓

 Miku000L.vmd Miku001.vmd Miku002L.vmd


 L を付けることで関数 MV1SetLoadModelUsePhysicsMode の設定が「読み込み時に物理演算を行う」 DX_LOADMODEL_PHYSICS_LOADCALC となっている場合( デフォルトの設定は DX_LOADMODEL_PHYSICS_LOADCALC です )の物理演算がループ再生用途のモーション用にモーションの最初と最後のフレームが綺麗に繋がり自然なループ再生ができるように処理されます。
 逆にループ用途のモーションではないのに L を付けてしまうとモーションの最後の部分が変になってしまうので注意してください。
 また、L を付けても物理演算によって動く部分の動きが激しいときはやっぱりループ時に不自然な見え方になってしまいますので、 その際はリアルタイム物理演算の設定である DX_LOADMODEL_PHYSICS_REALTIME をお使いください。


<モーションの再生について>

 モーションの再生は他の形式と同じように MV1AttachAnim を使用します( AnimIndex は vmd についている番号を指定します )
 フレーム構造の違う他のモデルのモーションを使用する場合は MV1AttachAnim の NameCheck を TRUE にしてください。

サンプル

  モデルファイル DxChara.x を読み込んで画面に表示します。

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 ) ) ; // 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 MV1DuplicateModel( int SrcMHandle ) ;

概略指定のモデルと同じ基礎データを使用してモデルを作成する

引数 int SrcMHandle : 作成するモデルの基礎データを持つモデルのハンドル
戻り値 -1    : エラー発生
-1以外 : モデルのハンドル

解説  SrcMHandle が持つ基礎モデルデータを使用してモデルを作成します。
 用途としては、たとえばアクションゲームの雑魚敵など、 同じ見た目で大量に登場するキャラクターが居る場合、 その数だけ MV1LoadModel をしてしまうと同じ3Dモデルデータが幾つもメモリ上に存在することになり効率的ではありません( それに読み込み時間も掛かります )、 なのでそんな場合にはキャラクターモデル一つに付き一回だけ MV1LoadModel で読み込んで、 後は MV1LoadModel ではなく MV1DuplicateModel を使用してモデルハンドルを作成するようにすれば使用メモリ容量と読み込み時間を大幅に削減することができます。

 因みに画像ハンドルのように一つのモデルを使用して一体描画する度に位置や再生するアニメーションなどを切り替え、 再度描画するといったことをすることでモデルハンドル一つで複数のキャラクターを表現することは可能ですが、 2Dの画像一枚と違い3Dモデルには色々な状態情報が含まれていますので、キャラクターの数だけモデルハンドルを作成したほうが速度的には有利です。

 なお、作成されるモデルハンドルには、SrcMHandle が示すモデルの座標値や回転値、 アタッチしているアニメーションなど MV1LoadModel 以降に設定された情報は基本的に継承されません。 ( 特別に継承される情報を変更する関数には、その関数の解説でその旨を記載しています )



サンプル

  モデルファイル DxChara.x を読み込んだあと、同じデータを使用するモデルハンドルを3つ作成し、 それぞれ座標をずらして描画します。

Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int ModelHandle[ 4 ] ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // 3Dモデルの読み込み ModelHandle[ 0 ] = MV1LoadModel( "DxChara.x" ) ; // 同じデータを使用するモデルハンドルを3つ作成する ModelHandle[ 1 ] = MV1DuplicateModel( ModelHandle[ 0 ] ) ; ModelHandle[ 2 ] = MV1DuplicateModel( ModelHandle[ 0 ] ) ; ModelHandle[ 3 ] = MV1DuplicateModel( ModelHandle[ 0 ] ) ; // 画面に映る位置に3Dモデルを移動 MV1SetPosition( ModelHandle[ 0 ], VGet( -200.0f, -300.0f, 600.0f ) ) ; MV1SetPosition( ModelHandle[ 1 ], VGet( 150.0f, -300.0f, 600.0f ) ) ; MV1SetPosition( ModelHandle[ 2 ], VGet( 500.0f, -300.0f, 600.0f ) ) ; MV1SetPosition( ModelHandle[ 3 ], VGet( 850.0f, -300.0f, 600.0f ) ) ; // 3Dモデルの描画 MV1DrawModel( ModelHandle[ 0 ] ) ; MV1DrawModel( ModelHandle[ 1 ] ) ; MV1DrawModel( ModelHandle[ 2 ] ) ; MV1DrawModel( ModelHandle[ 3 ] ) ; // モデルハンドルの削除 MV1DeleteModel( ModelHandle[ 0 ] ) ; MV1DeleteModel( ModelHandle[ 1 ] ) ; MV1DeleteModel( ModelHandle[ 2 ] ) ; MV1DeleteModel( ModelHandle[ 3 ] ) ; // キーの入力待ち 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 MV1DeleteModel( int MHandle ) ;

概略モデルを削除する

引数 int MHandle : 削除するモデルのハンドル
戻り値 0:成功
 -1:エラー発生

解説  MHandle で渡されたモデルハンドルが示すモデルをメモリ上から削除します。
 用途はメモリの節約と、モデルハンドルの節約です。( モデルハンドルは最大で 65536 個までしか作れません )
 使用しなくなったモデルハンドルをこの関数で削除せずに次々と新たなモデルを読み込んだり MV1DuplicateModel で複製したりすると何れメモリが足りなくなるかモデルハンドルの限界数に達するかをしてしまいますので、 使用しなくなったモデルハンドルはこの関数で削除するようにしてください。

 因みに DxLib_End を呼ぶと作成されていたモデルは自動的に削除されますので、 DxLib_End の前に作成していたモデル全てに対して MV1DeleteModel をする必要はありません。

サンプル

 DxChara.x を MV1LoadModel で読み込んだ後、ひたすら MV1DuplicateModel でモデルを作成 → 描画 → MV1DeleteModel で削除を繰り返します。 ( サンプルでは MV1DeleteModel を使うために無意味に作成と削除を繰り返していますが、移動して描画する度に削除と作成をしなければいけないわけではありません )

Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int ModelHandle, DupModelHandle ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // 描画先を裏画面に変更 SetDrawScreen( DX_SCREEN_BACK ) ; // 3Dモデルの読み込み ModelHandle = MV1LoadModel( "DxChara.x" ) ; // 何かボタンが押されるかウインドウが閉じられるまでループ while( ProcessMessage() == 0 && CheckHitKeyAll() == 0 ) { // 画面をクリア ClearDrawScreen() ; // 読み込んだデータと同じデータを使用するモデルハンドルを作成する DupModelHandle = MV1DuplicateModel( ModelHandle ) ; // 画面に映るランダムな位置に3Dモデルを移動 MV1SetPosition( DupModelHandle, VGet( ( float )GetRand( 639 ), ( float )-GetRand( 300 ), GetRand( 300 ) + 300.0f ) ) ; // 3Dモデルの描画 MV1DrawModel( DupModelHandle ) ; // 3Dモデルの削除 MV1DeleteModel( DupModelHandle ) ; // 裏画面の内容を表画面に反映 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 MV1SetLoadModelUsePhysicsMode( int PhysicsMode ) ;

概略読み込むモデルの物理演算モードを設定する

引数 int PhysicsMode : 読み込むモデルに適用する物理演算モード
     DX_LOADMODEL_PHYSICS_LOADCALC  ファイル読み込み時に物理演算を行う
     DX_LOADMODEL_PHYSICS_REALTIME   リアルタイム物理演算を行う
     DX_LOADMODEL_PHYSICS_DISABLE    物理演算を使用しない
戻り値 0:成功
 -1:エラー発生

解説  MV1LoadModel で読み込まれる3Dモデルに物理演算用の情報がある場合の処理を設定します。
 物理演算用の情報がないモデルを読み込む場合はこの関数の設定は関係ありません。


DX_LOADMODEL_PHYSICS_LOADCALC  ファイル読み込み時に物理演算を行う(デフォルト)

  ファイル読み込み時にアニメーションを再生しながらの物理演算をシミュレーション(計算)して、
 その結果をアニメーションに含めてしまいます。

  物理演算用情報を持ったモデル特有の処理をしなくても物理演算の恩恵を受けることができ、
 処理負荷もアニメーションを再生しながら物理演算を行う DX_LOADMODEL_PHYSICS_REALTIME より
 低くなりますが、シミュレーションは「その場に立ち止まった状態でアニメーションを再生した」ことを
 前提として行われるため、見た目は DX_LOADMODEL_PHYSICS_REALTIME より不自然になります。


DX_LOADMODEL_PHYSICS_REALTIME  リアルタイム物理演算を行う

  DX_LOADMODEL_PHYSICS_LOADCALC と違いリアルタイムに物理演算を行います。
  リアルタイムに3Dモデルの挙動に即した物理演算が行われるため、
 DX_LOADMODEL_PHYSICS_LOADCALC より自然な動きになります。

  ただ、代わりに MV1SetScale によるスケーリングができないという点と、処理負荷が
 DX_LOADMODEL_PHYSICS_LOADCALC より高いというデメリットがあります。

  リアルタイムの物理演算には通常の3Dモデルを扱う関数のほかに実際に物理演算を行う関数
 MV1PhysicsCalculation と物理演算の状態をリセットする関数 MV1PhysicsResetState を使用します。

  尚、現時点では各モデル個別に物理演算を行うため、物理演算の情報を持つモデル同士の
 衝突などには対応していません。


DX_LOADMODEL_PHYSICS_DISABLE  物理演算を使用しない

  物理演算用の情報が含まれる3Dモデルを読み込んだ際も物理演算用の情報が
 ない3Dモデルとして扱います。

サンプル

 リアルタイム物理演算モードで Test.pmd と Test000.vmd を MV1LoadModel で読み込んで
リアルタイム物理演算を行いながらアニメーション0をループ再生します。
 尚、Test.pmd と Test000.vmd はDXライブラリのパッケージには含まれていませんので、別途用意してください。
 PMDのキャラクターは大体同じ大きさですので、カメラの設定などはそのままで問題ないと思います。

Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int ModelHandle, AttachIndex ; float TotalTime, PlayTime ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // 次に読み込むモデルの物理演算モードをリアルタイム物理演算にする MV1SetLoadModelUsePhysicsMode( DX_LOADMODEL_PHYSICS_REALTIME ) ; // 3Dモデルの読み込み ModelHandle = MV1LoadModel( "Test.pmd" ) ; // 描画先を裏画面に変更 SetDrawScreen( DX_SCREEN_BACK ) ; // カメラに映る範囲( カメラからの距離の範囲 )を設定 SetCameraNearFar( 10.0f, 1000.0f ) ; // カメラの位置と向きを設定 SetCameraPositionAndTarget_UpVecY( VGet( 0.0f, 19.0f, -22.5f ), VGet( 0.0f, 10.0f, 0.0f ) ) ; // 3Dモデルの0番目のアニメーションをアタッチする AttachIndex = MV1AttachAnim( ModelHandle, 0, -1, FALSE ) ; // アタッチしたアニメーションの総再生時間を取得する TotalTime = MV1GetAttachAnimTotalTime( ModelHandle, AttachIndex ) ; // 物理演算の状態をリセット MV1PhysicsResetState( ModelHandle ) ; // 再生時間の初期化 PlayTime = 0.0f ; // 何かキーが押されるかウインドウが閉じられるまでループ while( ProcessMessage() == 0 && CheckHitKeyAll() == 0 ) { // 画面をクリア ClearDrawScreen() ; // 再生時間を進める PlayTime += 0.5f ; // 再生時間がアニメーションの総再生時間に達したら再生時間を0に戻す if( PlayTime >= TotalTime ) { PlayTime = 0.0f ; // 再生時間をセットする MV1SetAttachAnimTime( ModelHandle, AttachIndex, PlayTime ) ; // モーションがループしたときに位置が移動することがあるので物理演算の状態をリセット MV1PhysicsResetState( ModelHandle ) ; } else { // 再生時間をセットする MV1SetAttachAnimTime( ModelHandle, AttachIndex, PlayTime ) ; } // 物理演算を60分の1秒経過したという設定で実行 MV1PhysicsCalculation( ModelHandle, 1000.0f / 60.0f ) ; // 3Dモデルの描画 MV1DrawModel( ModelHandle ) ; // 裏画面の内容を表画面に反映 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 MV1SetLoadModelPhysicsWorldGravity( float Gravity ) ;

概略読み込むモデルの物理演算に適用する重力パラメータを設定する

引数 float Gravity : Y軸方向の重力の強さ( デフォルト値:-122.5f )
戻り値 0:成功
 -1:エラー発生

解説  MV1LoadModel で読み込まれる3Dモデルに物理演算用の情報があり、且つ物理演算を行う場合に適用する重力のY軸方向の強さを設定します。
 デフォルト値は -122.5f で、値をより低くすれば( マイナス方向に値を大きくすれば )重力は強くなり、高くすれば( プラス方向に値を大きくすれば )重力は小さくなります。
 例えば値をプラスにすると空に向かって重力が働くことになります。

 この関数は MV1LoadModel を呼び出す前に使用します。

サンプル

ありません






モデル描画関係

宣言int MV1DrawModel( int MHandle ) ;

概略モデルを描画する

引数 int MHandle : 描画するモデルのハンドル
戻り値 0:成功
 -1:エラー発生

解説  MHandle のモデルハンドルが示すモデルを画面に描画します。
 用途はモデルを画面に表示したい場合など・・・

 因みに、Zバッファを使用した現状の3Dレンダリングでは半透明の描画物は視点から最も離れているものから順に描画しないと正常な見た目になりませんので、 もし描画するモデルの中に半透明の部分が含まれている場合は視点からの距離を考慮した上で MV1DrawFrameMV1DrawMesh で描画する必要があります。 ( DXライブラリ自体にZソートの機能はありません )

サンプル

 MV1LoadModel のサンプルを参考にして下さい。



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

概略モデルの指定のフレームを描画する

引数 int MHandle : 描画するモデルのハンドル
int FrrameIndex : 描画するフレームの番号
戻り値 0:成功
 -1:エラー発生

解説  MHandle のモデルハンドルが示すモデル中の FrameIndex 番目のフレームが持つメッシュ( ポリゴンの集合 )を画面に描画します。 ( DXライブラリではモデル中の階層構造を「フレーム」と呼称します。また、フレームの構造は基本的にモデルファイルの通りになります )
 フレームにメッシュが含まれていない場合は何も描画されません。

 用途としては、モデルの一部分のみを描画したい場合や、モデル中に半透明の部分がありパーツ単位で前後関係を考慮して描画しなければならない場合などに使用します。

 尚、モデル中に何個フレームがあるかは MV1GetFrameNum 関数で、各フレームの名前等はそれぞれの座標などは『フレーム関係』の関数を使用することで取得することができます。

サンプル

  モデルファイル DxChara.x を読み込んで、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( "DxChara.x" ) ; // 画面に映る位置に3Dモデルを移動 MV1SetPosition( ModelHandle, VGet( 320.0f, -300.0f, 600.0f ) ) ; // 3Dモデルの2番目のフレームを描画 MV1DrawFrame( ModelHandle, 2 ) ; // モデルハンドルの削除 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 MV1DrawMesh( int MHandle, int MeshIndex ) ;

概略モデルの指定のメッシュを描画する

引数 int MHandle : 描画するモデルのハンドル
int MeshIndex : 描画するメッシュの番号
戻り値 0:成功
 -1:エラー発生

解説  MHandle のモデルハンドルが示すモデル中の MeshIndex 番目のメッシュを描画します。 ( DXライブラリではポリゴンの集合のことを「メッシュ」と呼称します )
 モデルの一部分を描画したい場合は MV1DrawFrame 関数を使用しますが、この関数は「フレーム」より細かい単位の「メッシュ」で描画を行います。
 用途は MV1DrawFrame と同じで、フレームより細かい単位で描画したい場合や、フレーム中の一部分のみ半透明のものがあり、前後関係を考慮した上で個別に描画したい場合などに使用します。

 構造的には、メッシュは必ずどこかのフレームに所属していて、フレームが持つメッシュを全て描画するのが MV1DrawFrame 関数、その内の一つだけを描画するのが MV1DrawMesh 関数となります。

 フレームに含まれるメッシュの数ははフレームに含まれるポリゴンに使用されているマテリアル( 材質 )の数と比例します。つまり、マテリアル毎にメッシュが分かれているというわけです。
 なので、例えば「布」「金属」「革」といった3つのマテリアルを使用したフレームが存在した場合は、そのフレームが持つメッシュの数は3つになります。

 モデル中に何個メッシュがあるかは MV1GetMeshNum 関数で、各フレームに含まれるメッシュの数は MV1GetFrameMeshNum 関数で、 各フレームに含まれるメッシュの識別番号は MV1GetFrameMesh で取得することができます。
 また、各メッシュの情報を取得したり設定したりする関数は『メッシュ関係』に一覧があります。

サンプル

  モデルファイル DxChara.x を読み込んで、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( "DxChara.x" ) ; // 画面に映る位置に3Dモデルを移動 MV1SetPosition( ModelHandle, VGet( 320.0f, -300.0f, 600.0f ) ) ; // 3Dモデルの0番目のメッシュを描画 MV1DrawMesh( ModelHandle, 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 MV1DrawTriangleList( int MHandle, int TriangleListIndex ) ;

概略モデルの指定のトライアングルリストを描画する

引数 int MHandle : 描画するモデルのハンドル
int TriangleListIndex : 描画するトライアングルリストの番号
戻り値 0:成功
 -1:エラー発生

解説  MHandle のモデルハンドルが示すモデル中の TriangleListIndex 番目のトライアングルリストを描画します。
 「メッシュ」は一つ又は複数の「トライアングルリスト」から構成されています。
 普通は一つのメッシュに含まれるトライアングルリスト( 3角形ポリゴンの塊 )は一つですが、 一度に処理できるポリゴンや頂点の数が限界を超えた場合や、種類の違うタイプの頂点が一つのメッシュに混在する場合などは複数のトライアングルリストが一つのメッシュ内に含まれることがあります。
 普段3Dモデルを描画する際にメッシュ以上に細かい単位で描画することは無いのですが、 オリジナルのシェーダープログラムを使用してモデル描画を行う場合は頂点のタイプによって使用するシェーダープログラムを変更しなければならないので、 オリジナルのシェーダーを使用して、且つ複数種類の頂点が混合しているようなメッシュを描画する場合のみこの関数を使用します。  つまり滅多に使用する機会はありません。

サンプル

 ありません




モデル描画設定関数

宣言int MV1SetUseOrigShader( int UseFlag ) ;

概略モデルの描画にオリジナルシェーダープログラムを使用するかどうかを設定する

引数 int UseFlag : オリジナルのシェーダーを使用するかどうかのフラグ
           ( TRUE:使用する  FALSE:使用しない )
戻り値 0:成功
 -1:エラー発生

解説  MV1DrawModelMV1DrawFrame などのモデル描画関数を使用してモデルを描画する場合に関数 SetUseVertexShader, SetUsePixelShader で設定したシェーダーを使用するかどうかをこの関数で設定します。

 TRUE を渡してこの関数を呼び出した場合は、SetUseVertexShader と SetUsePixelShader で設定したシェーダーで描画が行われます。
 その際の頂点シェーダーに渡される頂点データの形式については LoadVertexShader の解説を参照してください。

 また、メッシュに含まれるトライアングルリストがどの頂点データ形式が頂点シェーダーに渡されるかは、以下のプログラムによって判断することができます。


int MeshNo = 0 ; // 任意のメッシュ int TriangleListIndex ; int TriangleListDataType ; // メッシュに含まれるトライアングルリスト番号 0 のモデル全体でのトライアングルリスト番号を取得 TriangleListIndex = MV1GetMeshTList( MeshNo, 0 ) ; // トライアングルリストの頂点データタイプを取得 TriangleListDataType = MV1GetTriangleListVertexType( TriangleListIndex ) ;


 上記プログラムの結果、TriangleListDataType に代入された値が

DX_MV1_VERTEX_TYPE_1FRAME の場合は
 LoadVeretxShader の解説にある「剛体メッシュの場合」のデータ形式、

DX_MV1_VERTEX_TYPE_4FRAME の場合は
 「1頂点へ影響を与えるフレームの数が1~4個のスキニングメッシュの場合」のデータ形式、

DX_MV1_VERTEX_TYPE_8FRAME の場合は
 「1頂点へ影響を与えるフレームの数が1~8個のスキニングメッシュの場合」のデータ形式、

DX_MV1_VERTEX_TYPE_NMAP_1FRAME の場合は
 「法線マップ付き剛体メッシュの場合」のデータ形式、

DX_MV1_VERTEX_TYPE_NMAP_4FRAME の場合は
 「1頂点へ影響を与えるフレームの数が1~4個の法線マップ付きスキニングメッシュの場合」のデータ形式、

DX_MV1_VERTEX_TYPE_NMAP_8FRAME の場合は
 「1頂点へ影響を与えるフレームの数が1~8個の法線マップ付きスキニングメッシュの場合」のデータ形式、

 となります。

 また、SetUseTextureToShader で特にテクスチャが設定されていない場合は3Dモデル描画時はデフォルトで

StageIndex 0 にディフューズマップテクスチャが、
StageIndex 1 に法線マップテクスチャが
StageIndex 2 にスペキュラマップテクスチャが、
StageIndex 3 にトゥーンレンダリング用のディフューズグラデーションテクスチャが、
StageIndex 4 にトゥーンレンダリング用のスペキュラグラデーションテクスチャが、
StageIndex 5 にトゥーンレンダリング用の数値飽和処理用のボリュームテクスチャが、
StageIndex 6 にトゥーンレンダリング用のスフィアマップテクスチャが、

 それぞれ存在する場合は設定されます。


 尚、この関数で TRUE を設定したとしてもプログラムを実行するPCがプログラマブルシェーダーに対応していない場合はシェーダープログラムを使用しない描画になりますので注意してください。 ( プログラマブルシェーダーが使用できるかどうかは GetValidShaderVersion で確認することができます )

サンプル

  オリジナルシェーダーを利用した3Dモデルの描画サンプルや、デフォルトのシェーダー処理についての情報などは
 こちらをご参照ください。



宣言int MV1SetSemiTransDrawMode( int DrawMode ) ;

概略モデルの半透明要素がある部分についての描画モードを設定する

引数 int DrawMode : モデルの半透明要素がある部分についての描画モード
     DX_SEMITRANSDRAWMODE_ALWAYS     : 半透明かどうか関係なく描画する( デフォルト )
     DX_SEMITRANSDRAWMODE_SEMITRANS_ONLY   : 半透明の部分のみ描画する
     DX_SEMITRANSDRAWMODE_NOT_SEMITRANS_ONLY : 半透明ではない部分のみ描画する
戻り値 0:成功
 -1:エラー発生

解説  モデルの半透明要素がある部分についての描画モードを設定します。
設定できるモードは以下の3つです。


 DX_SEMITRANSDRAWMODE_ALWAYS

  半透明の要素があるかどうか関係なく必ず描画します。
  デフォルトではこのモードになっています。


 DX_SEMITRANSDRAWMODE_SEMITRANS_ONLY

  半透明の要素がある部分のみ描画します。少しでも半透明の要素がある場合は描画され、
  半透明の要素が少しも無い場合は描画されません。


 DX_SEMITRANSDRAWMODE_NOT_SEMITRANS_ONLY

  DX_SEMITRANSDRAWMODE_SEMITRANS_ONLY とは逆に半透明の要素が少しでもある部分は
  描画されないモードです。



 この関数を呼んだ後の MV1DrawModel、MV1DrawFrame、MV1DrawMesh、MV1DrawTriangleList の呼び出しに影響を与えます。

 この関数の用途ですが、主に「描画する全ての3Dモデルの半透明要素が無い部分のみ」を先に描画して、 その後に「描画する全ての3Dモデルの半透明要素がある部分のみ」を描画するために使用します。

 何故先に「半透明要素が無い部分のみ」を描画する必要があるのかと言いますと、 それは3D描画の前後関係解決に使用されるZバッファと半透明描画の相性の悪さにあります。

 Zバッファは「3D描画を行った際の各ピクセルの奥行き」を記録しておき、 後から同じピクセルに対して3D描画された際に「前回の3D描画を行った際に記録しておいた奥行き」より 「後から行った3D描画の奥行き」の方が大きい( 奥にある )場合は描画せず、 小さい( 手前にある )場合は描画するという処理をしてくれるもので、3D描画にはとても便利( 2D描画のように手前に表示したいものを後から描画しないといけない、といった前後関係を気にする必要が無くなる為 ) な機能なのですが、この機能は半透明描画とはとても相性が悪いのです。

 例えば「半透明のもの」は本来「半透明のものより奥のもの」が透けて見えますが、 このZバッファの機能を使用しながら「半透明のもの」を「半透明のものより奥にあるもの」より先に描画してしまうと、 「半透明のものより奥にあるもの」を後から描画してもZバッファに「既にもっと手前に描画されたものがあるから描画しません」 と、本来なら「半透明のもの」が透けてその奥に見える筈の「半透明のものより奥にあるもの」が描画されないという事態を引き起こしてしまいます。

 この問題を回避するには、以下の様な手順で描画を行う必要があります。


1.半透明要素が無いものを全て描画する

2.半透明要素があるものを、奥のものから順番に描画する


 まずZバッファと相性の良い「半透明要素が無いもの」を先に全て描画してしまい 『半透明のものの奥にあるはずのものが表示されていない』という事態を回避します。

 その次に、Zバッファと相性の悪い「半透明要素があるもの」を奥のものから順番に描画します。
( 前述の通り半透明のものはZバッファを頼りにした前後関係の解決は望めないため )

 これで正常な描画結果を得ることができます。

 尚、「半透明要素があるもの」を奥のものから順番に描画しなかった場合に不都合が発生するのは

『「半透明要素があるもの」同士が画面内で重なり、
 且つ手前にある「半透明要素があるもの」が先に描画された場合』

なので、 「半透明要素があるもの」が少なく、滅多に「半透明要素があるもの」同士が画面内で重なることが無い、 重なっても一瞬で気付かない程度、という場合は「半透明要素があるもの」についても前後関係を無視して描画してしまうのもありです。 ( 奥のものから順番に描画するためのソート処理は負荷が高いことも多いので )

 改めて MV1SetSemiTransDrawMode の用途ですが、上記の「半透明要素が無いものを先に全て描画する」 「半透明要素があるものを後から全て描画する」を実現するために使用します。

 「半透明要素が無いものを先に全て描画する」を行う場合は DrawMode に DX_SEMITRANSDRAWMODE_NOT_SEMITRANS_ONLY を渡して MV1SetSemiTransDrawMode を呼び出した後に全ての3Dモデルを MV1DrawModel で描画、

 「半透明要素があるものを後から全て描画する」を行う場合は DrawMode に  DX_SEMITRANSDRAWMODE_SEMITRANS_ONLY を渡して MV1SetSemiTransDrawMode を呼び出した後に全ての3Dモデルを MV1DrawModel で描画します。

サンプル

  画面左側に通常の設定で半透明の3Dモデルと不透明の3Dモデルを描画、画面右側に解説にある
 手順で同様に半透明の3Dモデルと不透明の3Dモデルを描画して結果を比較するサンプルです。

Windows用
#include "DxLib.h" #define CHARA_SPACE (300.0f) #define CHARA_X (250.0f) int CharaModelHandle ; // キャラクターモデルの描画 void Chara_Draw( float x ) { int i ; // 手前から2体描画 for( i = 0 ; i < 2 ; i ++ ) { // 先頭のキャラを半透明にする MV1SetOpacityRate( CharaModelHandle, i == 0 ? 0.5f : 1.0f ) ; // 座標を設定 MV1SetPosition( CharaModelHandle, VGet( x, 0.0f, i * CHARA_SPACE ) ) ; // モデルを描画 MV1DrawModel( CharaModelHandle ) ; } } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら終了 return -1 ; } // 描画先を裏画面に変更 SetDrawScreen( DX_SCREEN_BACK ) ; // キャラクターモデルの読み込み CharaModelHandle = MV1LoadModel( "DxChara.x" ) ; // カメラの位置と向きを設定 SetCameraPositionAndTarget_UpVecY( VGet( 0.0f, 400.0f, -700.0f ), VGet( 0.0f, 400.0f, 0.0f ) ); // 描画する奥行き方向の範囲を設定 SetCameraNearFar( 20.0f, 5000.0f ); // 背景の色を灰色に変更 SetBackgroundColor( 128,128,128 ) ; // 画面をクリア ClearDrawScreen() ; // メインループ while( ProcessMessage() == 0 ) { // 画面をクリア ClearDrawScreen() ; // 通常の設定で画面左側にキャラクターを描画 MV1SetSemiTransDrawMode( DX_SEMITRANSDRAWMODE_ALWAYS ) ; Chara_Draw( -CHARA_X ) ; // 画面右側に先に半透明要素の無い3Dモデルのみ描画する設定でキャラクターを描画した後、 // 半透明要素のある3Dモデルのみ描画する設定でキャラクターを描画する MV1SetSemiTransDrawMode( DX_SEMITRANSDRAWMODE_NOT_SEMITRANS_ONLY ) ; Chara_Draw( CHARA_X ) ; MV1SetSemiTransDrawMode( DX_SEMITRANSDRAWMODE_SEMITRANS_ONLY ) ; Chara_Draw( CHARA_X ) ; // 裏画面の内容を表画面に反映 ScreenFlip() ; } // モデルハンドルの削除 MV1DeleteModel( CharaModelHandle ) ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }

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






モデル基本制御関係

宣言int MV1SetPosition( int MHandle, VECTOR Position ) ;

概略モデルの座標をセットする

引数 int    MHandle : モデルのハンドル
VECTOR Position : モデルにセットする座標
戻り値 0:成功
 -1:エラー発生

解説  MHandle のモデルハンドルが示すモデルの座標をセットします。

 グラフィックハンドルでは座標やスケールと言ったものは画像自体には保持せず DrawGraphDrawExtendGraph などの描画関数を呼ぶ際に直接指定していましたが、 3Dモデルは設定すべき情報が多く、項目の数に合わせて描画関数のバリエーションを増やしたらとんでもないことになってしまうので、 この MV1SetPosition などの関数で描画を行う前に予め座標や回転値を設定するようになっています。

 座標は VECTOR 型の構造体( float x, y, z をメンバ変数に持つ構造体 )が引数になっていて、 いちいち VECTOR 構造体を定義してメンバ変数に座標値を代入して、という手順を踏まなければならなくて面倒ですが、 x, y, z の値を引数で渡すと VECTOR 構造体を戻り値として返してくれる VGet 関数を使用すれば面倒ではなくなります。

// 普通に引数を渡そうとすると面倒・・・ VECTOR Position ; Position.x = 0.0f ; Position.y = 400.0f ; Position.z = -600.0f ; MV1SetPosition( MHandle, Position ) ; ----------------------------------------------- // VGet 関数を使用すれば簡単 MV1SetPosition( MHandle, VGet( 0.0f, 400.0f, -600.0f ) ) ;


サンプル

 MV1LoadModel のサンプルを参考にして下さい。



宣言VECTOR MV1GetPosition( int MHandle ) ;

概略モデルの座標を取得する

引数 int MHandle : モデルのハンドル
戻り値モデルの座標

解説  MHandle のモデルハンドルが示すモデルの座標を取得します。
 MV1SetPosition でセットした座標を取得するだけの関数です。

サンプル

ありません



宣言int MV1SetScale( int MHandle, VECTOR Scale ) ;

概略モデルの拡大値をセットする

引数 int    MHandle : モデルのハンドル
VECTOR Scale  : 拡大値
戻り値 0:成功
 -1:エラー発生

解説  MHandle のモデルハンドルが示すモデルの拡大値を設定します。
 Scale で渡す VECTOR 構造体の各メンバ変数( x, y, z )の値を 2.0f にするとモデルが2倍の大きさに、逆に 0.5f 等にすると半分の大きさになります。 尚、マイナスの値を渡すと見た目が破綻します。

サンプル

  モデルファイル DxChara.x を読み込んで、x軸方向に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( "DxChara.x" ) ; // 画面に映る位置に3Dモデルを移動 MV1SetPosition( ModelHandle, VGet( 320.0f, -300.0f, 600.0f ) ) ; // 3Dモデルのスケールをx軸方向に2倍にする MV1SetScale( ModelHandle, VGet( 2.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用のプログラムと同じです。




宣言VECTOR MV1GetScale( int MHandle ) ;

概略モデルの拡大値を取得する

引数 int MHandle : モデルのハンドル
戻り値モデルの拡大値

解説  MHandle のモデルハンドルが示すモデルの拡大値を取得します。
 MV1SetScale でセットした拡大値を取得するだけの関数です。

サンプル

ありません



宣言int MV1SetRotationXYZ( int MHandle, VECTOR Rotate ) ;

概略モデルの回転値をセットする

引数 int    MHandle : モデルのハンドル
VECTOR Rotate  : 回転値( 単位はラジアン )
戻り値 0:成功
 -1:エラー発生

解説  MHandle のモデルハンドルが示すモデルの回転値を設定します。
 Rotate で渡す VECTOR 構造体の各メンバ変数( x, y, z )の値はそれぞれ x軸回転値、y軸回転値、z軸回転値を代入しておきます。 ( 回転値の単位はラジアンですので、度数単位の値を代入する場合は 度 * DX_PI_F / 180.0f の計算をしてください )

 キャラクターモデルの向いている方向を設定する場合は y軸回転を使用します。

 尚、回転の順番は x軸回転 → y軸回転 → z軸回転 です。

サンプル

  モデルファイル DxChara.x を読み込んで、y軸を回転軸として90度回転して描画します。

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 ) ) ; // 3DモデルのY軸の回転値を90度にセットする MV1SetRotationXYZ( ModelHandle, VGet( 0.0f, 90.0f * DX_PI_F / 180.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用のプログラムと同じです。




宣言VECTOR MV1GetRotationXYZ( int MHandle ) ;

概略モデルの回転値を取得する

引数 int MHandle : モデルのハンドル
戻り値モデルの回転値

解説  MHandle のモデルハンドルが示すモデルの回転値を取得します。
 MV1SetRotationXYZ でセットした回転値を取得するだけの関数です。

サンプル

ありません



宣言int MV1SetRotationZYAxis( int MHandle, VECTOR ZAxis, VECTOR YAxis, float ZTwist ) ;

概略モデルのZ軸とY軸の方向をセットする

引数 int    MHandle : モデルのハンドル
VECTOR ZAxis : Z軸の方向
VECTOR YAxis : Y軸の方向
float   ZTwist : ZAxis を回転軸とした回転値( 単位はラジアン )
戻り値 0:成功
 -1:エラー発生

解説  MHandle のモデルハンドルが示すモデルの回転値をZ軸の方向、Y軸の方向と、ZAxis で指定した方向を軸とした回転値で設定します。 ( ZAxis, YAxis は正規化されている必要はありません )

 この関数は何かのモデルをある方向に向けたい場合などに使用します。( 砲台を敵の方向に向けるなど )

サンプル

  モデルファイル DxChara.x を読み込んで、モデルのz軸の方向を画面左上の方に向けて描画します。

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, 0.0f, 600.0f ) ) ; // 3DモデルのZ軸を画面左上方向に向ける // ( DxChara.x はZ軸のマイナス方向に向いているので右下方向に傾きます ) MV1SetRotationZYAxis( ModelHandle, VGet( -0.5f, 0.5f, 0.0f ), VGet( 0.5f, 0.5f, 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用のプログラムと同じです。




宣言int MV1SetMatrix( int MHandle, MATRIX Matrix ) ;

概略モデルの座標変換用行列をセットする

引数 int    MHandle : モデルのハンドル
MATRIX Matrix : 座標変換用行列
戻り値 0:成功
 -1:エラー発生

解説  MHandle のモデルハンドルが示すモデルの座標変換用行列をセットします。

 この関数は MV1SetPosition 関数や MV1SetScaleMV1SetRotationXYZ関数などの代わりに行列を使用してローカル → ワールド座標変換を行いたい場合に使用します。

 この関数に単位行列以外の行列を渡すと、以後 MV1SetPosition や MV1SetScale 等の関数の設定は無視され、 MV1SetMatrix 関数で設定した行列のみを使用してローカル → ワールド座標変換が行われるようになります。 ( 解除する場合は MV1SetMatrix 関数に単位行列を渡します )

サンプル

  モデルファイル DxChara.x を読み込んで、拡大率を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( "DxChara.x" ) ; // 2倍に拡大した後画面に映る位置に3Dモデルを移動する行列のセット MV1SetMatrix( ModelHandle, MMult( MGetScale( VGet( 2.0f, 2.0f, 2.0f ) ), MGetTranslate( VGet( 320.0f, -600.0f, 600.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用のプログラムと同じです。




宣言MATRIX MV1GetMatrix( int MHandle ) ;

概略モデルの座標変換用行列を取得する

引数 int MHandle : モデルのハンドル
戻り値モデルの座標変換用行列

解説  MHandle のモデルハンドルが示すモデルの座標変換用行列を取得します。
 事前に MV1SetMatrix で行列を設定していた場合はその値が、 設定していなかった場合は MV1SetPositionMV1SetScale 等の関数で設定した値の結果( 行列 )が返ってきます。

サンプル

  モデルファイル DxChara.x を読み込んで複製した後、最初に読み込んだモデルハンドルの方に座標位置変更や拡大率の設定を行い、 その結果の行列を複製したモデルに設定して描画します。

Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int ModelHandle, SubModelHandle ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // 3Dモデルの読み込み ModelHandle = MV1LoadModel( "DxChara.x" ) ; // ModelHandle と同じモデルを使用するモデルの作成 SubModelHandle = MV1DuplicateModel( ModelHandle ) ; // 画面に映る位置に3Dモデルを移動 MV1SetPosition( ModelHandle, VGet( 320.0f, 0.0f, 600.0f ) ) ; // 3Dモデルの拡大率を0.5倍にする MV1SetScale( ModelHandle, VGet( 0.5f, 0.5f, 0.5f ) ) ; // ModelHandle に設定した座標変換パラメータの結果の行列を SubModelHandle の座標変換行列として設定する MV1SetMatrix( SubModelHandle, MV1GetMatrix( ModelHandle ) ) ; // SubModelHandle の方の3Dモデルを描画 MV1DrawModel( SubModelHandle ) ; // モデルハンドルの削除 MV1DeleteModel( ModelHandle ) ; MV1DeleteModel( SubModelHandle ) ; // キーの入力待ち 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 MV1SetVisible( int MHandle, int VisibleFlag ) ;

概略モデルを描画するかどうかを変更する

引数 int MHandle : モデルのハンドル
int VisibleFlag : 描画するかどうか( TRUE:表示する FALSE:表示しない )
戻り値 0:成功
 -1:エラー発生

解説  MHandle のモデルハンドルが示すモデルを描画するかどうかを設定します。
 この関数で描画しない設定にすると、以後 MV1DrawModel 等の描画関数を使用しても描画されなくなります。

サンプル

  モデルファイル DxChara.x を GetNowCount が返す値が奇数秒の時だけ描画する。

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" ) ; // 描画先を裏画面に変更 SetDrawScreen( DX_SCREEN_BACK ) ; // 画面に映る位置に3Dモデルを移動 MV1SetPosition( ModelHandle, VGet( 320.0f, -300.0f, 600.0f ) ) ; // 何かキーが押されるかウインドウが閉じられるまでループする while( ProcessMessage() == 0 && CheckHitKeyAll() == 0 ) { // 画面をクリアする ClearDrawScreen() ; // 3Dモデルをカウンタが奇数秒の時は描画して、偶数表のときは描画しないようにする if( GetNowCount() % 2000 < 1000 ) { MV1SetVisible( ModelHandle, TRUE ) ; } else { MV1SetVisible( ModelHandle, FALSE ) ; } // 3Dモデルの描画 MV1DrawModel( ModelHandle ) ; // 裏画面の内容を表画面に反映 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 MV1GetVisible( int MHandle ) ;

概略モデルを描画するかどうかを取得する

引数 int MHandle : モデルのハンドル
戻り値 TRUE:モデルを描画する FALSE:モデルを描画しない
 -1:エラー発生

解説  MHandle のモデルハンドルが示すモデルを描画するかどうかの設定値を取得します。
 MV1SetVisible でセットした設定値を取得するだけの関数です。

サンプル

ありません



宣言int MV1SetDifColorScale( int MHandle, COLOR_F Scale ) ;

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

引数 int     MHandle : モデルのハンドル
COLOR_F Scale  : カラースケール値( 0.0f ~ 1.0f = 0% ~ 100% )
戻り値 0:成功
 -1:エラー発生

解説  MHandle のモデルハンドルが示すモデルのマテリアルのディフューズカラー( 拡散光色 )のスケール値を設定します。

 例えばこの関数の引数で渡す Scale の 赤、緑、青、α成分の内の 緑とα成分を 1.0f、他を 0.0f にして呼ぶと、 モデル描画時にマテリアル中のディフューズカラーの緑成分とα成分以外が 0.0f として描画されます。

 用途としては選択されているモデルの表現や、簡単な色違い表現などがあります。

 因みに引数の COLOR_F は float r, g, b, a を持つ構造体です。
これの実体を定義してメンバ変数に値を代入して引数に渡す、と言うことをすると非常に面倒なので、 引数に r, g, b, a の値を渡すと COLOR_F 構造体を戻り値として返す関数 GetColorF を使用すると便利です。

// ディフューズカラーの赤成分を50%にする MV1SetDifColorScale( ModelHandle, GetColorF( 0.5f, 1.0f, 1.0f, 1.0f ) ) ;


サンプル

  モデルファイル DxChara.x のディフューズカラーの緑成分と青成分を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( "DxChara.x" ) ; // 画面に映る位置に3Dモデルを移動 MV1SetPosition( ModelHandle, VGet( 320.0f, -300.0f, 600.0f ) ) ; // 3Dモデルのディフューズカラーの緑成分と青成分を0%にする MV1SetDifColorScale( ModelHandle, 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 MV1GetDifColorScale( int MHandle ) ;

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

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

解説  MHandle のモデルハンドルが示すモデルを描画する際にマテリアルのディフューズカラーに適用するスケール値を取得します。
 MV1SetDifColorScale でセットした設定値を取得するだけの関数です。

サンプル

ありません



宣言int MV1SetSpcColorScale( int MHandle, COLOR_F Scale ) ;

概略モデルのスペキュラカラーのスケール値を設定する

引数 int     MHandle : モデルのハンドル
COLOR_F Scale  : カラースケール値( 0.0f ~ 1.0f = 0% ~ 100% )
戻り値 0:成功
 -1:エラー発生

解説  MHandle のモデルハンドルが示すモデルのマテリアルのスペキュラカラー( 反射光色 )のスケール値を設定します。

 例えばこの関数の引数で渡す Scale の 赤、緑、青、α成分の内の 緑とα成分を 1.0f、他を 0.0f にして呼ぶと、 モデル描画時にマテリアル中のスペキュラカラーの緑成分とα成分以外が 0.0f として描画されます。

 用途としては光沢があるオブジェクトの光沢の色を変化させたり、光沢を無くしたりすることができます。

 因みに、モデルのマテリアルに設定されているスペキュラカラー値に対するスケールなので、 設定対象のモデルのマテリアルに元々スペキュラカラー成分が無い場合( スペキュラカラー成分 r, g, b, a が 0.0f の場合 )はスケール値を何にしても見た目の変化はありません。
サンプル

  モデルファイル DxChara.x のスペキュラカラーの緑成分と青成分を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( "DxChara.x" ) ; // 画面に映る位置に3Dモデルを移動 MV1SetPosition( ModelHandle, VGet( 320.0f, -300.0f, 600.0f ) ) ; // 3Dモデルのスペキュラカラーの緑成分と青成分を0%にする MV1SetSpcColorScale( ModelHandle, 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 MV1GetSpcColorScale( int MHandle ) ;

概略モデルのスペキュラカラーのスケール値を取得する

引数 int MHandle : モデルのハンドル
戻り値スペキュラカラーのスケール値

解説  MHandle のモデルハンドルが示すモデルを描画する際にマテリアルのスペキュラカラーに適用するスケール値を取得します。
 MV1SetSpcColorScale でセットした設定値を取得するだけの関数です。

サンプル

ありません



宣言int MV1SetEmiColorScale( int MHandle, COLOR_F Scale ) ;

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

引数 int     MHandle : モデルのハンドル
COLOR_F Scale  : カラースケール値( 0.0f ~ 1.0f = 0% ~ 100% )
戻り値 0:成功
 -1:エラー発生

解説  MHandle のモデルハンドルが示すモデルのマテリアルのエミッシブカラー( 自己発光色 )のスケール値を設定します。

 例えばこの関数の引数で渡す Scale の 赤、緑、青、α成分の内の 緑とα成分を 1.0f、他を 0.0f にして呼ぶと、 モデル描画時にマテリアル中のエミッシブカラーの緑成分とα成分以外が 0.0f として描画されます。

 用途としては自己発光しているオブジェクトの自己発光を止めたり、自己発光の色を変化させたりすることができます。

 因みに、モデルのマテリアルに設定されているエミッシブカラー値に対するスケールなので、 設定対象のモデルのマテリアルに元々エミッシブカラー成分が無い場合( エミッシブカラー成分 r, g, b, a が 0.0f の場合 )はスケール値を何にしても見た目の変化はありません。

サンプル

  モデルファイル DxChara.x のエミッシブカラーの緑成分と青成分を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( "DxChara.x" ) ; // 画面に映る位置に3Dモデルを移動 MV1SetPosition( ModelHandle, VGet( 320.0f, -300.0f, 600.0f ) ) ; // 3Dモデルのエミッシブカラーの緑成分と青成分を0%にする MV1SetEmiColorScale( ModelHandle, 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 MV1GetEmiColorScale( int MHandle ) ;

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

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

解説  MHandle のモデルハンドルが示すモデルを描画する際にマテリアルのエミッシブカラーに適用するスケール値を取得します。
 MV1SetEmiColorScale でセットした設定値を取得するだけの関数です。

サンプル

ありません



宣言int MV1SetAmbColorScale( int MHandle, COLOR_F Scale ) ;

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

引数 int     MHandle : モデルのハンドル
COLOR_F Scale  : カラースケール値( 0.0f ~ 1.0f = 0% ~ 100% )
戻り値 0:成功
 -1:エラー発生

解説  MHandle のモデルハンドルが示すモデルのマテリアルのアンビエントカラー( 環境光色 )のスケール値を設定します。

 例えばこの関数の引数で渡す Scale の 赤、緑、青、α成分の内の 緑とα成分を 1.0f、他を 0.0f にして呼ぶと、 モデル描画時にマテリアル中のアンビエントカラーの緑成分とα成分以外が 0.0f として描画されます。

 用途はあまり思いつきませんが、環境光の影響を受けたり受けなかったりを変化させることができます。

 因みに、モデルのマテリアルに設定されているアンビエントカラー値に対するスケールなので、 設定対象のモデルのマテリアルに元々アンビエントカラー成分が無い場合( アンビエントカラー成分 r, g, b, a が 0.0f の場合 )はスケール値を何にしても見た目の変化はありません。

サンプル

  モデルファイル DxChara.x のアンビエントカラーの緑成分と青成分を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( "DxChara.x" ) ; // 画面に映る位置に3Dモデルを移動 MV1SetPosition( ModelHandle, VGet( 320.0f, -300.0f, 600.0f ) ) ; // 3Dモデルのアンビエントカラーの緑成分と青成分を0%にする MV1SetAmbColorScale( ModelHandle, 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 MV1GetAmbColorScale( int MHandle ) ;

概略モデルのアンビエントカラーのスケール値を取得する

引数 int MHandle : モデルのハンドル
戻り値アンビエントカラーのスケール値

解説  MHandle のモデルハンドルが示すモデルを描画する際にマテリアルのアンビエントカラーに適用するスケール値を取得します。
 MV1SetAmbColorScale でセットした設定値を取得するだけの関数です。

サンプル

ありません



宣言int MV1GetSemiTransState( int MHandle ) ;

概略モデルに半透明要素があるかどうかを取得する

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

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

 例えば、モデル中のどれかのマテリアルのテクスチャに半透明の部分があったり、 モデル中のどれかのフレームの不透明度が 1.0f ではなかったりすると TRUE が返ってきます。

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

サンプル

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

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モデルの不透明度を設定する MV1SetOpacityRate( ModelHandle, OpacityRate ) ; // 3Dモデルの描画 MV1DrawModel( ModelHandle ) ; // 現在の不透明度と、MV1GetSemiTransState の戻り値を描画する DrawFormatString( 0, 0, GetColor( 255,255,255 ), "ESC Key:Exit OpacityRate:%f SemiTransState:%d", OpacityRate, MV1GetSemiTransState( ModelHandle ) ) ; // 裏画面の内容を表画面に反映 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 MV1SetOpacityRate( int MHandle, float Rate ) ;

概略モデルの不透明度を設定する

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

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

 Rate の値が 0.0f に近いほど不透明度が下がり( 透明度が上がり )、 1.0f に近いほど不透明度が上がり( 透明度が下がり )ます。

 モデルを半透明で表示したかったり、だんだん透明になって消えていくなどの演出をしたい場合に使用します。

サンプル

  モデルファイル DxChara.x の不透明度を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( "DxChara.x" ) ; // 透明で描画されているということが分かるように画面全体を赤で塗りつぶす DrawBox( 0, 0, 640, 480, GetColor( 255,0,0 ), TRUE ) ; // 画面に映る位置に3Dモデルを移動 MV1SetPosition( ModelHandle, VGet( 320.0f, -300.0f, 600.0f ) ) ; // 3Dモデルの不透明度を50%にする MV1SetOpacityRate( ModelHandle, 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 MV1GetOpacityRate( int MHandle ) ;

概略モデルの不透明度を取得する

引数 int MHandle : モデルのハンドル
戻り値モデルに設定されている不透明度

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

サンプル

ありません



宣言int MV1SetUseZBuffer( int MHandle, int Flag ) ;

概略モデルを描画する際にZバッファを使用するかどうかを設定する

引数 int MHandle : モデルのハンドル
int Flag : Zバッファを使用するかどうかのフラグ
      ( TRUE:使用する( 初期設定 ) FALSE:使用しない )
戻り値 0:成功
 -1:エラー発生

解説  MHandle のモデルハンドルを描画する際にZバッファを使用するかどうかを設定します。

 SetUseZBuffer3D のモデル用の関数で、 効果は SetUseZBuffer3D と全く同じです。 ( Zバッファの詳しい説明は SetUseZBuffer3D 関数の解説に記述してあります )

サンプル

ありません



宣言int MV1SetWriteZBuffer( int MHandle, int Flag ) ;

概略モデルを描画する際にZバッファを使用するかどうかを設定する

引数 int MHandle : モデルのハンドル
int Flag : Zバッファに書き込みを行うかどうかのフラグ
      ( TRUE:書き込む( 初期設定 ) FALSE:書き込まない )
戻り値 0:成功
 -1:エラー発生

解説  MHandle のモデルハンドルを描画する際にZバッファを使用するかどうかを設定します。

 SetWriteZBuffer3D のモデル用の関数で、 効果は SetWriteZBuffer3D と全く同じです。 ( Zバッファの詳しい説明は SetUseZBuffer3D 関数の解説に記述してあります )

サンプル

ありません



宣言int MV1SetUseVertDifColor( int MHandle, int UseFlag ) ;

概略モデル描画のライティング計算に頂点データのディフューズカラーを使用するかどうかを設定する

引数 int MHandle : モデルのハンドル
int UseFlag : 頂点データのディフューズカラーを使用するかどうか
        ( TRUE=使用する( デフォルト )  FALSE=使用しない )
戻り値 0:成功
 -1:エラー発生

解説  MHandle のモデルハンドルを描画する際のライティング計算に頂点データのディフューズカラーをマテリアルのディフューズカラーとして使用するかどうかを設定します。( 初期設定では使用しません )

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

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

サンプル

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



宣言int MV1SetUseVertSpcColor( int MHandle, int UseFlag ) ;

概略モデル描画のライティング計算に頂点データのスペキュラカラーを使用するかどうかを設定する

引数 int MHandle : モデルのハンドル
int UseFlag : 頂点データのスペキュラカラーを使用するかどうか
        ( TRUE=使用する( デフォルト )  FALSE=使用しない )
戻り値 0:成功
 -1:エラー発生

解説  MHandle のモデルハンドルを描画する際のライティング計算に頂点データのスペキュラカラーをマテリアルのスペキュラカラーとして使用するかどうかを設定します。( 初期設定では使用しません )

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

 尚、ライティング計算を SetUseLighting 関数で無効にした場合はこの関数の設定に関係なくマテリアルのスペキュラカラーは無視され、頂点スペキュラカラーが使用されます。

サンプル

ありません



宣言int MV1PhysicsCalculation( int MHandle, float MillisecondTime ) ;

概略モデルの物理演算を指定時間分経過したと仮定して計算する

引数 int MHandle      : モデルのハンドル
float MillisecondTime : 経過時間( 単位:ミリ秒 )
戻り値 0:成功
 -1:エラー発生

解説  関数 MV1SetLoadModelUsePhysicsModeを使用して読み込む3Dモデルに対してリアルタイム物理演算を行うように指定した上で、 物理演算用の情報を持つ3Dモデルを関数 MV1LoadModel で読み込んだ場合に、この関数を使用して実際の物理演算を行います。

 引数の MillisecondTime で経過したと仮定する時間を指定します。
 単位はミリ秒( 1秒は 1000.0fミリ秒 )です、通常のゲームは1秒間に60回、 若しくは30回画面が更新されるので、これに基づいて引数を指定する場合は

1秒間に60回の場合は1回に 1000.0f ミリ秒の60分の1分だけ処理するので

  1000.0f / 60.0f = 16.66667f

1秒間に30回の場合は1回に 1000.0f ミリ秒の30分の1分だけ処理するので

  1000.0f / 30.0f = 33.33333f

となります。

 この関数の結果はモデルの位置や姿勢を変更する関数( MV1SetPositionMV1SetRotationXYZMV1SetMatrixMV1AttachAnimMV1SetAttachAnimTime )を使用すると無効になってしまいますので、物理演算の結果を描画する場合は必ず

 MV1SetPosition や MV1SetRotationXYZ、MV1SetAttachAnimTime などの関数で姿勢を決定した後

に、この関数を実行するようにしてください。

<注意>
リアルタイム物理演算を使用する場合は MV1SetScale によるスケーリングを行うと正常な演算結果が得られなくなりますので MV1SetScale を使用する場合はリアルタイム物理演算は行わないでください。

サンプル

 リアルタイム物理演算モードで Test.pmd を MV1LoadModel で読み込んで
リアルタイム物理演算を行いながらキーボードの上下左右でモデルの位置を移動します。
 尚、Test.pmd はDXライブラリのパッケージには含まれていませんので、別途用意してください。
 PMDのキャラクターは大体同じ大きさですので、カメラの設定などはそのままで問題ないと思います。

Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int ModelHandle ; int PosX, PosZ, PosY ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // 次に読み込むモデルの物理演算モードをリアルタイム物理演算にする MV1SetLoadModelUsePhysicsMode( DX_LOADMODEL_PHYSICS_REALTIME ) ; // 3Dモデルの読み込み ModelHandle = MV1LoadModel( "Test.pmd" ) ; // 描画先を裏画面に変更 SetDrawScreen( DX_SCREEN_BACK ) ; // カメラに映る範囲( カメラからの距離の範囲 )を設定 SetCameraNearFar( 10.0f, 1000.0f ) ; // カメラの位置と向きを設定 SetCameraPositionAndTarget_UpVecY( VGet( 0.0f, 19.0f, -22.5f ), VGet( 0.0f, 10.0f, 0.0f ) ) ; // 座標をリセット PosX = 0 ; PosY = 0 ; PosZ = 0 ; // ウインドウが閉じられるまでループ while( ProcessMessage() == 0 ) { // 画面をクリア ClearDrawScreen() ; // キーボードの上下左右でモデルの座標を変更 // ( シフトキーを押しながら上下キーでモデルを上下に移動 ) if( CheckHitKey( KEY_INPUT_LSHIFT ) ) { if( CheckHitKey( KEY_INPUT_DOWN ) ) PosY -- ; if( CheckHitKey( KEY_INPUT_UP ) ) PosY ++ ; } else { if( CheckHitKey( KEY_INPUT_LEFT ) ) PosX -- ; if( CheckHitKey( KEY_INPUT_RIGHT ) ) PosX ++ ; if( CheckHitKey( KEY_INPUT_DOWN ) ) PosZ -- ; if( CheckHitKey( KEY_INPUT_UP ) ) PosZ ++ ; } // モデルの座標をセット MV1SetPosition( ModelHandle, VGet( PosX * 0.5f, PosY * 0.5f, PosZ * 0.5f ) ) ; // 物理演算を60分の1秒経過したという想定で実行 MV1PhysicsCalculation( ModelHandle, 1000.0f / 60.0f ) ; // 3Dモデルの描画 MV1DrawModel( ModelHandle ) ; // 裏画面の内容を表画面に反映 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用のプログラムと同じです。





戻る