我在Android的OpenGLES应用程序中无法实现骨骼动画。
对于模型,我使用assimp转换了使用3ds max导出的FBX文件,并将其转换为文本文件。该文件加载骨骼数据(顶点,权重,偏移矩阵,层次结构等)。

如果我将骨骼矩阵作为身份矩阵发送,则可以得到绑定姿势:

java - Android OpenGLES骨骼动画问题-LMLPHP

然后,我存储每个节点的子代,并使用此代码以递归方式将节点转换矩阵乘以其父代

public void setBoneHeirarchy()
{

    for (Bone b : mRootBones)
    {
        setBoneTransformations(b, mRootTransform);//From assimp aiScene->mRootNode->mTransformation
    }
}

private void setBoneTransformations(Bone b, Matrix4 parent)
{
    Matrix4 globalTransform = new Matrix4();
    globalTransform.multMatrix(parent); //[this].multMatrix([arg]) multiplies the matrix like [this] = [this] * [arg]
    globalTransform.multMatrix(b.nodeTransformation); //loaded from assimp as aiNode->mTransformation

    b.transformation.loadIdentity(); //the final transformation to return
    b.transformation.multMatrix(mRootTransformInverse); //Inverse of mRootNode->mTransformation
    b.transformation.multMatrix(globalTransform); //calculated above
    b.transformation.multMatrix(b.offsetMatrix); //read from text file (converted with assimp)

    for (Bone child: b.children)
        setBoneTransformations(child, globalTransform);
}


结果是:

java - Android OpenGLES骨骼动画问题-LMLPHP

我认为我的骨骼重量和ID是正确的,因为我得到了以下信息:
i.stack.imgur.com/fcTro.png
当我翻译转换矩阵之一时

我试图遵循ogldev.org/www/tutorial38/tutorial38.html教程

现在我不知道在哪里寻找错误

读取矩阵时有问题吗?还是计算结果?

最佳答案

我尝试了矩阵乘法的许多组合后解决了它


首先,我从FBX切换为Collada文件格式,然后将其转换为自己的格式
从assimp加载矩阵后立即对其进行转置(我在将其加载到着色器中时对其进行了转置)
我没有与assimp的节点变换负载相乘,而是从动画节点的平移,旋转和缩放矢量创建了一个矩阵


我不完全了解是否将它更改为Collada是否有用,但是Google搜索表明人们在FBX格式上遇到了问题。

关于java - Android OpenGLES骨骼动画问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43740035/

10-10 00:40