Dxlib [w] ================================================================================ -- Dxlib Extension 20241110 -- Live2D 3.X以降 と MMDまわり と Effekseer3D -- -- https://dxlib.xsrv.jp/ ================================================================================ ■最新の変更点 20241110 シェイプまわり(表情関係)の命令セットの追加 ( MV1SetShapeRate , MV1SearchShape , MV1GetShapeNum , MV1GetShapeRate ) 20240713 MMD命令セットの追加 ( SetCOLORF , getCOLORFVal , MV1SetFrameDifColorScale , MV1GetFrameDifColorScale ) 一言で言うとパーツ色の操作機能 20230623 オブジェクト全破壊時に、Live2Dモデルの解放処理が行われていなかったのを修正 20220826 いくつかの不具合の修正 20220825 SetClearColorの追加(仮想画面のクリア色を指定できます) 描画方式の変更により、Dxlibオブジェクトへのエフェクトが適用されるようになります ----------------------------------------------------------- 動作までの配置 CF25\Extensions\Unicode\Dxlib.mfx CF25\Data\Runtime\Unicode\Dxlib.mfx ---------------------------------- 動作に必要なDLLについて d3dx9d_43.dll を使用しています。 公式によるDLL取得はこのパッケージのインストール https://www.microsoft.com/ja-jp/download/details.aspx?id=35 ----------------------------------------------------------- d3dx9d_43.dllを手動で入れる場合に必要な箇所 c:\windows/system32/d3dx9d_43.dll ここに入れる もしくは・・・(例) C:\Program Files\Clickteam Fusion Developer 2.5\d3dx9d_43.dll C:\Program Files\Clickteam Fusion Developer 2.5\Runtime\Unicode\d3dx9d_43.dll に配置が必要 ※CFアプリのビルド時にd3dx9d_43.dllが組み込まれるのでエンドユーザーへの追加DLL配布は不要 ----------------------------------------------------------- ■Live2Dを利用するには Live2DCubismCore.dll が必要です。 プロジェクト(mfa)と同フォルダ内、もしくは C:\Program Files\Clickteam Fusion Developer 2.5\Runtime\Unicode\Live2DCubismCore.dll への配置が必要です。 入手に関しては以下の通り Live2D Cubism 4 SDK for Native ダウンロードページ https://www.live2d.com/en/download/cubism-sdk/ ※Live2D Cubism 4 SDK for Native の中に Live2DCubismCore.dll はあります ダウンロードページに記載されている英文の利用規約の日本語版はこちら Live2D Open Software 使用許諾契約書 https://www.live2d.com/eula/live2d-open-software-license-agreement_jp.html Live2D Proprietary Software 使用許諾契約書 https://www.live2d.com/eula/live2d-proprietary-software-license-agreement_jp.html ※このアーカイブに付属させているDLLは3.X系です -------------------------------------------------------------------------------- ■動作仕様について Live2D 3.X〜 と MMDまわりの3D機能を移植実装しています。 CF25が動作するDirectX9の動作では、頂点計算がハードウェア動作を有効になっているわけではありません。 (そもそも2Dでは必要無い) DxLib内では、このハードウェアによる頂点計算をフルに使用する為 CF25が動作するDirectX9以外に、頂点計算のハードウェア動作を有効にしたDirectX9を並行して動作させています 内部では頂点計算を有効にしたハードウェアによるレンダリング後の画像をCF25に転送している為 動作パフォーマンスが最大とは行きませんが ハードウェア無しの動作に比べたら圧倒的に高速なのでこの方式で動作させています。 ================================================================================ 各種命令セットはDxLibがベースとなっている為 実装には、よりプログラミングに近い考え方が必要になるかもしれません。 ベースとなって居るDxlib関数のリファレンスはこちら https://dxlib.xsrv.jp/function/dxfunc_3d.html 一通り必要そうな機能を移植していますが完全な移植ではありません。 要望があれば別途追加するかもしれません。 ================================================================================ ■DxLibを使ったMMD関係について https://dxlib.xsrv.jp/function/dxfunc_3d_model_0.html 詳しい仕様はDxlibのMMD関係の文献に任せるとして、軽くまとめると 読み込めるファイル形式は x, mqo, mmd(vmd), mv1がサポートされています mqoはメタセコイアのファイル形式。 mmd(vmd)はMMDのファイル形式。 mv1はDXLib専用のファイル形式。 DXLibをDLしたときに付属でついてくるDxLibModelViewerでmv1形式で保存できます。 DxLibModelViewerで扱えるファイル形式はx, mqo, mmd(vmd), mv1, fbxの5つ。 読み込みに掛かる実行速度や、ファイルサイズはmv1形式の方がパフォーマンスが高いので変換する事をお勧めします。 mmd(vmd)形式でも、MMD上の動作を完全に再現している訳ではないので やはりDxLibModelViewerで動作を確認しつつ、変換保存するのがやはり無難でしょう。 モーションデータの読み込みについては 読み込むモデルファイルのファイル名に000〜の数値が付けられたファイルがある場合に読み込まれます。 例) Miku.pmx モデルファイル Miku000.vmd モーションファイル Miku001.vmd Miku002L.vmd Lが付くと、ループモーションとして扱われる ※リンク元の記事に詳しく書かれています DxLibModelViewerからアニメーションファイルも読み込んだ上でmv1形式で保存した場合 アニメーションファイルもmv1形式として1ファイルに纏められるので、やはりお勧めです。 ================================================================================ ■既知の問題 アクティブオブジェクト等の描画オブジェクトが一つも配置されていない場合、エクステンションの描画に失敗する ================================================================================ ■Condition MV1Loaded_Async アクションMV1LoadModel_Asyncによるデータのロードが完了した際に発現します ================================================================================ ■Action □MMD-Model MV1SetLoadModelUsePhysicsMode( val ) MMDモデルをロードした際に、モデルのタイプを指定します (0:DX_LOADMODEL_PHYSICS_LOADCALC 1:DX_LOADMODEL_PHYSICS_DISABLE 2:DX_LOADMODEL_PHYSICS_REALTIME) 0:物理演算を事前に計算してロードする 1:物理演算を使用しない 2:リアルタイムで物理演算を行う MV1SetLoadModelPhysicsWorldGravity( float ) 物理演算に使われる重力値を指定します --------------------------------------------------- MV1LoadModel( path ) モデルデータを読み込みます 読み込み完了後は getLoadedMHandle_MMDからID(MHandle)を取得し、モデルデータを扱います MV1LoadModel_Async( path ) 非同期でモデルデータを読み込みます ロードが完了した場合 Conditionの MV1Loaded_Async が発生します --------------------------------------------------- MV1DuplicateModel( MHandle ) ロード済みモデルデータの複製を行います 複製後のモデルは getLoadedMHandle_MMDからID(MHandle)を取得します MV1DeleteModel( MHandle ) モデルデータの削除を行います --------------------------------------------------- □Physics MV1PhysicsCalculation( MHandle , time(float) ) モデルデータの物理計算の時間を設定します MV1PhysicsResetState( MHandle ) モデルデータの物理計算をリセットします --------------------------------------------------- □Position & Animation MV1SetPosition( MHandle , x(float) , y(float) , z(float) ) モデルデータの座標を設定します MV1SetScale( MHandle , sx(float) , sy(float) , sz(float) ) モデルデータのスケールを設定します MV1SetRotationXYZ( MHandle , rx(float) , ry(float) , rz(float) ) モデルデータの回転を設定します MV1SetVisible( MHandle , val ) モデルデータの表示を設定します MV1SetOpacityRate( MHandle , val(float) ) モデルデータの透過率を設定します --------------------------------------------------- MV1AttachAnim( MHandle , AnimIndex , AnimSrcMHandle , NameCheck ) モデルデータにアニメーションを設定します ※DxlibのリファレンスMV1AttachAnimを参照 AnimIndex: アタッチするアニメーション番号 AnimSrcMHandle: アタッチするアニメーションを持っているモデルのハンドル( -1 を渡すと MHandle と同じモデルハンドルが使用されます ) NameCheck: AnimSrcMHandle が -1 以外の場合にアタッチするアニメーションの フレームの名前とアタッチされる側のモデルのフレームの名前が一致していない場合アタッチしないかどうか( TRUE:アタッチしない FALSE:アタッチする ) この引数は AnimSrcMHandle が -1 の場合は無視されます DxlibによるMMDモデルとアニメーション動作の仕様として、ファイル名に命名規則があります。 アニメーションファイルvmdは、読み込みモデル名に番号を付けた形で用意しておく必要があります。 例) miku.mv1 miku000.vmd…miku001.vmd…miku010.vmd このアニメーションファイル数字部分がAnimIndexと連動しています MV1DetachAnim( MHandle , AttachIndex ) モデルデータからアニメーションをデタッチします MV1SetAttachAnimTime( MHandle , AttachIndex , time(float) ) モデルデータにアタッチしているアニメーションの再生時間を設定します MV1SetAttachAnimBlendRate(MHandle , AttachIndex , rate(float 0.0 - 1.0) ) アタッチしているアニメーションのブレンド率を設定します ※歩きモーションから走りモーションへの移行する場合等で使うと、滑らかに見えるようになります --------------------------------------------------- □Frame MV1SetFrameVisible( MHandle , FrameIndex , VisibleFlag (1:on 0:off) ) フレームの表示・非表示状態を変更します MV1SetFrameUserLocalMatrix( MHandle , FrameIndex , Matrix(input) ) フレームの座標変換行列を設定します MV1ResetFrameUserLocalMatrix( MHandle , FrameIndex ) フレームの座標変換行列をデフォルトに戻します --------------------------------------------------- MV1GetFrameLocalMatrix( Matrix name(output) , MHandle , FrameIndex ) フレームの座標変換行列を取得します MV1GetFrameLocalWorldMatrix( Matrix name(output) , MHandle , FrameIndex ) フレームのローカル座標からワールド座標に変換する行列を取得します MV1GetFramePosition( VECTOR name(output) , MHandle , FrameIndex ) フレームの座標を取得します --------------------------------------------------- MV1SetFrameDifColorScale( MHandle , FrameIndex , COLORF name(input) ) フレームのディフューズカラーのスケール値を設定します MV1GetFrameDifColorScale( COLORF name(output) , MHandle , FrameIndex ) フレームのディフューズカラーのスケール値を取得します --------------------------------------------------- MV1SetMaterialOutLineDotWidth( MHandle , width(float) ) モデルデータのアウトライン幅を設定します MV1SetMaterialOutLineColor( MHandle , r(float) , g(float) , b(float) , a(float) ) モデルデータのアウトライン色を設定します --------------------------------------------------- MV1SetMatrix( MHandle , Matrix name(input) ) モデルデータにMatrix(姿勢情報)を設定します MV1GetMatrix( MHandle , Matrix name(output) ) モデルデータに設定されているMatrixを取得します --------------------------------------------------- □Shape MV1SetShapeRate( MHandle , ShapeIndex , Rate(float) ) シェイプの適用率を設定します --------------------------------------------------- □ShadowMap MakeShadowMap( width(^2) , height(^2) ) シャドウマップを作成します ※作成するシャドウマップは2の累乗の数値である事が望ましい(256,512,1024…) 作成されたシャドウマップは getMakeShadowMapHandle よりID(SmHandle)を取り出します。 SetShadowMapDrawArea( SmHandle , min(x) float , min(y) float , min(z) float max(x) float , max(y) float , max(z) float ) シャドウマップに描画する範囲を設定します SetShadowMapLightDirection( SmHandle , dir(x) float , dir(y) float , dir(z) float ) シャドウマップへの描画で想定するライトの方向を設定します --------------------------------------------------- AddShadowMapMV1Object( SmHandle , MHandle ) シャドウマップを適用するモデルデータを設定します DelShadowMapMV1Object( SmHandle , MHandle ) シャドウマップからモデルデータの適用を外します --------------------------------------------------- □Collision MV1SetupCollInfo( MHandle , FrameIndex (-1:all) , XDivNum , YDivNum , ZDivNum ) モデルデータからコリジョン情報を構築します FrameIndex : コリジョンの情報を構築するフレームの番号 XDivNum : コリジョン情報のX軸方向の空間分割数 YDivNum : コリジョン情報のY軸方向の空間分割数 ZDivNum : コリジョン情報のZ軸方向の空間分割数 MV1RefreshCollInfo( MHandle , FrameIndex (-1:all) ) コリジョン情報を更新します ※動作させないモデルをコリジョンポリゴンとして使用している場合は呼ぶ必要はありません MV1TerminateCollInfo( MHandle , FrameIndex ) コリジョン情報の後始末をします --------------------------------------------------- MV1CollCheck_Line( MHandle , FrameIndex , start VECTOR , end VECTOR ) 線分とモデルの当たり判定をチェックします ※チェックの結果は、getHitNum , getHitDim_HitPositionなどで取り出します MV1CollCheck_Sphere( MHandle , FrameIndex , CenterPos VECTOR , r(float) ) 球とモデルの当たり判定をチェックします MV1CollCheck_Capsule( MHandle , FrameIndex , Pos1 VECTOR , Pos2 VECTOR , r(float) ) カプセルとモデルの当たり判定をチェックします --------------------------------------------------- □CF-Screen CFScreenToSetPosition( MHandle , x(cf pos x) , y(cf pos x) ) モデルデータをCF25基準の座標位置にセットします --------------------------------------------------- □Camera SetCameraNearFar( Near(float) , Far(float)) カメラの手前クリップ距離と奥クリップ距離を設定する SetCameraPositionAndTarget_UpVecY( cam x(float) , cam y(float) , cam z(float) , target x(float) , target y(float) , target y(float) ) カメラの視点、注視点を設定する( 上方向はY軸から算出 ) --------------------------------------------------- SetUseLighting( flg ) ライティング計算処理を使用するかどうかを設定する SetGlobalAmbientLight( r(float) , g(float) , b(float) ) グローバルアンビエントライトカラーを設定する --------------------------------------------------- SetCameraViewMatrix( Matrix name(input) ) ビュー行列を直接設定する GetCameraViewMatrix( Matrix name(output) ) カメラのビュー行列を取得する SetupCamera_ProjectionMatrix( Matrix name(input) ) 射影行列を設定する GetCameraProjectionMatrix( Matrix name(output) ) カメラの射影行列を取得する --------------------------------------------------- SetupVMDCameraMotionParam( MHandle(camera) , time(float) ) モーション入りカメラの再生時間を設定します --------------------------------------------------- □MATRIX MGetIdent( Matrix name(input) ) 単位行列を取得する MGetScale( Matrix name(input) , x(float) , y(float) , z(float) ) 拡大行列を取得する MGetTranslate( Matrix name(input) , x(float) , y(float) , z(float) ) 平行移動行列を取得する MGetRotX( Matrix name(input) , rotate(float) ) X軸回転行列を取得する MGetRotY( Matrix name(input) , rotate(float) ) Y軸回転行列を取得する MGetRotZ( Matrix name(input) , rotate(float) ) Z軸回転行列を取得する --------------------------------------------------- MAdd( Matrix name(output) , Matrix name 1(input) , Matrix name 2(input) ) 二つの行列の足し算を行う MMult( Matrix name(output) , Matrix name 1(input) , Matrix name 2(input) ) 二つの行列の乗算を行う MScale( Matrix name(output) , Matrix name(input) , scale(float) ) 行列のスケーリングを行う MTranspose( Matrix name(output) , Matrix name(input) ) 転置行列を取得する MInverse( Matrix name(output) , Matrix name(input) ) 逆行列を取得する --------------------------------------------------- SetMatrixVal( Matrix name(input) , mat[y][] 0-3 , mat[][x] 0-3 , val(float) ) 行列に値を設定する --------------------------------------------------- □VECTOR SetVectorVal( Vector name(input) , x(float) , y(float) , z(float) ) ベクトル(構造体)に値を設定します □COLORF SetCOLORF( COLORF name(input) , r(float) , g(float) , b(float) , a(float) ) カラースケール(構造体)に値を設定します --------------------------------------------------- □LIVE2D Live2D_LoadModel( path ) Live2D のモデルファイルを読み込む 読み込み完了後は getLoadedLive2DModelHandle からID(Live2DModelHandle)を取得し、モデルデータを扱います Live2D_DeleteModel( Live2DModelHandle ) Live2D のモデルを削除する --------------------------------------------------- Live2D_Model_SetTranslate( Live2DModelHandle , x(float) , y(float) ) Live2D のモデルの位置を設定する Live2D_Model_SetExtendRate( Live2DModelHandle , scale x(float) , scale y(float) ) Live2D のモデルの拡大率を設定する Live2D_Model_SetRotate( Live2DModelHandle , rotate(float) ) Live2D のモデルの回転を設定する Live2D_Model_Opacity( Live2DModelHandle , val( 0 ~ 255 ) ) Live2Dモデルの透過値を設定します --------------------------------------------------- Live2D_Model_StartMotion( Live2DModelHandle , group name , number ) Live2D のモデルの指定のモーションを再生する Live2D_Model_SetExpression( Live2DModelHandle , expressionID ) Live2D のモデルの指定の表情モーションを設定する --------------------------------------------------- Live2D_Model_SetParameterValue( Live2DModelHandle , parameterId , val(float) ) Live2D のモデルのパラメータを設定する --------------------------------------------------- Live2D_Model_Update( Live2DModelHandle , time(float) ) Live2D のモデルの状態を更新する --------------------------------------------------- □Effekseer LoadEffekseerEffect( slot num , file name , scale(float) ) エフェクトデータをファイルを読み込みます、その際スケール値も設定します DeleteEffekseerEffect( slot num ) エフェクトデータを削除します PlayEffekseer3DEffect( slot num ) エフェクトデータを再生します 再生したエフェクトはgetPlayEffekseerHandleにより識別用のIDを取得します --------------------------------------------------- StopEffekseer3DEffect( playingEffectHandle ) 再生中のエフェクトを停止します SetPosPlayingEffekseer3DEffect( playingEffectHandle , x(float) , y(float) , z(float) ) エフェクトの位置を設定します SetRotationPlayingEffekseer3DEffect( playingEffectHandle , x(float) , y(float) , z(float) ) エフェクトの姿勢を設定します SetScalePlayingEffekseer3DEffect( playingEffectHandle , x(float) , y(float) , z(float) ) エフェクトの拡大率を設定します SetSpeedPlayingEffekseer3DEffect( playingEffectHandle , speed(float) ) エフェクトの再生スピードを設定します SetColorPlayingEffekseer3DEffect( playingEffectHandle , r , g , b , a ) エフェクトの色を設定します SetDynamicInput3DEffect( playingEffectHandle , index , val(float) ) エフェクトの動的パラメーターを設定する --------------------------------------------------- □DRAW ※任意で描画させる方式になって居ます ClearDrawScreen DxLib用の仮想画面をクリアします DrawMMD 3D関係を描画します(Effekseer3D含む) DrawLive2D Live2D関係を描画します SetClearColor DxLib用の仮想画面のクリア色を指定します --------------------------------------------------- DrawLine3D( Pos1 VECTOR , Pos2 VECTOR , col ) 3D空間に線を描画します DrawTriangle3D( Pos1 VECTOR , Pos2 VECTOR , Pos3 VECTOR , col , FillFlag ) 3D空間に三角形を描画します DrawSphere3D( CenterPos VECTOR , r(float) , DivNum , DifColor , SpcColor , FillFlag ) 3D空間に球を描画します 分割数等、細かいパラメーターがありますので詳細はこちらを参照 https://dxlib.xsrv.jp/function/dxfunc_3d_draw.html#R14N4 DrawCapsule3D( Pos1 VECTOR , Pos2 VECTOR , r(float) , DivNum , DifColor , SpcColor , FillFlag ) 3D空間にカプセルを描画します DrawCone3D( TopPos VECTOR , BottomPos VECTOR , r(float) , DivNum , DifColor , SpcColor , FillFlag ) 3D空間にコーンを描画します --------------------------------------------------- □FONT ※DxLibのフォント描画機能 DrawString( x , y , String , Color , Edge Color ) 文字を描画します SetFont( font name , font size , font thickness , type( 0:none 1:Edge 2:Anti 3:A4X4 4:A8X8 5:AE 6:AE4X4 7:AE8X8 ) フォントを設定します 0 DX_FONTTYPE_NORMAL : ノーマルフォント 1 DX_FONTTYPE_EDGE : エッジつきフォント 2 DX_FONTTYPE_ANTIALIASING : アンチエイリアスフォント 3 DX_FONTTYPE_ANTIALIASING_4X4 : アンチエイリアスフォント( 4x4サンプリング ) 4 DX_FONTTYPE_ANTIALIASING_8X8 : アンチエイリアスフォント( 8x8サンプリング ) 5 DX_FONTTYPE_ANTIALIASING_EDGE : アンチエイリアス&エッジ付きフォント 6 DX_FONTTYPE_ANTIALIASING_EDGE_4X4 : アンチエイリアス&エッジ付きフォント( 4x4サンプリング ) 7 DX_FONTTYPE_ANTIALIASING_EDGE_8X8 : アンチエイリアス&エッジ付きフォント( 8x8サンプリング ) ) ※参考 https://dxlib.xsrv.jp/function/dxfunc_graph2.html#R17N8 https://dxlib.xsrv.jp/function/dxfunc_graph2.html#R17N24 --------------------------------------------------- ================================================================================ ■Expression □MMD getLoadedMHandle_MMD ロードされたモデルのIDを取得する getAttachIndex_MMD アタッチされたIDを取得する --------------------------------------------------- □Position & Animation MV1GetPosition( MHandle , 0x_1y_2z ) モデルの座標情報を取得する MV1GetAttachAnimTime( MHandle , AttachIndex ) アタッチされているアニメーションの再生時間を得る MV1GetAttachAnimTotalTime( MHandle , AttachIndex ) アタッチされているアニメーションの終了時間を得る --------------------------------------------------- □Frame MV1SearchFrame( MHandle , FrameName ) フレーム名からフレームIDを得る MV1GetAttachAnimFrameLocalPosition( MHandle , AttachIndex , FrameIndex , 0x_1y_2z ) フレームのローカル座標を取得する --------------------------------------------------- □Shape MV1GetShapeNum( MHandle ) モデルに含まれるシェイプの数を得る MV1SearchShape( MHandle , ShapeName) シェイプ名からシェイプIDを得る MV1GetShapeRate( MHandle , ShapeIndex ) シェイプIDからシェイプレート値を得る --------------------------------------------------- □Collision getHitNum 当たり判定のIDを取得する --------------------------------------------------- getHitDim_HitPosition( Number , 0x_1y_2z ) ヒット箇所の座標を取得する getHitDim_FrameIndex( Number ) ヒット箇所のフレームIDを取得する getHitDim_MaterialIndex( Number ) ヒット箇所のマテリアルIDを取得する getHitDim_Position( Number , triangle_0_2 , 0x_1y_2z ) ヒットした三角形の頂点情報を得る getHitDim_Normal( Number , 0x_1y_2z ) ヒットした三角形の法線情報を得る --------------------------------------------------- □ShadowMap getMakeShadowMapHandle 作成したシャドウマップのIDを得る --------------------------------------------------- □CF-Screen CF_GetPositionAnimPosition( MHandle , AttachIndex , FrameIndex , 0x_1y ) 画面上での表示位置を取得する --------------------------------------------------- □MATRIX,VECTOR,COLORF getMatrixVal( Matrix_name , y , x ) マトリクスの指定位置にある値を取得する getVectorVal( VECTOR_name , 0x_1y_2z ) ベクトルの指定した値を取得する getCOLORFVal( COLORF name , 0r_1g_2b_3a ) カラースケールの指定した値を取得する --------------------------------------------------- □LIVE2D getLoadedLive2DModelHandle ロードしたモデルデータのIDを得る --------------------------------------------------- Live2D_Model_IsMotionFinished( Live2DModelHandle ) モデルデータがモーション再生の終了状態を得る Live2D_Model_GetParameterValue( Live2DModelHandle , ParamName ) モデルデータのパラメーター値を得る Live2D_Model_HitTest( Live2DModelHandle , hitAreaName , fx , fy ) モデルデータに設定されている当たり判定に当たっているかチェックする --------------------------------------------------- □FONT getDrawStringWidth( String ) 文字の幅を得る --------------------------------------------------- □Effekseer getPlayEffekseerHandle 再生したエフェクトのIDを得る IsEffekseer3DEffectPlaying( playingEffectHandle ) エフェクトの再生状態を得る ================================================================================ ■コラム 3Dプログラミングに出てくるMatrix(マトリクス・行列とも言います)とは3D空間における位置、スケール、回転を表す情報の集合体です。 情報の実態は4*4のfloat情報であり、内部ではこの16個の小数点に行列計算を行う事で3Dにおける計算を楽に扱う事が出来るようになります。 実際に使うのはこのMatrixという概念の入れ物で このMatrix同士を掛け算することによって、簡単に姿勢情報を合成することができるという恩恵が受けられます。 例えば、回転情報が入ったMatrixと位置情報が入ったMatrix同士を計算すると、それぞれの情報が合わさった回転&位置のMatrixが出来上がります。 注意点として、この計算は計算する順番が大事で 回転してから移動する結果と、移動してから回転する結果では、得られるMatrixは異なったものになります。 (移動してから回転はホットスポットの位置を変えてからの回転と同じ感じの動作イメージです) ================================================================================ ■サンプルデータについて サンプルデータに使っているモデル及び、モーションデータには著作権が存在します 利用規約については、それぞれのデータフォルダのテキストファイルに記述されています。 ・Live2D サンプルモデル桃瀬ひより(PRO版) ・Appearance Miku ver 1.00 ・【MMD】移動モーション v1.3 □BGMデータ みきとP 『 いーあるふぁんくらぶ 』 https://www.youtube.com/watch?v=oBgADhsOoog □Danceモーション 【MMDモーション配布】いーあるふぁんくらぶ【モーションキャプチャー】 https://www.nicovideo.jp/watch/sm40308776 ================================================================================ ■各種ライブラリのライセンスについて libjpeg Copyright (C) 1991-2013, Thomas G. Lane, Guido Vollbeding. libpng Copyright (C) 2004, 2006-2012 Glenn Randers-Pehrson. zlib Copyright (C) 1995-2012 Jean-loup Gailly and Mark Adler. libtiff Copyright (c) 1988-1997 Sam Leffler libtiff Copyright (c) 1991-1997 Silicon Graphics, Inc. Bullet Copyright (c) 2003-2006 Erwin Coumans. ================================================================================ ■あとがき 色々な制作物(Extension)は役に立っているでしょうか? 使った作品でもありましたら、こっそりと教えて頂ければと思います。 DOWNLOAD(34.5MB)(add dll) Dxlib_20230623(34.5MB)(add dll) Dxlib_20220826(33.6MB)