Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 科拉达:反向绑定姿势在错误的空间?_C++_Math_Matrix_Skinning_Collada - Fatal编程技术网

C++ 科拉达:反向绑定姿势在错误的空间?

C++ 科拉达:反向绑定姿势在错误的空间?,c++,math,matrix,skinning,collada,C++,Math,Matrix,Skinning,Collada,我正在写我自己的COLLADA进口商。我已经走得很远了,加载网格和材质等等。但我在动画方面遇到了一个障碍,特别是:关节旋转 我用于为网格蒙皮的公式是直截了当的: weighted; for (i = 0; i < joint_influences; i++) { weighted += joint[joint_index[i]]->parent->local_matrix * joint[joint_index[i]]->loc

我正在写我自己的COLLADA进口商。我已经走得很远了,加载网格和材质等等。但我在动画方面遇到了一个障碍,特别是:关节旋转

我用于为网格蒙皮的公式是直截了当的:

weighted;
for (i = 0; i < joint_influences; i++)
{
    weighted += 
        joint[joint_index[i]]->parent->local_matrix * 
        joint[joint_index[i]]->local_matrix * 
        skin->inverse_bind_pose[joint_index[i]] * 
        position * 
        skin->weight[j];
}
position = weighted;
但这让我怀疑COLLADA的反向绑定姿势在错误的空间


所以我的问题是:COLLADA在什么空间中指定其反向绑定姿势?如何将反向绑定姿势转换为所需的空间?

我首先将我的值与从ASIMP(开源模型加载程序)读取的值进行比较。在代码中,我查看了他们在哪里构建绑定矩阵和反向绑定矩阵

最终我进入了
SceneAnimator::GetBoneMatrices
,其中包含以下内容:

// Bone matrices transform from mesh coordinates in bind pose to mesh coordinates in skinned pose
// Therefore the formula is offsetMatrix * currentGlobalTransform * inverseCurrentMeshTransform
for( size_t a = 0; a < mesh->mNumBones; ++a)
{
    const aiBone* bone = mesh->mBones[a];
    const aiMatrix4x4& currentGlobalTransform
        = GetGlobalTransform( mBoneNodesByName[ bone->mName.data ]);
    mTransforms[a] = globalInverseMeshTransform * currentGlobalTransform * bone->mOffsetMatrix;
}
helper->piEffect->SetMatrixTransposeArray( "gBoneMatrix", (D3DXMATRIX*)matrices, 60);
等一下。他们把它们转载了?这不可能那么容易。不可能

是的

还有一点我做错了:在应用蒙皮矩阵之前,我将坐标转换为正确的系统(厘米到米)。这会导致完全扭曲的模型,因为矩阵是为原始坐标系设计的

未来的谷歌人

  • 按照接收顺序读取所有节点变换(旋转、平移、缩放等)
  • 将它们连接到关节的局部矩阵
  • 获取关节的父节点并将其与局部矩阵相乘
  • 将其存储为绑定矩阵
  • 阅读皮肤信息
  • 存储关节的反向绑定姿势矩阵
  • 存储每个顶点的关节权重
  • 绑定矩阵反向绑定姿势矩阵相乘,将其转置,称之为蒙皮矩阵
  • 蒙皮矩阵位置乘以关节的重量,并将其添加到加权位置
  • 使用加权位置进行渲染

完成了

顺便说一句,如果在加载矩阵时转置矩阵,而不是在最后转置矩阵(这在动画制作时可能会有问题),那么您希望以不同的方式执行乘法(上面使用的方法似乎是在使用OpenGL友好矩阵时在DirectX中使用蒙皮-因此转置)

在DirectX中,当矩阵从文件加载时,我会转置矩阵,然后使用(在下面的示例中,为了简单起见,我只是简单地应用绑定姿势):

XMMATRIX l_oWorldMatrix=XMMatrixMultiply(l_oBindPose,in_oParentWorldMatrix)

XMMATRIX l_oMatrixPallette=xmmatrixmultiple(l_oInverseBindPose,l_oWorldMatrix)


矩阵的XMMATRIX l_=xmmatrixmultiple(l_oBindShapeMatrix,l_oMatrixPallette)

您是否阅读过1.4.1规范中的“在COLLADA中为骨架蒙皮”部分?你的公式看起来像个老问题,但很有用!非常感谢你!
helper->piEffect->SetMatrixTransposeArray( "gBoneMatrix", (D3DXMATRIX*)matrices, 60);