@wanwanswan 様
Lvie2D スタッフでございます。
行列の回転の考慮が漏れており、重ねてご不便をおかけしてしまい大変申し訳ございません。
再度調査を行い、修正コードを作成致しました。
前回の回答での修正コードは破棄いただいたうえで、以下の修正コードにて再度ご確認いただければと思います。
Framework\src\Math\CubismMatrix44.cpp にMatrix配列ゲッターの実装の追加
const csmFloat32* CubismMatrix44::GetArray() const
{
return _tr;
}
Framework\src\Math\CubismMatrix44.hpp にMatrix配列ゲッターの宣言の追加
const csmFloat32* GetArray() const;
Framework\src\Rendering\D3D11\CubismRenderer_D3D11.cpp のオフスクリーン描画時の処理の修正 316行目辺り
修正前
if (drawableObjectType == CubismRenderer::DrawableObjectType_Offscreen)
{
// clipContext * mvp^-1
CubismMatrix44 invertMvp = renderer->GetMvpMatrix().GetInvert();
clipContext->_matrixForDraw.MultiplyByMatrix(&invertMvp);
}
修正後
if (drawableObjectType == CubismRenderer::DrawableObjectType_Offscreen)
{
CubismMatrix44 projClip = CubismRenderer::CreateOffscreenMaskClipMatrix(renderer->GetMvpMatrix(), clipContext->_matrixForDraw);
clipContext->_matrixForDraw.SetMatrix(projClip.GetArray());
}
Framework\src\Rendering\CubismClippingManager.tpp のオフスクリーン描画時の処理の修正
修正前
if (CubismRenderer::DrawableObjectType_Offscreen == drawableObjectType)
{
// clipCpntext * mvp^-1
CubismMatrix44 invertMvp = mvp.GetInvert();
clipContext->_matrixForDraw.MultiplyByMatrix(&invertMvp);
}
修正後
if (CubismRenderer::DrawableObjectType_Offscreen == drawableObjectType)
{
CubismMatrix44 projClip = CubismRenderer::CreateOffscreenMaskClipMatrix(mvp, clipContext->_matrixForDraw);
clipContext->_matrixForDraw.SetMatrix(projClip.GetArray());
}
Framework\src\Rendering\CubismRenderer.cpp にオフスクリーン描画用マスクのMatrix定義関数の実装の追加
CubismMatrix44 CubismRenderer::CreateOffscreenMaskClipMatrix(const CubismMatrix44& mvp, const CubismMatrix44& matrixForDraw)
{
// 3x3行列を抽出
const csmFloat32* const mvpArray = mvp.GetArray();
const csmFloat32 r00 = mvpArray[0];
const csmFloat32 r01 = mvpArray[1];
const csmFloat32 r02 = mvpArray[3];
const csmFloat32 r10 = mvpArray[4];
const csmFloat32 r11 = mvpArray[5];
const csmFloat32 r12 = mvpArray[7];
const csmFloat32 r20 = mvpArray[12];
const csmFloat32 r21 = mvpArray[13];
const csmFloat32 r22 = mvpArray[15];
// 3×3行列の逆行列を計算
const csmFloat32 det = r00 * (r11 * r22 - r12 * r21) -
r01 * (r10 * r22 - r12 * r20) +
r02 * (r10 * r21 - r11 * r20);
CubismMatrix44 dst;
if (CubismMath::AbsF(det) < CubismMath::Epsilon)
{
dst.LoadIdentity();
return dst;
}
const csmFloat32 invDet = 1.0f / det;
csmFloat32 invMatrix[3][3];
invMatrix[0][0] = (r11 * r22 - r12 * r21) * invDet;
invMatrix[0][1] = -(r01 * r22 - r02 * r21) * invDet;
invMatrix[0][2] = (r01 * r12 - r02 * r11) * invDet;
invMatrix[1][0] = -(r10 * r22 - r12 * r20) * invDet;
invMatrix[1][1] = (r00 * r22 - r02 * r20) * invDet;
invMatrix[1][2] = -(r00 * r12 - r02 * r10) * invDet;
invMatrix[2][0] = (r10 * r21 - r11 * r20) * invDet;
invMatrix[2][1] = -(r00 * r21 - r01 * r20) * invDet;
invMatrix[2][2] = (r00 * r11 - r01 * r10) * invDet;
// 描画行列から3×3行列を抽出
const csmFloat32* const draw = matrixForDraw.GetArray();
const csmFloat32 drawMatrix[3][3] = {
{ draw[0], draw[1], draw[3] },
{ draw[4], draw[5], draw[7] },
{ draw[12], draw[13], draw[15] }
};
// invMatrix * drawMatrix を計算
csmFloat32 resultMatrix[3][3] = {};
for (csmInt32 i = 0; i < 3; ++i)
{
for (csmInt32 j = 0; j < 3; ++j)
{
for (csmInt32 k = 0; k < 3; ++k)
{
resultMatrix[i][j] += invMatrix[i][k] * drawMatrix[k][j];
}
}
}
// 3×3の結果を4×4にする
csmFloat32 clipMatrix[16] = {};
clipMatrix[0] = resultMatrix[0][0];
clipMatrix[1] = resultMatrix[0][1];
clipMatrix[3] = resultMatrix[0][2];
clipMatrix[4] = resultMatrix[1][0];
clipMatrix[5] = resultMatrix[1][1];
clipMatrix[7] = resultMatrix[1][2];
clipMatrix[12] = resultMatrix[2][0];
clipMatrix[13] = resultMatrix[2][1];
clipMatrix[15] = resultMatrix[2][2];
dst.SetMatrix(clipMatrix);
return dst;
}
Framework\src\Rendering\CubismRenderer.hpp にオフスクリーン描画用マスクのMatrix定義関数の宣言の追加
static CubismMatrix44 CreateOffscreenMaskClipMatrix(const CubismMatrix44& mvp, const CubismMatrix44& matrixForDraw);
ご不明な点がございましたら、お気軽にお問い合わせください。 引き続きどうぞよろしくお願いいたします。