C++ 骨架计算

C++ 骨架计算,c++,matrix,directx-11,skeletal-animation,skeletal-mesh,C++,Matrix,Directx 11,Skeletal Animation,Skeletal Mesh,我正在尝试在我的3D Enigne(DX11)上实现骨骼动画。蒙皮部分工作正常,但骨骼矩阵转换几乎没有问题。我使用的是自制的二进制格式,它基于Valve的SMD,并且已经转换为左手坐标系(Y-Z交换)。这就是我的骨子世界代码: for(int i = 0; i < Model->numJoints; i++) { Bones[i].WorldPos = XMFLOAT3(0.0f, 0.0f, 0.0f); Joint tmpJoint = Model->joi

我正在尝试在我的3D Enigne(DX11)上实现骨骼动画。蒙皮部分工作正常,但骨骼矩阵转换几乎没有问题。我使用的是自制的二进制格式,它基于Valve的SMD,并且已经转换为左手坐标系(Y-Z交换)。这就是我的骨子世界代码:

for(int i = 0; i < Model->numJoints; i++)
{
    Bones[i].WorldPos = XMFLOAT3(0.0f, 0.0f, 0.0f);
    Joint tmpJoint = Model->joints[i]; //bind-pose bone data (translation + orientation)

    //Rotation matrix calculation
    XMMATRIX RotX = XMMatrixRotationX(-tmpJoint.orientation.x);
    XMMATRIX RotY = XMMatrixRotationY(-tmpJoint.orientation.y);
    XMMATRIX RotZ = XMMatrixRotationZ(-tmpJoint.orientation.z);

    //Rot * Translation
    XMMATRIX Local =  RotX * RotY * RotZ * XMMatrixTranslation(tmpJoint.pos.x, tmpJoint.pos.y, tmpJoint.pos.z);

    XMMATRIX tmp;
    if (Model->Skeleton.parentID[i] != -1)
    {
        Bones[i].global = Local * Bones[Model->Skeleton.parentID[i]].global;
    }
    else
        Bones[i].global = Local;

    XMVECTOR temp;
    XMStoreFloat3(&Bones[i].WorldPos, XMVector3Transform(temp, Bones[i].global));
}

    //line between 2 connected bones (aka skeleton)
    bonePoints[i] = Bones[i].WorldPos; //bone position in world
    bonePoints[i+1] = Bones[Model->Skeleton.parentID[i]].WorldPos; //parent bone position in world
for(int i=0;inumJoints;i++)
{
Bones[i].WorldPos=XMFLOAT3(0.0f,0.0f,0.0f);
关节tmpJoint=模型->关节[i];//绑定姿势骨骼数据(平移+方向)
//旋转矩阵计算
XMMATRIX RotX=XMMATRIX rotationx(-tmpJoint.orientation.x);
XMMATRIX RotY=XMMATRIX旋转y(-tmpJoint.orientation.y);
XMMATRIX RotZ=XMMatrixRotationZ(-tmpJoint.orientation.z);
//翻译
XMMATRIX Local=RotX*RotY*RotZ*xmmatrixtransation(tmpJoint.pos.x,tmpJoint.pos.y,tmpJoint.pos.z);
xmp矩阵;
if(Model->Skeleton.parentID[i]!=-1)
{
Bones[i].global=Local*Bones[Model->Skeleton.parentID[i].global;
}
其他的
Bones[i].全局=局部;
向量温度;
XMStoreFloat3(&Bones[i].WorldPos,XMVector3Transform(temp,Bones[i].global));
}
//两个相连骨骼之间的线(又名骨骼)
骨点[i]=Bones[i].WorldPos//世界骨位
bonePoints[i+1]=骨骼[Model->Skeleton.parentID[i]].WorldPos//父骨骼在世界上的位置
正如你在下面的图片中看到的,计算出的sekeleton看起来变形了。 我认为旋转计算部分有问题,可能是因为遗漏了一些额外的转置。我试图改变矩阵乘法顺序,但没有成功