「基本技術」の編集履歴(バックアップ)一覧に戻る

基本技術 - (2012/02/03 (金) 10:21:07) の編集履歴(バックアップ)


技術指南/基本技術


ここでは、MMD系のゲームを作るための基本的な技術について紹介します。
ここで紹介している関数はDXライブラリのごく一部の関数です。
必ず、DXライブラリ置き場のDXライブラリの関数リファレンスマニュアル&サンプルプログラムもあわせて確認してください。




モデルの表示
MMDゲーム化計画の第一歩である、モデルの表示方法を紹介します。
今回は、アールビットさんの十六夜咲夜モデルを使用させて頂きました。
ダウンロード>モデルから配布ページのリンクがありますので、興味のある方は是非ダウンロードしてください。

DXライブラリでは、3Dモデルを表示する際、まずモデルデータをメモリ上に読み込まなければなりません。
モデルのロードにはMV1LoadModel関数または、MV1DuplicateModel関数を使います。
int MV1LoadModel( char *FileName ) ;
int MV1DuplicateModel( int SrcMHandle ) ;
MV1LoadModel関数は、ファイル名を指定して3Dモデルをメモリ上にロードします。
読み込むことのできるモデルファイル形式は x, mqo, mv1, pmd( + vmd ) の3種類です。
pmxファイルは使用できないので注意してください。

返り値がメモリ上に読み込んだ3Dモデルファイルの識別番号で int 型の数値となっていて、
この値を使って、モデルの表示や位置の調整、向きの調整などを行います。

MV1DuplicateModel関数は、1度メモリ上に読み込んだ3Dモデルデータと同じデータを複製します。
弾やモブのように同じモデルを幾つも使うときにはこちらを使ったほうが、読み込み時間が少なくなります。


モデルの表示にはMV1LoadModel関数を使います。
int MV1DrawModel( int MHandle ) ;


では、実際に表示してみましょう。

  • ソース
+ ...
  1. #include "DxLib.h"
  2.  
  3. int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
  4. {
  5. int ModelHandle ;//モデルハンドル
  6.  
  7. // ウインドウモードで起動
  8. ChangeWindowMode( TRUE ) ;
  9. // DXライブラリの初期化
  10. if( DxLib_Init() < 0 )
  11. {
  12. // エラーが発生したら直ちに終了
  13. return -1 ;
  14. }
  15. // 描画先を裏画面にする
  16. SetDrawScreen( DX_SCREEN_BACK ) ;
  17.  
  18. // 3Dモデルの読み込み
  19. ModelHandle = MV1LoadModel( "Model/Sakuya/model.pmd" ) ;
  20.  
  21. // メインループ(何かキーが押されたらループを抜ける)
  22. while( ProcessMessage() == 0 && CheckHitKeyAll() == 0 )
  23. {
  24. // 画面のクリア
  25. ClearDrawScreen() ;
  26. // 3Dモデルの描画
  27. MV1DrawModel( ModelHandle ) ;
  28. // 裏画面の内容を表画面に反映
  29. ScreenFlip();
  30. }
  31.  
  32. // DXライブラリの後始末
  33. DxLib_End() ;
  34. // ソフトの終了
  35. return 0 ;
  36. }
  37.  
  • 実行結果
左下にほんの僅かですが、モデルが表示されていますね。

2Dゲームとは違い、3Dゲームでは3Dモデルの位置とカメラの位置、向きの関係で見え方が異なります。
そのため、画面の中心にモデルを表示したいときは、カメラを表示したいモデルの近くに移動させて、表示したいモデルの方向に向けるか、
カメラが映している範囲に表示したい3Dモデルの位置を移動させる必要があります。

カメラの操作は次の項目で紹介するので、今回は3Dモデルをカメラの映している範囲に3Dモデルを移動させます。
3Dモデルの位置座標を設定するにはMV1SetPosition関数を使います。
int MV1SetPosition( int MHandle, VECTOR Position ) ;

モデルをロードした後に、この関数でモデルの位置座標を設定します。

  • ソース
+ ...
  1. #include "DxLib.h"
  2.  
  3. int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
  4. {
  5. int ModelHandle ;//モデルハンドル
  6.  
  7. // ウインドウモードで起動
  8. ChangeWindowMode( TRUE ) ;
  9. // DXライブラリの初期化
  10. if( DxLib_Init() < 0 )
  11. {
  12. // エラーが発生したら直ちに終了
  13. return -1 ;
  14. }
  15. // 描画先を裏画面にする
  16. SetDrawScreen( DX_SCREEN_BACK ) ;
  17.  
  18. // 3Dモデルの読み込み
  19. ModelHandle = MV1LoadModel( "Model/Sakuya/model.pmd" ) ;
  20.  
  21. // 画面に映る位置に3Dモデルを移動
  22. MV1SetPosition( ModelHandle, VGet( 320.0f, 225.0f, -370.0f ) ) ;
  23.  
  24. // メインループ(何かキーが押されたらループを抜ける)
  25. while( ProcessMessage() == 0 && CheckHitKeyAll() == 0 )
  26. {
  27. // 画面のクリア
  28. ClearDrawScreen() ;
  29. // 3Dモデルの描画
  30. MV1DrawModel( ModelHandle ) ;
  31. // 裏画面の内容を表画面に反映
  32. ScreenFlip();
  33. }
  34.  
  35. // DXライブラリの後始末
  36. DxLib_End() ;
  37. // ソフトの終了
  38. return 0 ;
  39. }
  40.  
  • 実行結果

モデルのスケーリング、向きの変更、不透明度の変更
次にモデルを複製してスケールの変更、向きの変更、不透明度の変更を変更してみましょう。
それぞれ、MV1SetScale,MVSetRotationXYZ,MV1SetOpacityRate関数を使います。
int MV1SetScale( int MHandle, VECTOR Scale ) ;
int MV1SetRotationXYZ( int MHandle, VECTOR Rotate ) ;
int MV1SetOpacityRate( int MHandle, float Rate ) ;
回転に関しては、他に回転地ではなくモデルの方向ベクトルで指定するMV1SetRotationZYAxis関数や
int MV1SetRotationZYAxis( int MHandle, VECTOR ZAxis, VECTOR YAxis, float ZTwist ) ;
位置、回転、スケーリングなどを行列で指定する
int MV1SetMatrix( int MHandle, MATRIX Matrix ) ;
などもあります。

詳しくはDXライブラリ関数のリファレンスをみてください。

  • ソース
+ ...
  1. #include "DxLib.h"
  2.  
  3. int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
  4. {
  5. int i;
  6. int ModelHandle[4] ;//モデルハンドル配列
  7.  
  8. // ウインドウモードで起動
  9. ChangeWindowMode( TRUE ) ;
  10. // DXライブラリの初期化
  11. if( DxLib_Init() < 0 )
  12. {
  13. // エラーが発生したら直ちに終了
  14. return -1 ;
  15. }
  16. // 描画先を裏画面にする
  17. SetDrawScreen( DX_SCREEN_BACK ) ;
  18.  
  19. // 3Dモデルの読み込み
  20. ModelHandle[0] = MV1LoadModel( "Model/Sakuya/model.pmd" ) ;
  21. //既存のモデルを複製
  22. for(i = 1;i < 4;i ++){
  23. ModelHandle[i] = MV1DuplicateModel(ModelHandle[0]) ;
  24. }
  25.  
  26. // 各モデルを画面に映る位置に3Dモデルを移動
  27. for(i = 0;i < 4;i ++){
  28. MV1SetPosition( ModelHandle[i], VGet( 305.0f+i*10, 225.0f, -370.0f ) ) ;
  29. }
  30.  
  31. //モデルのスケールの変更
  32. MV1SetScale(ModelHandle[1], VGet(0.4f,0.2f,0.4f) );
  33.  
  34. //モデルの向きを変更
  35. MV1SetRotationXYZ(ModelHandle[2], VGet(0.0f,PHI_F/2,0.0f) );
  36.  
  37. //モデルの不透明度を変更
  38. MV1SetOpacityRate(ModelHandle[3], 0.1f);
  39.  
  40. // メインループ(何かキーが押されたらループを抜ける)
  41. while( ProcessMessage() == 0 && CheckHitKeyAll() == 0 )
  42. {
  43. // 画面のクリア
  44. ClearDrawScreen() ;
  45. // 3Dモデルの描画
  46. for(i = 0;i < 4;i ++){
  47. MV1DrawModel( ModelHandle[i] ) ;
  48. }
  49. // 裏画面の内容を表画面に反映
  50. ScreenFlip();
  51. }
  52.  
  53. // DXライブラリの後始末
  54. DxLib_End() ;
  55. // ソフトの終了
  56. return 0 ;
  57. }
  58.  
  • 実行結果

左から順にそのまま、スケール変更、向き変更、不透明度変更したモデルです。
半透明にしたモデルは、このように服が透けてしまうので、
透明度を操作してキャラをフェードイン、フェードアウトさせたい場合などは、ある程度工夫が必要です。

詳しくはミニテクニックの3Dモデルの半透明化を参考にしてください。

また、これら以外にもモデルの表示設定、ディフューズカラー、エミッシブカラー、アンビエントカラー、
Zバッファ使用の設定、物理演算の設定などを行うことができます。
これらについては自分で必要なときに確認してください。


カメラの操作

ライトの操作

アニメーションアタッチ

記事メニュー
人気記事ランキング
目安箱バナー