※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

技術指南/応用技術

ここでは、3Dゲームを作成するのに使用するかもしれない応用技術を紹介します。
ちょっと難しいですが、自由度は高くなります。




コリジョン
  • 球と球
簡易的なコリジョン判定
DxLibの関数ではHitCheck_Sphere_Sphereを使うと簡単です
int HitCheck_Sphere_Sphere( VECTOR Sphere1CenterPos, float Sphere1R, VECTOR Sphere2CenterPos, float Sphere2R ) ;
// 球と球の当たり判定( TRUE:当たっている  FALSE:当たっていない )
 
但し,これ以外の方法で球と球の判定であれば,球の中心点の座標からの距離と2つの球の半径で比べる方法もある.
  1. VECTOR R1,R2;//球体の座標1,2
  2. float r1 = 1.0f, r2 = 2.0f;//球体の半径を決める
  3. R1=VGet(0,0,0);
  4. R2=Vget(2,0,0);
  5. if(VSquareSize(VSub(R1,R2) ) <= (r1+r2)*(r1+r2))
  6. {//平方根の計算は処理が重いので2乗のまま扱う
  7. //2つの球が接触しているときの処理
  8. }
  • 対モデル判定
モデルとの判定となると簡易的なコリジョンと比べ計算量も増えるため重くなります
しかし,簡易的な場合と比較してある程度厳密に判定をすることが可能となります
特に,ゲームでは地面のステージモデルとキャラとの当たり判定とかには使えるのではないでしょうか
モデルで判定を行う場合には,MV1SetupCollInfo関数でモデルのコリジョン情報を構築する必要があります
int MV1SetupCollInfo( int MHandle, int FrameIndex, int XDivNum, int YDivNum, int ZDivNum ) ;//コリジョン情報を構築する
 
    • モデルと線分
    • モデルと球
    • モデルとカプセル型
参考(DxLibの3Dアクションサンプル):
http://homepage2.nifty.com/natupaji/DxLib/program/dxprogram_3DAction.html


フレーム操作

アクセサリの装備
3Dのゲームとなるとキャラに武器を持たせモーションに合わせて振り回すといったことをするかと思います。
DxLibでやる場合はMV1GetFrameLocalWorldMatrix関数を使います。
MV1GetFrameLocalWorldMatrix( int MHandle, int FrameIndex ) ;
指定のフレームのローカル座標からワールド座標に変換する行列を得る。

キャラクターモデルのアクセサリを付けたいフレーム( ボーン )の座標変換情報である行列をMV1GetFrameLocalWorldMatrix で取得して、それを MV1SetMatrix でアクセサリモデルの座標変換情報として設定することで、アクセサリモデルの原点がキャラクターモデルのアクセサリを付けたいフレームの座標になり、その状態で描画するとそのフレームにくっついているように見えるというものです

  • ソース
+...
  1. #include "DxLib.h"
  2. int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
  3. {
  4. // ウインドウモードで起動
  5. ChangeWindowMode( TRUE ) ;
  6.  
  7. int CharModel ; // キャラクターモデル
  8. int AccessModel ; // アクセサリーモデル
  9.  
  10. if( DxLib_Init() < 0 ) return -1 ;// エラーが発生したら直ちに終了
  11.  
  12. // 別々に読み込み
  13. MV1SetLoadModelUsePhysicsMode( DX_LOADMODEL_PHYSICS_DISABLE ) ;//非物理演算モードで読み込む
  14. CharModel = MV1LoadModel( "Model/Sakuya/model.pmd" ) ;
  15. AccessModel = MV1LoadModel( "Accessory/Sakuya/右手ナイフセット.pmd" ) ;
  16. SetDrawScreen( DX_SCREEN_BACK ) ;
  17. MV1SetPosition( CharModel, VGet( 320.0f, 225.0f, -370.0f ) ) ;
  18.  
  19. SetCameraNearFar( 1.0f, 150.0f ) ;
  20. // メインループ
  21. while( ProcessMessage() == 0 )
  22. {
  23. ClearDrawScreen() ;
  24.  
  25. // キャラクターモデルを描画
  26. MV1DrawModel( CharModel ) ;
  27.  
  28.  
  29. // アクセサリモデルを、キャラクターの右手フレームの座標系にあわせてから描画
  30.  
  31. // キャラクターモデルの右手フレームの名前からフレーム番号を取得
  32. //
  33. // ※…右手フレームの名前はモデルによって違いますので、DxLibModelViewer.exe で
  34. //   キャラクターモデルを開いて、名前を確認してください
  35. int RightHandFrameNo ;
  36. RightHandFrameNo = MV1SearchFrame( CharModel, "右手首" ) ;
  37.  
  38. // キャラクターモデルの右手フレームの行列を取得
  39. MATRIX RightHandMatrix ;
  40. RightHandMatrix = MV1GetFrameLocalWorldMatrix( CharModel, RightHandFrameNo ) ;
  41.  
  42. // キャラクターモデルの右手フレームの行列をアクセサリモデルの行列としてセットしてから描画
  43. MV1SetMatrix( AccessModel, RightHandMatrix ) ;
  44. MV1DrawModel( AccessModel ) ;
  45.  
  46. ScreenFlip();
  47. }
  48. // DXライブラリの後始末
  49. DxLib_End() ;
  50. // ソフトの終了
  51. return 0 ;
  52. }
  53.