> ・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 で拡縮して描画するようにしています