トップページ > 記事閲覧
DxlibとLive2Dの併用その2-1
名前:Mel 日時: 2014/11/18 00:53

管理人様、前回はお世話になりました。 Melです。 今回質問が2つあります。 その内の1つ目です。 前回のhttp://hpcgi2.nifty.com/natupaji/bbs/patio.cgi?mode=view&no=3420の件の続きです。 Live2Dを描画する前にDrawgraphするとLive2Dの画像がすごい崩壊します。 後だと通常通りLive2D側とDrawgraph側も問題無いです。 読み込む画像拡張子に関係なく再現します。 DrawgraphでもDrawRectRotaGraphFでも再現します。 原因がさっぱりなのでまたお助けを求めにきました。 よろしくお願いします。 //////////////////////////以下サンプルソース///////////////////////// //モデルはイプシロンです。 //mtnファイルはサンプルを使っています。 //髪にサンプルのPhysics.jsonの物理演算使っています。 //Physics.jsonはViewerの中に入ってます。 #include <D3D9.h> //今回のゲームで使うライブラリ宣言 #include <Live2D.h> using namespace live2d; #include "DxLib.h" //Live2D フレームワーク #include <Live2DModelD3D.h> #include <motion/Live2DMotion.h> #include <motion/EyeBlinkMotion.h> #include <motion/MotionQueueManager.h> #include <util/UtSystem.h> #include "L2DTargetPoint.h" #include "L2DPhysics.h" // 画面サイズ #define SCREEN_SIZE_X 800 #define SCREEN_SIZE_Y 750 //Live2d Live2DModelD3D* live2DModel; //モデル LPDIRECT3DDEVICE9 g_Device9; //デバイス Live2DMotion* motion[6]; //モーション //EyeBlinkMotion EBM; //自動瞬き MotionQueueManager* MQM; //モーションマネージャー framework::L2DTargetPoint TP; //自動でsetした方向を向いてくれる framework::L2DPhysics* Physics; //髪の物理演算 int mtn_num; //モーションナンバー int Hbmp; //Dxlib側の画像ハンドル void Render2D(); bool Create(); int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int x, add ; // タイトルを test に変更 SetMainWindowText( "Test_exe" ) ; // ウインドウモードに変更 ChangeWindowMode( TRUE ) ; //描画先を裏画面に変更 SetDrawScreen( DX_SCREEN_BACK ); // Direct3D9Ex ではなく Direct3D9 を使う SetUseDirect3D9Ex( FALSE ) ; // 画面解像度の設定 SetGraphMode( SCREEN_SIZE_X, SCREEN_SIZE_Y, 32 ) ; // DXライブラリ初期化 if( DxLib_Init() == -1 ) { return -1; } // Live2D 初期化 Live2D::init(); // DXライブラリが使用している Direct3DDevice9 を取得 g_Device9 = (LPDIRECT3DDEVICE9)GetUseDirect3DDevice9(); // フォントサイズの変更 SetFontSize(20); // Live2D データの読み込み if(!Create()) { return -1; } // 左右に動く文字列の変数を初期化 x = 0 ; add = 8 ; // 背景色を青に設定 SetBackgroundColor( 0, 0, 255 ) ; // 描画先を裏画面に変更 SetDrawScreen(DX_SCREEN_BACK); //画像読み込みjpg //Hbmp = LoadGraph("TestTex1.jpg"); //if(Hbmp == -1) //{ // DxLib_End(); // return 0; //} //画像読み込みbmp //Hbmp = LoadGraph("KabeTex.bmp"); //if(Hbmp == -1) //{ // DxLib_End(); // return 0; //} //画像読み込みpng Hbmp = LoadGraph("Arrow.png"); if(Hbmp == -1) { DxLib_End(); return 0; } // メインループ while( ProcessMessage()==0 ) { // 画面をクリア ClearDrawScreen(); // 左右に動く文字列を動かす x += add ; if( x < 0 || x > SCREEN_SIZE_X ) { add = -add ; } // Live2D で描くキャラクターの奥に"Live2D"と描画 DrawString(x,64,"Live2D",GetColor(255,255,255)); //DrawGraph(50,50,Hbmp,FALSE); //DrawGraph3D(50,50,0,Hbmp,FALSE); DrawRectRotaGraphF(50.0f,50.0f,0,0,256,256,1.0,0,Hbmp,FALSE,FALSE); // Live2D の描画 Render2D(); //DrawRectRotaGraphF(50.0f,50.0f,0,0,256,256,1.0,0,Hbmp,FALSE,FALSE); int Mouse = GetMouseInput(); int mX = SCREEN_SIZE_X / 2; int mY = SCREEN_SIZE_Y / 2; if( Mouse & MOUSE_INPUT_LEFT) { GetMousePoint(&mX,&mY); } float fX = (mX / (float)SCREEN_SIZE_X) * 2.0f - 1.0f; float fY = (mY / (float)SCREEN_SIZE_Y) * 2.0f - 1.0f; DrawFormatString(0, 0,GetColor(255,255,255),"%d:%d",mX ,mY); DrawFormatString(0, 20,GetColor(255,255,255),"%.2f:%.2f",fX ,-fY); DrawFormatString(0, 40,GetColor(255,255,255),"MotionNum:%d",mtn_num); // Live2D で描くキャラクターの手前にも"Live2D"と描画 DrawString(SCREEN_SIZE_X - x, SCREEN_SIZE_Y - 100,"Live2D",GetColor(255,255,255)); // 裏画面を表画面に転送 ScreenFlip(); } // DXライブラリ使用の終了処理 DxLib_End() ; // ソフトの終了 return 0 ; } void Render2D() { // モデルが初期化されていなければ何もしない if(live2DModel == NULL) return; // DXライブラリの描画処理を完了させる RenderVertex() ; // Live2D の描画 { // 射影行列の設定 D3DXMATRIX Ortho2D; float modelWidth = live2DModel->getModelImpl()->getCanvasWidth() ; float modelHeight = live2DModel->getModelImpl()->getCanvasHeight() ; D3DXMatrixOrthoLH(&Ortho2D, modelHeight ,-modelHeight *SCREEN_SIZE_Y/SCREEN_SIZE_X, -1.0f, 1.0f); g_Device9->SetTransform(D3DTS_PROJECTION, &Ortho2D); // ビュー行列の設定 D3DXMATRIX Identity; D3DXMatrixIdentity(&Identity); g_Device9->SetTransform(D3DTS_VIEW , &Identity); // ワールド行列の設定 D3DXMATRIXA16 world ; D3DXMatrixTranslation(&world , -modelWidth/2, -modelHeight/2, 0) ; g_Device9->SetTransform(D3DTS_WORLD, &world); // --- 描画 if(MQM->isFinished()) { mtn_num++; if(mtn_num == 6) { mtn_num = 0; } MQM->startMotion(motion[mtn_num],false); } int Mouse = GetMouseInput(); int mX = SCREEN_SIZE_X / 2; int mY = SCREEN_SIZE_Y / 2; if( Mouse & MOUSE_INPUT_LEFT) { GetMousePoint(&mX,&mY); } float fX = (mX / (float)SCREEN_SIZE_X) * 2.0f - 1.0f; float fY = (mY / (float)SCREEN_SIZE_Y) * 2.0f - 1.0f; TP.set(fX ,-fY); TP.update(); float dragX = TP.getX(); float dragY = TP.getY(); MQM->updateParam(live2DModel); Physics->updateParam(live2DModel); //顔の向きの調整 live2DModel->setParamFloat( "PARAM_ANGLE_X", dragX * 30 , 0.5 );//-30から30の値を加える live2DModel->setParamFloat( "PARAM_ANGLE_Y", dragY * 30 , 0.5 ); //体の向きの調整 live2DModel->setParamFloat( "PARAM_BODY_X" , dragX * 10 , 0.5 );//-10から10の値を加える //目の向きの調整 live2DModel->setParamFloat( "PARAM_EYE_BALL_X", dragX , 0.5 );//-1から1の値を加える live2DModel->setParamFloat( "PARAM_EYE_BALL_Y", dragY , 0.5 ); live2DModel->update() ; live2DModel->draw() ; } // DXライブラリの Direct3D9 の設定を復帰させる RefreshDxLibDirect3DSetting() ; } bool Create() { LPCWSTR TEXTURES[1] = { L"L2res/model/model.2048/texture_00.png", }; LPCWSTR MTNS[6] = { L"L2res/model/mtn/Epsilon_m_01.mtn", L"L2res/model/mtn/Epsilon_m_02.mtn", L"L2res/model/mtn/Epsilon_m_03.mtn", L"L2res/model/mtn/Epsilon_m_04.mtn", L"L2res/model/mtn/Epsilon_m_05.mtn", L"L2res/model/mtn/Epsilon_m_06.mtn", }; live2DModel = Live2DModelD3D::loadModel("L2res/model/model.moc"); live2DModel->setDevice(g_Device9) ; // テクスチャのロード for( int i = 0 ; i < 1 ; i++ ){ LPDIRECT3DTEXTURE9 tex ; // テクスチャ画像をDirextXでの表示用に変換 if( FAILED( D3DXCreateTextureFromFileExW( g_Device9 , TEXTURES[i] , 0 //width , 0 //height , 0 //mipmap //( 0なら完全なミップマップチェーン) , 0 //Usage , D3DFMT_A8R8G8B8 , D3DPOOL_DEFAULT , D3DX_FILTER_LINEAR , D3DX_FILTER_BOX , 0 , NULL , NULL , &tex ) ) ) { live2d::UtDebug::print( "Could not create texture" ); return false ; } else { // 変換が成功したらセット live2DModel->setTexture( i , tex ) ; } } //EBM.setParam(live2DModel); motion[0] = Live2DMotion::loadMotion("L2res/model/mtn/Epsilon_m_01.mtn"); motion[1] = Live2DMotion::loadMotion("L2res/model/mtn/Epsilon_m_02.mtn"); motion[2] = Live2DMotion::loadMotion("L2res/model/mtn/Epsilon_m_03.mtn"); motion[3] = Live2DMotion::loadMotion("L2res/model/mtn/Epsilon_m_04.mtn"); motion[4] = Live2DMotion::loadMotion("L2res/model/mtn/Epsilon_m_05.mtn"); motion[5] = Live2DMotion::loadMotion("L2res/model/mtn/Epsilon_m_06.mtn"); for(int i = 0;i < 6 ;i++) { //motion[i]->setLoop(true); motion[i]->setLoopFadeIn(false); } MQM = new MotionQueueManager(); mtn_num = 0; Physics = Physics->load("L2res/model/physics.json"); MQM->startMotion(motion[mtn_num],false); return true; }
メンテ

Page: 1 |

Re: DxlibとLive2Dの併用その2-1 ( No.1 )
名前:Mel(解決) 日時:2014/11/18 15:00

すいません。 自己解決しました。 DrawRectRotaGraphFのTransFlgをTRUEにしたら直りました。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存