アニメーション関係

宣言int MV1AttachAnim( int MHandle, int AnimIndex, int AnimSrcMHandle, int NameCheck ) ;

概略アニメーションをアタッチする

引数 int MHandle      : アニメーションをアタッチするモデルのハンドル
int AnimIndex     : アタッチするアニメーション番号
int AnimSrcMHandle : アタッチするアニメーションを持っているモデルのハンドル
               ( -1 を渡すと MHandle と同じモデルハンドルが使用されます )
int NameCheck    : AnimSrcMHandle が -1 以外の場合にアタッチするアニメーションの
              フレームの名前とアタッチされる側のモデルのフレームの名前が
              一致していない場合アタッチしないかどうか
              ( TRUE:アタッチしない FALSE:アタッチする )
              この引数は AnimSrcMHandle が -1 の場合は無視されます
戻り値-1以外:アニメーションアタッチ番号
 -1:エラー発生

解説  MHandle のモデルハンドルが示すモデルにアニメーションをアタッチします。

 アニメーションとは主にモデル内のフレームに対する動きのデータで、 キャラクターモデルが歩いたり走ったりといった表現をする際に使用します。 ( アニメーションのデータ自体は予めアニメーションデータを作成できるソフトを使用して作成しておく必要があります )

 DXライブラリではアニメーションを再生する際に、 最初に再生したいアニメーションを指定する作業「アニメーションのアタッチ」をする必要があります。

 アタッチ自体は簡単で、この関数でアタッチしたいアニメーションの番号を渡すだけです。

 そして、アニメーションのアタッチが無事完了すると戻り値としてアタッチ番号が返ってきます。
 これは「ハンドル」と呼べるほどのものではありませんが、 モデルハンドルなどと同様にアタッチしたアニメーションに関する操作はすべてこのアタッチ番号を使用して行いますので、 アタッチ番号もモデルハンドルなどと同じように何かの変数にとっておく必要があります。

// 例 : モデルに含まれる 0番目のアニメーションをアタッチしてアニメーションの総時間を取得する int AttachIndex ; float AnimTime ; AttachIndex = MV1AttachAnim( MHandle, 0, -1, FALSE ) ; AnimTime = MV1GetAttachAnimTotalTime( MHandle, AttachIndex ) ;

 アニメーションはアタッチした時点でアタッチしたアニメーションのカウント0の状態がモデルに反映されます。
 そして、アニメーションの再生カウントを変更する際は MV1SetAttachAnimTime を使用します。
 DXライブラリには自動的にカウンタを進める仕組みはありませんので、 「MV1PlayAnim」 や 「MV1StopAnim」 のような名称の関数は存在しません。
 なので、MV1SetAttachAnimTime にセットする再生時間を徐々に進めることでアニメーションを再生します。

 引数 AnimSrcMHandle は同じフレーム構造を持った MHandle とは別のモデルのモデルに含まれているアニメーションを MHandle のモデルで再生する際に使用します。 ( 同じアニメーションを使用する見た目の違うキャラクターモデルが複数ある場合などは、 アニメーションだけのファイルと見た目の違うフレーム構造が同じメッシュだけのファイルを別々に用意することで各キャラクターモデルのファイルにはアニメーションデータを含める必要がなくなるので、 アニメーションデータの容量分だけデータサイズを削減することができます )

 引数 NameCheck は AnimSrcMHandle を使用して別のモデルファイルに含まれるアニメーションをアタッチする場合に、 アニメーションデータ側のフレームの名前とモーションをアタッチするモデルデータ側のフレームの名前を比較して違った場合はアタッチしないという処理をするかどうかを指定する引数で、 TRUE を渡すと比較して、FALSE を渡すと比較しません。

 名前を比較しない場合はフレームの階層構造と各階層のフレームの数がモデル側とアニメーション側で完全に一致していないと正常にアニメーションを再生することができません。
 名前を比較する場合はフレームの階層構造と名前が一致していればモデル側にあってアニメーション側に無いフレームがあっても正常にアニメーションを再生することができます。 ( ただし、同じ階層に同名のフレームが複数ある場合は正常にアニメーションを再生することはできません )

 名前比較を行うかどうかはアタッチするモーションデータにあわせて判断してください。

サンプル

  モデルファイル DxChara.x に含まれる0番目のアニメーションをループ再生します。

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 ; } // 3Dモデルの読み込み ModelHandle = MV1LoadModel( "DxChara.x" ) ; // 描画先を裏画面に変更 SetDrawScreen( DX_SCREEN_BACK ) ; // 画面に映る位置に3Dモデルを移動 MV1SetPosition( ModelHandle, VGet( 320.0f, -300.0f, 600.0f ) ) ; // 3Dモデルの0番目のアニメーションをアタッチする AttachIndex = MV1AttachAnim( ModelHandle, 0, -1, FALSE ) ; // アタッチしたアニメーションの総再生時間を取得する TotalTime = MV1GetAttachAnimTotalTime( ModelHandle, AttachIndex ) ; // 再生時間の初期化 PlayTime = 0.0f ; // 何かキーが押されるかウインドウが閉じられるまでループ while( ProcessMessage() == 0 && CheckHitKeyAll() == 0 ) { // 画面をクリア ClearDrawScreen() ; // 再生時間を進める PlayTime += 100.0f ; // 再生時間がアニメーションの総再生時間に達したら再生時間を0に戻す if( PlayTime >= TotalTime ) { PlayTime = 0.0f ; } // 再生時間をセットする MV1SetAttachAnimTime( ModelHandle, AttachIndex, PlayTime ) ; // 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 MV1DetachAnim( int MHandle, int AttachIndex ) ;

概略アニメーションをデタッチする

引数 int MHandle : アニメーションをデタッチするモデルのハンドル
int AttachIndex : デタッチするアニメーションのアタッチ番号
戻り値 0:成功
 -1:エラー発生

解説  MHandle のモデルハンドルが示すモデルにアタッチしたアニメーションをデタッチ( 外すこと )します。

 アニメーションは同時に幾つでもアタッチすることができ、 MV1SetAttachAnimBlendRate 関数でアタッチしている各アニメーションの影響率も設定することができるので、 一応、すべてのアニメーションをアタッチして、MV1SetAttachAnimBlendRate 関数で表示したいアニメーションの影響率だけを上げるということもできるのですが、 それをすると使用メモリや処理負荷が多少上昇します。

 なので、DXライブラリのモデル機能では使用するアニメーションのみをアタッチして、 再生が終わったらこの関数でアタッチしたアニメーションをデタッチする( 外す )ことを想定しています。

 因みに、 MV1DeleteModel 関数でモデルを削除する際にアタッチしたアニメーションは自動的にデタッチされますので、 削除する前にアタッチしたすべてのアニメーションをこの関数でデタッチしておかなければならないということはありません。

サンプル

  モデルファイル DxChara.x に含まれる0番目のアニメーションと1番のアニメーションを交互に再生します。

Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int ModelHandle, AttachIndex, PlayAnim ; float TotalTime, PlayTime ; // 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 ) ) ; // 3Dモデルの0番目のアニメーションをアタッチする AttachIndex = MV1AttachAnim( ModelHandle, 0, -1, FALSE ) ; // アタッチしたアニメーションの総再生時間を取得する TotalTime = MV1GetAttachAnimTotalTime( ModelHandle, AttachIndex ) ; // 再生時間の初期化 PlayTime = 0.0f ; // 再生しているアニメーションを0番にする PlayAnim = 0 ; // アニメーション0の再生が終わるか、何かキーが押されるかウインドウが閉じられるまでループ while( ProcessMessage() == 0 && CheckHitKeyAll() == 0 ) { // 画面をクリア ClearDrawScreen() ; // 再生時間を進める PlayTime += 100.0f ; // 再生時間がアニメーションの総再生時間に達したら次のアニメーションにする if( PlayTime >= TotalTime ) { // 再生しているアニメーションを、今までが0番だったら1番に、1番だったら0番にする if( PlayAnim == 0 ) { PlayAnim = 1 ; } else { PlayAnim = 0 ; } // 今までアタッチしていたアニメーションのデタッチ MV1DetachAnim( ModelHandle, AttachIndex ) ; // 3Dモデルの PlayAnim 番目のアニメーションをアタッチする AttachIndex = MV1AttachAnim( ModelHandle, PlayAnim, -1, FALSE ) ; // アタッチしたアニメーションの総再生時間を取得する TotalTime = MV1GetAttachAnimTotalTime( ModelHandle, AttachIndex ) ; // 再生時間の初期化 PlayTime = 0.0f ; } // 再生時間をセットする MV1SetAttachAnimTime( ModelHandle, AttachIndex, PlayTime ) ; // 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 MV1SetAttachAnimTime( int MHandle, int AttachIndex, float Time ) ;

概略アタッチしているアニメーションの再生時間を設定する

引数 int MHandle : モデルのハンドル
int AttachIndex : 再生時間を設定するアニメーションのアタッチ番号
float Time : 再生時間
戻り値 0:成功
 -1:エラー発生

解説  MHandle のモデルハンドルが示すモデルにアタッチしたアニメーションの再生時間を設定します。

 DXライブラリのアニメーション機能には自動的にアニメーションを再生する機能はありませんので、 この関数を使用してアニメーションの再生時間を設定します。

 アニメーションのキーが存在しない時間が指定された場合は、 指定された時間の前後にあるキーからの補間値がモデルに反映されます。

サンプル

  モデルファイル DxChara.x に含まれる0番目のアニメーションの再生時間 10000.0f の状態を描画します。

Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int ModelHandle, AttachIndex ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // 3Dモデルの読み込み ModelHandle = MV1LoadModel( "DxChara.x" ) ; // 画面に映る位置に3Dモデルを移動 MV1SetPosition( ModelHandle, VGet( 320.0f, -300.0f, 600.0f ) ) ; // 3Dモデルの0番目のアニメーションをアタッチする AttachIndex = MV1AttachAnim( ModelHandle, 0, -1, FALSE ) ; // アタッチしたアニメーションの再生時間を 10000.0f にする MV1SetAttachAnimTime( ModelHandle, AttachIndex, 10000.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用のプログラムと同じです。




宣言float MV1GetAttachAnimTime( int MHandle, int AttachIndex ) ;

概略アタッチしているアニメーションの再生時間を取得する

引数 int MHandle : モデルのハンドル
int AttachIndex : 再生時間を取得するアニメーションのアタッチ番号
戻り値アニメーションに設定されている再生時間

解説  MHandle のモデルハンドルが示すモデルにアタッチしたアニメーションの再生時間を取得します。
MV1SetAttachAnimTime でセットした値を取得するだけの関数です。

サンプル

ありません



宣言float MV1GetAttachAnimTotalTime( int MHandle, int AttachIndex ) ;

概略アタッチしているアニメーションの総時間を取得する

引数 int MHandle : モデルのハンドル
int AttachIndex : 総時間取得するアニメーションのアタッチ番号
戻り値アニメーションの総時間

解説  MHandle のモデルハンドルが示すモデルにアタッチしたアニメーションの総時間を取得します。

サンプル

  モデルファイル DxChara.x に含まれる0番目のアニメーションの総時間を画面左上に描画します。

Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int ModelHandle, AttachIndex ; float TotalTime ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // 3Dモデルの読み込み ModelHandle = MV1LoadModel( "DxChara.x" ) ; // 3Dモデルの0番目のアニメーションをアタッチする AttachIndex = MV1AttachAnim( ModelHandle, 0, -1, FALSE ) ; // アニメーション0番の総時間を画面に描画 TotalTime = MV1GetAttachAnimTotalTime( ModelHandle, AttachIndex ) ; DrawFormatString( 0, 0, GetColor( 255,255,255 ), "%f", TotalTime ) ; // モデルハンドルの削除 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 MV1SetAttachAnimBlendRate( int MHandle, int AttachIndex, float Rate ) ;

概略アタッチしているアニメーションのブレンド率を設定する

引数 int MHandle : モデルのハンドル
int AttachIndex : アニメーションのアタッチ番号
float Rate : ブレンド率( 0.0f ~ 1.0f )
戻り値 0:成功
 -1:エラー発生

解説  MHandle のモデルハンドルが示すモデルにアタッチしたアニメーションのブレンド率を設定します。

 例えば、アニメーション0とアニメーション1を合成して表示したいときにします。
 そんな状況があるのかといいますと、結構あります。

 例えば歩いている状態から走っているアニメーションに切り替えたい場合、 最良の見た目を求めるのでしたら歩いている状態から走っている状態に移行するアニメーションを作り、 それを歩くアニメーションと走るアニメーションの間に再生するべきですが、 実際のゲームでは大抵の場合歩いているアニメーションのどのタイミングで走るアニメーションに切り替わるのかを事前に知る方法はありませんので、 歩くアニメーションを途中で止めて走るアニメーションを流すことになります。

 ですが、歩くアニメーションを止めて走るアニメーションを再生するとはっきりと切り替わりが見えてしまいあまり見た目的に良くありません、 こんな時にこの関数を使用して歩くアニメーションのブレンド率を徐々に下げ、 走るアニメーションのブレンド率を徐々に上げることで歩くアニメーションから走るアニメーションへの以降の様子をぼかして違和感を軽減することが出来ます。

 他にも全く姿勢の違うアニメーションへの切り替えの違和感を軽減する際などに使用できます。

サンプル

  モデルファイル DxChara.x に含まれる直立しているアニメーションから右手を前に出しているアニメーションへ徐々に移行します。

Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int ModelHandle, AttachIndex1, AttachIndex2 ; float Rate ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // 画面が切り替わるのをちょっと待つ WaitTimer( 1000 ) ; // 3Dモデルの読み込み ModelHandle = MV1LoadModel( "DxChara.x" ) ; // 画面に映る位置に3Dモデルを移動 MV1SetPosition( ModelHandle, VGet( 320.0f, -300.0f, 600.0f ) ) ; // 3Dモデルの立っているアニメーション( 4番目のアニメーション )をアタッチする AttachIndex1 = MV1AttachAnim( ModelHandle, 4, -1, FALSE ) ; // 3Dモデルの手を前に出しているアニメーション( 5番目のアニメーション )をアタッチする AttachIndex2 = MV1AttachAnim( ModelHandle, 5, -1, FALSE ) ; // 描画先を裏画面に変更 SetDrawScreen( DX_SCREEN_BACK ) ; // 4番目のアニメーションから5番目のアニメーションに徐々に移行する for( Rate = 0.0f ; Rate < 1.0f ; Rate += 0.01f ) { // 画面をクリア ClearDrawScreen() ; // 立っているアニメーションのブレンド率をセット MV1SetAttachAnimBlendRate( ModelHandle, AttachIndex1, 1.0f - Rate ) ; // 手を前に出しているアニメーションのブレンド率をセット MV1SetAttachAnimBlendRate( ModelHandle, AttachIndex2, Rate ) ; // モデルの描画 MV1DrawModel( ModelHandle ) ; // 裏画面の内容を表画面に反映する ScreenFlip() ; } // モデルハンドルの削除 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 MV1GetAttachAnimBlendRate( int MHandle, int AttachIndex ) ;

概略アタッチしているアニメーションのブレンド率を取得する

引数 int MHandle : モデルのハンドル
int AttachIndex : ブレンド率を取得するアニメーションのアタッチ番号
戻り値アニメーションに設定されているブレンド率

解説  MHandle のモデルハンドルが示すモデルにアタッチしたアニメーションのブレンド率を取得します。
MV1SetAttachAnimBlendRate でセットした値を取得するだけの関数です。

サンプル

ありません



宣言int MV1GetAttachAnim( int MHandle, int AttachIndex ) ;

概略アタッチしているアニメーションのアニメーション番号を取得する

引数 int MHandle : モデルのハンドル
int AttachIndex : アニメーション番号を取得するアニメーションのアタッチ番号
戻り値アタッチしているアニメーションの番号

解説  MHandle のモデルハンドルが示すモデルにアタッチしたアニメーションの番号を取得します。
MV1AttachAnim の第二引数( int AnimIndex )で渡した値がそのまま返ってきます。

具体的な用途は思いつきませんが、必要になることがあるような気がするので追加しました。

サンプル

ありません



宣言VECTOR MV1GetAttachAnimFrameLocalPosition( int MHandle, int AttachIndex, int FrameIndex ) ;

概略アタッチしているアニメーションの指定フレーム( ボーン )のローカル座標を取得する

引数 int MHandle : モデルのハンドル
int AttachIndex : アニメーション番号を取得するアニメーションのアタッチ番号
int FrameIndex : ローカル座標を取得するフレーム( ボーン )番号
戻り値指定のフレーム( ボーン )のローカル座標

解説  MHandle のモデルハンドルが示すモデルにアタッチしたアニメーションの、MV1SetAttachAnimTime で設定されている再生時間での FrameIndex で指定するフレーム( ボーン )のローカル座標を取得します。
 アニメーションに設定されている各フレームの移動値を取得したい場合に使用します。

サンプル

サンプルプログラムコーナーの『アニメーションによる座標移動』を参照してください。



宣言int MV1GetAnimNum( int MHandle ) ;

概略アニメーションの数を取得する

引数 int MHandle : モデルのハンドル
戻り値-1以外:モデルに含まれるアニメーションの数
 -1:エラー発生

解説  MHandle のモデルハンドルが示すモデルに含まれるアニメーションの総数を取得します。

サンプル

  モデルファイル DxChara.x に含まれるアニメーションの一覧を描画します。

Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int ModelHandle, AnimNum, i ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // 3Dモデルの読み込み ModelHandle = MV1LoadModel( "DxChara.x" ) ; // モデルに含まれるアニメーションの数を取得する AnimNum = MV1GetAnimNum( ModelHandle ) ; // アニメーションの一覧を描画する for( i = 0 ; i < AnimNum ; i ++ ) { // 左から順に、アニメーション番号、アニメーション名、アニメーションの総時間を描画する DrawFormatString( 0, i * 16, GetColor( 255,255,255 ), "No:%d Name:%s Time:%f", i, MV1GetAnimName( ModelHandle, i ), MV1GetAnimTotalTime( ModelHandle, i ) ) ; } // モデルハンドルの削除 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用のプログラムと同じです。




宣言const char *MV1GetAnimName( int MHandle, int AnimIndex ) ;

概略指定番号のアニメーション名を取得する

引数 int MHandle : モデルのハンドル
int AnimIndex : アニメーション名を取得したいアニメーションの番号
戻り値NULL以外:指定番号のアニメーション名
 NULL:エラー発生

解説  MHandle のモデルハンドルが示すモデルに含まれるアニメーションの名前を取得します。

 尚、戻り値は const 型( 変更不可能型 )ですので、もし戻り値を変数に代入する場合は const char * 型の変数にする必要があります。

サンプル

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



宣言MV1GetAnimIndex( int MHandle, char *AnimName ) ;

概略指定名のアニメーション番号を取得する

引数 int MHandle : モデルのハンドル
char *AnimName : 番号を取得したいアニメーションの名前
戻り値-1以外:アニメーション番号
 -1:エラー発生

解説  MHandle のモデルハンドルが示すモデルに含まれる指定名を持つアニメーションの番号を取得します。

 名前からアニメーション番号を検索したい場合に使用します。

サンプル

  モデルファイル DxChara.x に含まれる Animation_2 という名前のアニメーションを再生します。

Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int ModelHandle, AnimIndex, AttachIndex ; float TotalTime, PlayTime ; // 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 ) ) ; // Animation_2 という名前のアニメーションの番号を取得する AnimIndex = MV1GetAnimIndex( ModelHandle, "Animation_2" ) ; // 取得したアニメーション番号のアニメーションをアタッチする AttachIndex = MV1AttachAnim( ModelHandle, AnimIndex, -1, FALSE ) ; // アタッチしたアニメーションの総再生時間を取得する TotalTime = MV1GetAttachAnimTotalTime( ModelHandle, AttachIndex ) ; // 再生時間の初期化 PlayTime = 0.0f ; // 何かキーが押されるかウインドウが閉じられるまでループ while( ProcessMessage() == 0 && CheckHitKeyAll() == 0 ) { // 画面をクリア ClearDrawScreen() ; // 再生時間を進める PlayTime += 100.0f ; // 再生時間がアニメーションの総再生時間に達したら再生時間を0に戻す if( PlayTime >= TotalTime ) { PlayTime = 0.0f ; } // 再生時間をセットする MV1SetAttachAnimTime( ModelHandle, AttachIndex, PlayTime ) ; // 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用のプログラムと同じです。




宣言float MV1GetAnimTotalTime( int MHandle, int AnimIndex ) ;

概略指定番号のアニメーションの総時間を得る

引数 int MHandle : モデルのハンドル
int AnimIndex : 総時間を取得したいアニメーションの番号
戻り値-1.0f以外:指定番号のアニメーションの総時間
 -1.0f:エラー発生

解説  MHandle のモデルハンドルが示すモデルに含まれるアニメーションの総時間を取得します。

サンプル

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



マテリアル関係

宣言int MV1GetMaterialNum( int MHandle ) ;

概略モデルで使用しているマテリアルの数を取得する

引数 int MHandle : モデルのハンドル
戻り値-1以外:モデルに含まれるマテリアルの数
 -1:エラー発生

解説  MHandle のモデルハンドルが示すモデルに含まれるマテリアルの総数を取得します。

サンプル

  モデルファイル DxChara.x に含まれるアニメーションの情報を一つづつ描画します。

Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int ModelHandle, MaterialNum, i ; COLOR_F Color ; char *Name ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // 3Dモデルの読み込み ModelHandle = MV1LoadModel( "DxChara.x" ) ; // モデルに含まれるマテリアルの数を取得する MaterialNum = MV1GetMaterialNum( ModelHandle ) ; // マテリアルの情報を一つづつ描画する for( i = 0 ; i < MaterialNum ; i ++ ) { // 画面をクリア ClearDrawScreen() ; // マテリアルの名前を描画 DrawFormatString( 0, 0, GetColor( 255,255,255 ), "Name %s", MV1GetMaterialName( ModelHandle, i ) ) ; // マテリアルのディフューズカラーを描画 Color = MV1GetMaterialDifColor( ModelHandle, i ) ; DrawFormatString( 0, 16, GetColor( 255,255,255 ), "Diffuse Color R:%f G:%f B:%f A:%f", Color.r, Color.g, Color.b, Color.a ) ; // マテリアルのスペキュラカラーを描画 Color = MV1GetMaterialSpcColor( ModelHandle, i ) ; DrawFormatString( 0, 32, GetColor( 255,255,255 ), "Specular Color R:%f G:%f B:%f A:%f", Color.r, Color.g, Color.b, Color.a ) ; // マテリアルのエミッシブカラーを描画 Color = MV1GetMaterialEmiColor( ModelHandle, i ) ; DrawFormatString( 0, 48, GetColor( 255,255,255 ), "Emissive Color R:%f G:%f B:%f A:%f", Color.r, Color.g, Color.b, Color.a ) ; // マテリアルのアンビエントカラーを描画 Color = MV1GetMaterialAmbColor( ModelHandle, i ) ; DrawFormatString( 0, 64, GetColor( 255,255,255 ), "Ambient Color R:%f G:%f B:%f A:%f", Color.r, Color.g, Color.b, Color.a ) ; // マテリアルのスペキュラの強さ描画 DrawFormatString( 0, 80, GetColor( 255,255,255 ), "Specular Power %f", MV1GetMaterialSpcPower( ModelHandle, i ) ) ; // 描画ブレンドモードの描画 switch( MV1GetMaterialDrawBlendMode( ModelHandle, i ) ) { case DX_BLENDMODE_NOBLEND : Name = "DX_BLENDMODE_NOBLEND" ; break ; case DX_BLENDMODE_ALPHA : Name = "DX_BLENDMODE_ALPHA" ; break ; case DX_BLENDMODE_ADD : Name = "DX_BLENDMODE_ADD" ; break ; case DX_BLENDMODE_SUB : Name = "DX_BLENDMODE_SUB" ; break ; case DX_BLENDMODE_INVSRC : Name = "DX_BLENDMODE_INVSRC" ; break ; case DX_BLENDMODE_MULA : Name = "DX_BLENDMODE_MULA" ; break ; } DrawFormatString( 0, 96, GetColor( 255,255,255 ), "Draw Blend Mode %s", Name ) ; // 描画ブレンドパラメータの描画 DrawFormatString( 0, 112, GetColor( 255,255,255 ), "Draw Blend Param %d", MV1GetMaterialDrawBlendParam( ModelHandle, i ) ) ; // キー入力待ち 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用のプログラムと同じです。




宣言const char *MV1GetMaterialName( int MHandle, int MaterialIndex ) ;

概略指定のマテリアルの名前を取得する

引数 int MHandle : モデルのハンドル
int MaterialIndex : 名前を取得したいマテリアルの番号
戻り値NULL 以外:マテリアルの名前
 NULL:エラー発生

解説  MHandle のモデルハンドルが示すモデルに含まれるマテリアルの名前を取得します。

 尚、戻り値は const 型( 変更不可能型 )ですので、もし戻り値を変数に代入する場合は const char * 型の変数にする必要があります。

サンプル

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



宣言int MV1SetMaterialDifColor( int MHandle, int MaterialIndex, COLOR_F Color ) ;

概略指定のマテリアルのディフューズカラーを変更する

引数 int MHandle : モデルのハンドル
int MaterialIndex : ディフューズカラーを変更するマテリアルの番号
COLOR_F Color : ディフューズカラー( 拡散光色 )
戻り値0:成功
 -1:エラー発生

解説  MHandle のモデルハンドルが示すモデルに含まれるマテリアルのディフューズカラー( 拡散光色 )を変更します。

サンプル

  モデルファイル 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番目のマテリアルのディフューズカラーを真っ赤にします MV1SetMaterialDifColor( 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 MV1GetMaterialDifColor( int MHandle, int MaterialIndex ) ;

概略指定のマテリアルのディフューズカラーを取得する

引数 int MHandle : モデルのハンドル
int MaterialIndex : マテリアルの番号
戻り値ディフューズカラー
解説  MHandle のモデルハンドルが示すモデルに含まれるマテリアルのディフューズカラー( 拡散光色 )を取得します。

 戻り値は COLOR_F 構造体で、中にはそれぞれ赤、緑、青、α成分を表す変数 float r, g, b, a ; が含まれています。 ( 値の範囲は 0.0f ~ 1.0f ( 0%~100% ) )

サンプル

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



宣言int MV1SetMaterialSpcColor( int MHandle, int MaterialIndex, COLOR_F Color ) ;

概略指定のマテリアルのスペキュラカラーを変更する

引数 int MHandle : モデルのハンドル
int MaterialIndex : スペキュラカラーを変更するマテリアルの番号
COLOR_F Color : スペキュラカラー( 拡散光色 )
戻り値0:成功
 -1:エラー発生

解説  MHandle のモデルハンドルが示すモデルに含まれるマテリアルのスペキュラカラー( 反射光色 )を変更します。

サンプル

  モデルファイル 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番目のマテリアルのスペキュラカラーを緑にします MV1SetMaterialSpcColor( ModelHandle, 0, GetColorF( 0.0f, 1.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 MV1GetMaterialSpcColor( int MHandle, int MaterialIndex ) ;

概略指定のマテリアルのスペキュラカラーを取得する

引数 int MHandle : モデルのハンドル
int MaterialIndex : マテリアルの番号
戻り値スペキュラカラー
解説  MHandle のモデルハンドルが示すモデルに含まれるマテリアルのスペキュラカラー( 反射光色 )を取得します。

 戻り値は COLOR_F 構造体で、中にはそれぞれ赤、緑、青、α成分を表す変数 float r, g, b, a ; が含まれています。 ( 値の範囲は 0.0f ~ 1.0f ( 0%~100% ) )

サンプル

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



宣言int MV1SetMaterialEmiColor( int MHandle, int MaterialIndex, COLOR_F Color ) ;

概略指定のマテリアルのエミッシブカラーを変更する

引数 int MHandle : モデルのハンドル
int MaterialIndex : エミッシブカラーを変更するマテリアルの番号
COLOR_F Color : エミッシブカラー( 自己発光色 )
戻り値0:成功
 -1:エラー発生

解説  MHandle のモデルハンドルが示すモデルに含まれるマテリアルのエミッシブカラー( 自己発光色 )を変更します。

サンプル

  モデルファイル 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番目のマテリアルのエミッシブカラーを暗い黄色にします MV1SetMaterialEmiColor( ModelHandle, 0, GetColorF( 0.2f, 0.2f, 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 MV1GetMaterialEmiColor( int MHandle, int MaterialIndex ) ;

概略指定のマテリアルのエミッシブカラーを取得する

引数 int MHandle : モデルのハンドル
int MaterialIndex : マテリアルの番号
戻り値エミッシブカラー
解説  MHandle のモデルハンドルが示すモデルに含まれるマテリアルのエミッシブカラー( 自己発光色 )を取得します。

 戻り値は COLOR_F 構造体で、中にはそれぞれ赤、緑、青、α成分を表す変数 float r, g, b, a ; が含まれています。 ( 値の範囲は 0.0f ~ 1.0f ( 0%~100% ) )

サンプル

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



宣言int MV1SetMaterialAmbColor( int MHandle, int MaterialIndex, COLOR_F Color ) ;

概略指定のマテリアルのアンビエントカラーを変更する

引数 int MHandle : モデルのハンドル
int MaterialIndex : アンビエントカラーを変更するマテリアルの番号
COLOR_F Color : アンビエントカラー( 環境光色 )
戻り値0:成功
 -1:エラー発生

解説  MHandle のモデルハンドルが示すモデルに含まれるマテリアルのアンビエントカラー( 環境光色 )を変更します。

サンプル

  モデルファイル 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番目のマテリアルのアンビエントカラーを紫色にします MV1SetMaterialAmbColor( ModelHandle, 0, GetColorF( 1.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 MV1GetMaterialAmbColor( int MHandle, int MaterialIndex ) ;

概略指定のマテリアルのアンビエントカラーを取得する

引数 int MHandle : モデルのハンドル
int MaterialIndex : マテリアルの番号
戻り値アンビエントカラー
解説  MHandle のモデルハンドルが示すモデルに含まれるマテリアルのアンビエントカラー( 環境光色 )を取得します。

 戻り値は COLOR_F 構造体で、中にはそれぞれ赤、緑、青、α成分を表す変数 float r, g, b, a ; が含まれています。 ( 値の範囲は 0.0f ~ 1.0f ( 0%~100% ) )

サンプル

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



宣言int MV1SetMaterialSpcPower( int MHandle, int MaterialIndex, float Power ) ;

概略指定のマテリアルのスペキュラの強さを変更する

引数 int MHandle : モデルのハンドル
int MaterialIndex : スペキュラの強さを変更するマテリアルの番号
float Power : スペキュラの強さ
戻り値0:成功
 -1:エラー発生

解説  MHandle のモデルハンドルが示すモデルに含まれるマテリアルのスペキュラの強さを変更します。

 具体的には反射する光の範囲が鋭くなります。

サンプル

  モデルファイル 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番目のマテリアルのスペキュラカラーを明るくします MV1SetMaterialSpcColor( ModelHandle, 0, GetColorF( 0.457f, 0.687f, 0.948f, 0.f ) ) ; // 3Dモデルに含まれる0番目のマテリアルのスペキュラの強さを 0.1f にします MV1SetMaterialSpcPower( ModelHandle, 0, 19.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用のプログラムと同じです。




宣言float MV1GetMaterialSpcPower( int MHandle, int MaterialIndex ) ;

概略指定のマテリアルのスペキュラの強さを取得する

引数 int MHandle : モデルのハンドル
int MaterialIndex : マテリアルの番号
戻り値スペキュラの強さ
解説  MHandle のモデルハンドルが示すモデルに含まれるマテリアルのスペキュラの強さを取得します。

サンプル

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



宣言int MV1GetMaterialDifMapTexture( int MHandle, int MaterialIndex ) ;

概略指定のマテリアルでディフューズマップとして使用されているテクスチャ番号を取得する

引数 int MHandle : モデルのハンドル
int MaterialIndex : マテリアルの番号
戻り値0以上:テクスチャの番号
 -1:エラー発生

解説  MHandle のモデルハンドルが示すモデルに含まれるマテリアルのディフューズマップとして使用されているテクスチャの番号を取得します。
 取得した番号は関数 MV1GetTextureGraphHandle などの引数として使用します。 ( テクスチャの番号はモデルに含まれるテクスチャに振られる番号で、グラフィックハンドルではありませんのでご注意ください )

 モデルのテクスチャを変更したり利用したりしたいときに使用します。

サンプル

  モデルファイル DxChara.x に含まれる4番目のマテリアルにディフューズテクスチャとして使用されている
 テクスチャの番号を取得して、そのテクスチャのグラフィックハンドルを取得して画面に描画します。

Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int ModelHandle ; int TexIndex ; int GrHandle ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // 3Dモデルの読み込み ModelHandle = MV1LoadModel( "DxChara.x" ) ; // マテリアル番号4で使用されているテクスチャの番号を取得する TexIndex = MV1GetMaterialDifMapTexture( ModelHandle, 4 ) ; // モデルで使用されているテクスチャのグラフィックハンドルを取得する GrHandle = MV1GetTextureGraphHandle( ModelHandle, TexIndex ) ; // 取得したグラフィックハンドルを画面に描画する DrawGraph( 0, 0, GrHandle, TRUE ) ; // モデルハンドルの削除 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 MV1GetMaterialSpcMapTexture( int MHandle, int MaterialIndex ) ;

概略指定のマテリアルでスペキュラマップとして使用されているテクスチャ番号を取得する

引数 int MHandle : モデルのハンドル
int MaterialIndex : マテリアルの番号
戻り値0以上:テクスチャの番号
 -1:エラー発生

解説  MHandle のモデルハンドルが示すモデルに含まれるマテリアルのスペキュラマップとして使用されているテクスチャの番号を取得します。
 取得した番号は関数 MV1GetTextureGraphHandle などの引数として使用します。 ( テクスチャの番号はモデルに含まれるテクスチャに振られる番号で、グラフィックハンドルではありませんのでご注意ください )

 モデルのテクスチャを変更したり利用したりしたいときに使用します。

サンプル

  マテリアルで使用されているテクスチャを画面に描画するサンプルが MV1GetMaterialDifMapTexture 関数 にあります。



宣言int MV1GetMaterialNormalMapTexture( int MHandle, int MaterialIndex ) ;

概略指定のマテリアルで法線マップとして使用されているテクスチャ番号を取得する

引数 int MHandle : モデルのハンドル
int MaterialIndex : マテリアルの番号
戻り値0以上:テクスチャの番号
 -1:エラー発生

解説  MHandle のモデルハンドルが示すモデルに含まれるマテリアルの法線マップとして使用されているテクスチャの番号を取得します。
 取得した番号は関数 MV1GetTextureGraphHandle などの引数として使用します。 ( テクスチャの番号はモデルに含まれるテクスチャに振られる番号で、グラフィックハンドルではありませんのでご注意ください )

 モデルのテクスチャを変更したり利用したりしたいときに使用します。

サンプル

  マテリアルで使用されているテクスチャを画面に描画するサンプルが MV1GetMaterialDifMapTexture 関数 にあります。



宣言int MV1SetMaterialDrawBlendMode( int MHandle, int MaterialIndex, int BlendMode ) ;

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

引数 int MHandle : モデルのハンドル
int MaterialIndex : マテリアルの番号
int BlendMode : 描画ブレンドモード( DX_BLENDMODE_ALPHA 等 )
戻り値0:成功
 -1:エラー発生

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

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

サンプル

  モデルファイル 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 に変更する MV1SetMaterialDrawBlendMode( 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 MV1GetMaterialDrawBlendMode( int MHandle, int MaterialIndex ) ;

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

引数 int MHandle : モデルのハンドル
int MaterialIndex : マテリアルの番号
戻り値描画ブレンドモード( DX_BLENDMODE_ALPHA 等 )
 -1:エラー発生

解説  MHandle のモデルハンドルが示すモデルに含まれるマテリアルの描画ブレンドモードを取得します。


サンプル

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



宣言int MV1SetMaterialDrawBlendParam( int MHandle, int MaterialIndex, int BlendParam ) ;

概略指定のマテリアルの描画ブレンドパラメータを変更する

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

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

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

サンプル

  モデルファイル 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モデルに含まれる0番目のマテリアルの描画ブレンドモードを DX_BLENDMODE_ADD に変更する MV1SetMaterialDrawBlendMode( ModelHandle, 1, DX_BLENDMODE_ADD ) ; // マテリアルのブレンドパラメータを 128 に変更する MV1SetMaterialDrawBlendParam( 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 MV1GetMaterialDrawBlendParam( int MHandle, int MaterialIndex ) ;

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

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

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


サンプル

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



宣言int MV1SetMaterialDrawAlphaTest( int MHandle, int MaterialIndex, int Enable, int Mode, int Param ) ;

概略指定のマテリアルの描画アルファテストの設定を行う

引数 int MHandle : モデルのハンドル
int MaterialIndex : マテリアルの番号
int Enable : アルファテストを有効にするかどうか( TRUE:有効にする FALSE:無効にする(デフォルト) )
int Mode : テストモード( DX_CMP_GREATER等 )
int Param : 描画アルファ値との比較に使用する値( 0~255 )
戻り値0:成功
 -1:エラー発生

解説  MHandle のモデルハンドルが示すモデルに含まれる指定のマテリアルの描画時にアルファテストを行うかどうかや、行う場合のテストモードを変更します。
 アルファテストとは描画する色のアルファ値によって描画を行うかどうかを決定する機能で、 主に描画負荷の軽減とZバッファへどれだけ透明なピクセルでも書き込むか等を決定する為に使用します。

 Zバッファにはアルファ値が 1 でほぼ完全に透明の物でも不透明の物と同様にしっかりと深度情報が書き込まれてしまいます。
 すると、その後『ほぼ完全に透明の物』の奥に別の物を描画しようとすると『ほぼ完全に透明の物』に隠れて描画されないという現象が発生してしまいます。
 理想的には描画物を画面奥にあるものから順に描画すればこのような問題は発生しないのですが、 描画物が大量にあって画面奥にあるものから順に描画しようとするとソートの処理負荷が高くなってしまう等必ずしも常に理想的な描画が行えるとは限らないので、 そのような場合にアルファテスト機能を使って、一定以上の透明度のものはそもそも描画しない、などの設定を行ってから描画します。

アルファテストとして使用できるモードは引数 Mode で指定するのですが、モードには以下の種類があります。

DX_CMP_NEVER描画アルファ値がどのような値でも描画しない
DX_CMP_LESS描画アルファ値が Param より小さい場合は描画する
DX_CMP_EQUAL描画アルファ値が Param と等しい場合は描画する
DX_CMP_LESSEQUAL描画アルファ値が Param と同じか、より小さい場合は描画する
DX_CMP_GREATER描画アルファ値が Param より大きい場合は描画する
DX_CMP_NOTEQUAL描画アルファ値が Param と異なる場合は描画する
DX_CMP_GREATEREQUAL描画アルファ値が Param と同じか、より大きい場合は描画する
DX_CMP_ALWAYS描画アルファ値がどのような値でも描画する

 DX_CMP_NEVER と DX_CMP_ALWAYS 以外のモードでは引数 Param で指定するアルファ値を比較用の値として使用します。
 大体は『一定以上のアルファ値の場合のみ描画するようにしたい』ので、DX_CMP_GREATER か DX_CMP_GREATEREQUAL を使用します。

 例:マテリアル番号1を透明度が80%以下(アルファ値が51以上)の部分のみ描画するように設定する

   MV1SetMaterialDrawAlphaTest( MHandle, 1, TRUE, DX_CMP_GREATEREQUAL, 51 ) ;

サンプル

  ありません



宣言int MV1SetMaterialDrawAlphaTestAll( int MHandle, int Enable, int Mode, int Param ) ;

概略全てのマテリアルの描画アルファテストの設定を行う

引数 int MHandle : モデルのハンドル
int Enable : アルファテストを有効にするかどうか( TRUE:有効にする FALSE:無効にする(デフォルト) )
int Mode : テストモード( DX_CMP_GREATER等 )
int Param : 描画アルファ値との比較に使用する値( 0~255 )
戻り値0:成功
 -1:エラー発生

解説  MHandle のモデルハンドルが示すモデルに含まれる全てのマテリアルに対して描画時にアルファテストを行うかどうかや、行う場合のテストモードを変更します。

 MV1SetMaterialDrawAlphaTest の処理を全てのマテリアルに対して行うという以外は全て MV1SetMaterialDrawAlphaTest と同じなので、 引数の解説などは MV1SetMaterialDrawAlphaTest の解説を参照してください。

サンプル

  ありません



宣言int MV1SetMaterialOutLineWidth( int MHandle, int MaterialIndex, float Width ) ;

概略指定のマテリアルのトゥーンレンダリングで使用する輪郭線の太さを設定する

引数 int MHandle : モデルのハンドル
int MaterialIndex : マテリアルの番号
float Width : 輪郭線の太さ
戻り値0:成功
 -1:エラー発生

解説  MHandle のモデルハンドルが示すモデルに含まれるマテリアルの立体的な( カメラとモデルとの距離に影響される )輪郭線の太さを変更します。
 輪郭線は pmd ファイルを読み込んだ場合に表示されます。


<<輪郭線の太さ決定の仕組み>>

 輪郭線は立体的な太さ( MV1SetMaterialOutLineWidth で指定する太さ )と、平面的な太さ( MV1SetMaterialOutLineDotWidth で指定する太さ )の二種類があります。
 立体的な太さはカメラとモデルとの距離で実際に画面に描画される輪郭線の太さが変化します。( 離れれば離れるほど細く、近づけば近づくほど太く )
 平面的な太さはカメラとモデルとの距離に関係なく常に一定の太さで描画されます。

 DXライブラリでは、立体的・平面的の両方の計算で太さを求め、より太い結果の太さを用いて輪郭線を描画します。
 これは「近づけば近づくほど輪郭線は太くなって欲しいけど、どれだけ離れても最低限の太さで輪郭線を描画したい」 という処理を実現するためにこうなりました。

 尚、より太い計算結果を採用する関係で、輪郭線を描画したくない場合は MV1SetMaterialOutLineWidth と MV1SetMaterialOutLineDotWidth の両方で太さを 0.0f に設定する必要があります。

 また、MV1SetScale でモデルのスケールを変更するとこのパラメータにもスケーリングが掛かってしまいますので注意してください。
サンプル

  ありません



宣言float MV1GetMaterialOutLineWidth( int MHandle, int MaterialIndex ) ;

概略指定のマテリアルのトゥーンレンダリングで使用する輪郭線の太さを取得する

引数 int MHandle : モデルのハンドル
int MaterialIndex : マテリアルの番号
戻り値輪郭線の太さ
 -1:エラー発生

解説  MHandle のモデルハンドルが示すモデルに含まれるマテリアルの立体的な輪郭線の太さを取得します。

   輪郭線の太さの詳細は MV1SetMaterialOutLineWidth の解説を参照してください。
サンプル

  ありません



宣言int MV1SetMaterialOutLineDotWidth( int MHandle, int MaterialIndex, float Width ) ;

概略指定のマテリアルのトゥーンレンダリングで使用する輪郭線のドット単位の太さを設定する

引数 int MHandle : モデルのハンドル
int MaterialIndex : マテリアルの番号
float Width : 輪郭線の太さ
戻り値0:成功
 -1:エラー発生

解説  MHandle のモデルハンドルが示すモデルに含まれるマテリアルの平面的な( カメラとモデルとの距離に影響されない )輪郭線の太さを変更します。
 輪郭線は pmd ファイルを読み込んだ場合に表示されます。

   輪郭線の太さの詳細は MV1SetMaterialOutLineWidth の解説を参照してください。
サンプル

  ありません



宣言float MV1GetMaterialOutLineDotWidth( int MHandle, int MaterialIndex ) ;

概略指定のマテリアルのトゥーンレンダリングで使用する輪郭線のドット単位の太さを取得する

引数 int MHandle : モデルのハンドル
int MaterialIndex : マテリアルの番号
戻り値輪郭線の太さ
 -1:エラー発生

解説  MHandle のモデルハンドルが示すモデルに含まれるマテリアルの平面的な輪郭線の太さを取得します。

   輪郭線の太さの詳細は MV1SetMaterialOutLineWidth の解説を参照してください。
サンプル

  ありません



宣言int MV1SetMaterialOutLineColor( int MHandle, int MaterialIndex, COLOR_F Color ) ;

概略指定のマテリアルのトゥーンレンダリングで使用する輪郭線の色を設定する

引数 int MHandle : モデルのハンドル
int MaterialIndex : マテリアルの番号
COLOR_F Color : 輪郭線の色
戻り値0:成功
 -1:エラー発生

解説  MHandle のモデルハンドルが示すモデルに含まれるマテリアルの輪郭線の色を変更します。デフォルトの輪郭線の色は真っ黒 GetColorF( 0.0f, 0.0f, 0.0f, 1.0f ) です。
 色の値の取得は GetColorF を使うと便利です。
 尚、輪郭線は pmd ファイルを読み込んだ場合に表示されます。

サンプル

  ありません



宣言COLOR_F MV1GetMaterialOutLineColor( int MHandle, int MaterialIndex ) ;

概略指定のマテリアルのトゥーンレンダリングで使用する輪郭線の色を取得する

引数 int MHandle : モデルのハンドル
int MaterialIndex : マテリアルの番号
戻り値輪郭線の色
 -1:エラー発生

解説  MHandle のモデルハンドルが示すモデルに含まれるマテリアルの輪郭線の色を取得します。

 基本的に MV1SetMaterialOutLineColor で設定した値を返すだけの関数です。
サンプル

  ありません






戻る