こんにちは。
いつも DXライブラリ を利用させていただいております。
現在、以下のようなコードでフレームの変形を行っています。
======================================================================================================================
public void SetFrame(int frameIndex, VECTOR bPos, VECTOR bRot, float bRotW, VECTOR bSca)
{
// 正規化
float len = (float)Math.Sqrt(
bRot.x * bRot.x + bRot.y * bRot.y +
bRot.z * bRot.z + bRotW * bRotW);
float x = bRot.x / len;
float y = bRot.y / len;
float z = bRot.z / len;
float w = bRotW / len;
float x2 = x + x, y2 = y + y, z2 = z + z;
float xx = x * x2, xy = x * y2, xz = x * z2;
float yy = y * y2, yz = y * z2, zz = z * z2;
float wx = w * x2, wy = w * y2, wz = w * z2;
MATRIX rotMat = DX.MGetIdent();
rotMat.m00 = 1.0f - (yy + zz);
rotMat.m01 = xy + wz;
rotMat.m02 = xz - wy;
rotMat.m10 = xy - wz;
rotMat.m11 = 1.0f - (xx + zz);
rotMat.m12 = yz + wx;
rotMat.m20 = xz + wy;
rotMat.m21 = yz - wx;
rotMat.m22 = 1.0f - (xx + yy);
MATRIX result = rotMat;
float sx = bSca.x;
float sy = bSca.y;
float sz = bSca.z;
result.m00 *= sx; result.m01 *= sx; result.m02 *= sx;
result.m10 *= sy; result.m11 *= sy; result.m12 *= sy;
result.m20 *= sz; result.m21 *= sz; result.m22 *= sz;
DX.MV1SetFrameUserLocalMatrix(modelHandle, frameIndex, result);
}
======================================================================================================================
このコードを用いて、例えば次のようなボーン構造を持つモデルの変形を行いたいと考えています。
手L ← 腕L2 ← 腕L1 ← 体 → 腕R1 → 腕R2 → 手R
しかし、以下のような問題が発生しています。
1. 親ボーンのスケールの影響を受けてしまう
例えば 腕L2 に scale (2,2,2) を設定すると、
手L に (1,1,1) を渡しても、結果として (2,2,2) 基準のスケールで変形されてしまいます。
この挙動を避けて、各ボーンのスケールを独立して制御する方法があるのか知りたいです。
2. スケール適用時にフレームラインの形が変わる
上記のコードで scale を適用すると、
DXLib のデバッグ表示などで確認できる ボーンのフレームラインの形状が変化してしまいます。
例えば
scale = (1,1,1)
scale = (1.2,1.2,1.2)
で フレームラインの形状自体が変わってしまうようです。
現在、フレームのスケールを変更する方法として
MV1SetFrameUserLocalMatrix 以外の方法が見つけられていません。
もし、より適切な方法や推奨される実装方法がありましたら、
ご教授いただけますと幸いです。
よろしくお願いいたします。