トップページ > 記事閲覧
Live2Dの挙動についての質問
名前:ちきしんぐ 日時: 2024/11/16 13:21

自分がやろうとしていることは、MakeScreen で描画対象にできるグラフィックを作成します。 作成した描画対象にできるグラフィックに Live2D モデルを描画して使いまわそうとしています。 この時に気になった点が二点あります。 ・Live2D_RenderBegin 〜 Live2D_RenderEnd の間で描画関数を呼ばないようにする必要があるとのことですが、  Live2D_RenderBegin の直前で SetDrawScreen、ClearDrawScreen を呼び出すと意図した動作になりません。  しかし、Live2D_RenderBegin 〜 Live2D_RenderEnd の間で上記の関数を呼び出すと意図した動作になるのですがこれは仕様でしょうか? ・Live2D_Model_GetCanvasWidth、Live2D_Model_GetCanvasHeightでモデルの幅高さが取得できるとのことですが、  取得した幅高さを利用して MakeScreen、DrawModiGraph で作成した描画対象にできるグラフィックにLive2Dモデルを描画すると  モデルが潰れてしまうみたいです。 #include "DxLib.h" int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { int ModelHandle; int GraphHandle; int sizeX, sizeY; // ウィンドウモードで起動 ChangeWindowMode(TRUE); // 画面解像度を設定 SetGraphMode(1920, 1080, 32); // Live2D Cubism Core DLL の読み込み( 64bit アプリの場合と 32bit アプリの場合で読み込む dll を変更 ) Live2D_SetCubism4CoreDLLPath("Live2DCubismCore.dll"); // DXライブラリ初期化処理 if (DxLib_Init() == -1) { return -1; } // Live2Dモデルの読み込み ModelHandle = Live2D_LoadModel("mao_pro_jp/runtime/mao_pro.model3.json"); // Live2D公式で配布されているmaoモデルを使用 sizeX = (int)Live2D_Model_GetCanvasWidth(ModelHandle); sizeY = (int)Live2D_Model_GetCanvasHeight(ModelHandle); GraphHandle = MakeScreen(sizeX, sizeY, TRUE); // 描画先を裏画面に変更 SetDrawScreen(DX_SCREEN_BACK); // メインループ while (ProcessMessage() == 0) { // 画面の初期化 ClearDrawScreen(); // モーション再生が終了していたらアイドリングモーションをランダムで再生 if (Live2D_Model_IsMotionFinished(ModelHandle) == TRUE) { Live2D_Model_StartMotion(ModelHandle, "Idle", GetRand(8)); } // モデルの状態を60分の1秒分進める Live2D_Model_Update(ModelHandle, 1 / 60.0f); //SetDrawScreen(GraphHandle); // 1点目 こっちの描画先の変更だと機能しない? //ClearDrawScreen(); // Live2D描画の開始 Live2D_RenderBegin(); SetDrawScreen(GraphHandle); ClearDrawScreen(); // モデルの描画 Live2D_Model_Draw(ModelHandle); // Live2D描画の終了 Live2D_RenderEnd(); //SetDrawScreen(DX_SCREEN_BACK); DrawModiGraph(0, 0, sizeX, 0, sizeX, sizeY, 0, sizeY, GraphHandle, TRUE); // 2点目 モデルが潰れてしまう // 裏画面の内容を表画面に反映 ScreenFlip(); } // Live2D モデルの削除 Live2D_DeleteModel(ModelHandle); // DXライブラリ使用の終了処理 DxLib_End(); // ソフトの終了 return 0; }
メンテ

Page: 1 |

Re: Live2Dの挙動についての質問 ( No.1 )
名前:管理人 日時:2024/11/17 03:50

> ・Live2D_RenderBegin 〜 Live2D_RenderEnd の間で描画関数を呼ばないようにする必要があるとのことですが、 >  Live2D_RenderBegin の直前で SetDrawScreen、ClearDrawScreen を呼び出すと意図した動作になりません。 >  しかし、Live2D_RenderBegin 〜 Live2D_RenderEnd の間で上記の関数を呼び出すと意図した動作になるのですがこれは仕様でしょうか? 載せていただいたプログラムを実行してみましたが、Live2D_RenderBegin 〜 Live2D_RenderEnd の間に描画関数を 呼ばれた場合意図した動作となったとのことですが、私が確認する限りでは正常な動作とはなっていないようでした > ・Live2D_Model_GetCanvasWidth、Live2D_Model_GetCanvasHeightでモデルの幅高さが取得できるとのことですが、 >  取得した幅高さを利用して MakeScreen、DrawModiGraph で作成した描画対象にできるグラフィックにLive2Dモデルを描画すると >  モデルが潰れてしまうみたいです。 載せていただいたプログラムの DrawModiGraph のコードは DrawModiGraph(0, 0, sizeX, 0, sizeX, sizeY, 0, sizeY, GraphHandle, TRUE); // 2点目 モデルが潰れてしまう こちらですが、こちらは GraphHandle のサイズそのままに描画されていますので DrawGraph(0, 0, GraphHandle, TRUE); とした場合と同じ描画結果となります そしてその際にモデルが潰れてしまうのはまさに Live2D_RenderBegin 〜 Live2D_RenderEnd の間で SetDrawScreen を呼んで しまっているから、となります 私の方で載せていただいたプログラムが正常に動作するように調整してみましたので、よろしければご覧ください m(_ _)m #include "DxLib.h" int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { int ModelHandle; int GraphHandle; int sizeX, sizeY; // ウィンドウモードで起動 ChangeWindowMode(TRUE); // 画面解像度を設定 SetGraphMode(1920, 1080, 32); // Live2D Cubism Core DLL の読み込み( 64bit アプリの場合と 32bit アプリの場合で読み込む dll を変更 ) Live2D_SetCubism4CoreDLLPath("Live2DCubismCore.dll"); // DXライブラリ初期化処理 if (DxLib_Init() == -1) { return -1; } // Live2D の自動サイズ調整をOFF Live2D_SetUseAutoScaling( FALSE ) ; // Live2D の自動中央位置設定をOFF Live2D_SetUseAutoCentering( FALSE ) ; // Live2Dモデルの読み込み ModelHandle = Live2D_LoadModel("mao_pro_jp/runtime/mao_pro.model3.json"); // Live2D公式で配布されているmaoモデルを使用 sizeX = (int)Live2D_Model_GetCanvasWidth(ModelHandle); sizeY = (int)Live2D_Model_GetCanvasHeight(ModelHandle); GraphHandle = MakeScreen(sizeX, sizeY, TRUE); // 描画先を裏画面に変更 SetDrawScreen(DX_SCREEN_BACK); // メインループ while (ProcessMessage() == 0) { // 画面の初期化 ClearDrawScreen(); // モーション再生が終了していたらアイドリングモーションをランダムで再生 if (Live2D_Model_IsMotionFinished(ModelHandle) == TRUE) { Live2D_Model_StartMotion(ModelHandle, "Idle", GetRand(8)); } // モデルの状態を60分の1秒分進める Live2D_Model_Update(ModelHandle, 1 / 60.0f); SetDrawScreen(GraphHandle); ClearDrawScreen(); // Live2D描画の開始 Live2D_RenderBegin(); // モデルの描画 Live2D_Model_Draw(ModelHandle); // Live2D描画の終了 Live2D_RenderEnd(); // 描画先を裏画面に変更 SetDrawScreen(DX_SCREEN_BACK); // 縦長データか横長データかで処理を分岐 if( ( float )sizeX / sizeY < 1920.0f / 1080.0f ) { // 縦長データ用処理 int DrawSizeX = ( int )( ( float )sizeX / sizeY * 1080.0f ) ; int Space = 1920 - DrawSizeX ; // 1920x1080の画面に収まるように縮小して描画 DrawExtendGraph( Space / 2, 0, 1920 - Space / 2, 1080, GraphHandle, TRUE); } else { // 横長データ用処理 int DrawSizeY = ( int )( ( float )sizeY / sizeX * 1920.0f ) ; int Space = 1080 - DrawSizeY ; // 1920x1080の画面に収まるように縮小して描画 DrawExtendGraph( 0, Space / 2, 1920, 1080 - Space / 2, GraphHandle, TRUE); } // 裏画面の内容を表画面に反映 ScreenFlip(); } // Live2D モデルの削除 Live2D_DeleteModel(ModelHandle); // DXライブラリ使用の終了処理 DxLib_End(); // ソフトの終了 return 0; } 尚、DXライブラリの Live2D の機能ではデフォルトで自動的に描画サイズを画面サイズに合わせて拡縮したり、 自動的にモデルを画面中央に描画されるように調整したりする機能が ON になってしまっていて、そのままでは MakeScreen で作成したグラフィックハンドルに元データそのままの描画が行われないので、DxLib_Init 直後に // Live2D の自動サイズ調整をOFF Live2D_SetUseAutoScaling( FALSE ) ; // Live2D の自動中央位置設定をOFF Live2D_SetUseAutoCentering( FALSE ) ; ↑ こちらの2行を実行してその自動調整機能をOFFにしています あと、mao_pro のモデルは 5800x8400 という巨大な縦長データで、1920x1080 の画面にそのまま DrawGraph で等倍描画してもデータの左上部分が見えるだけとなってしまうので // 縦長データか横長データかで処理を分岐 if( ( float )sizeX / sizeY < 1920.0f / 1080.0f ) { // 縦長データ用処理 int DrawSizeX = ( int )( ( float )sizeX / sizeY * 1080.0f ) ; int Space = 1920 - DrawSizeX ; // 1920x1080の画面に収まるように縮小して描画 DrawExtendGraph( Space / 2, 0, 1920 - Space / 2, 1080, GraphHandle, TRUE); } else { // 横長データ用処理 int DrawSizeY = ( int )( ( float )sizeY / sizeX * 1920.0f ) ; int Space = 1080 - DrawSizeY ; // 1920x1080の画面に収まるように縮小して描画 DrawExtendGraph( 0, Space / 2, 1920, 1080 - Space / 2, GraphHandle, TRUE); } ↑ こちらの部分でデータが 1920x1080 より大きく、縦横比が 1920x1080 と異なっても 1920x1080 の画面に収まるように DrawExtendGraph で拡縮して描画するようにしています
メンテ
Re: Live2Dの挙動についての質問 ( No.2 )
名前:ちきしんぐ(解決済み) 日時:2024/11/23 11:02

返信が遅れて申し訳ありません。 ありがとうございます。 無事いただいたコードからやりたいことが出来ました!
メンテ

Page: 1 |

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

   クッキー保存