我有点迷路了
我终于有时间在 GPU 上使用 MD5 处理蒙皮网格了——通过矩阵,我绝望地无法得到正确的结果(这该死的错误)!
所以这就是我所做的:
加载 MD5MESH 文件
构建绑定姿势网格(这一步正确完成 - 几何形状正确)
像这样创建 bindpose 和 inverse bindpose (注意关节被用作加载,而不是由父级转换,它们需要吗?):
for(unsigned int i = 0; i < this->mMatricesCount; i++) { mat4 mBoneTranslation = mat4( 1, 0, 0, mModel->mJoints[i].mPosition.x, 0, 1, 0, mModel->mJoints[i].mPosition.y, 0, 0, 1, mModel->mJoints[i].mPosition.z, 0, 0, 0, 1); mat4 mBoneRotation = mat4(mModel->mJoints[i].mOrientation); mat4 mBoneMatrix = mBoneTranslation * mBoneRotation; this->mMatrices[i] = mBoneMatrix; this->mInverseMatrices[i] = inverse(mBoneMatrix); }
加载 MD5ANIM 文件(其中每个框架关节计算为):
if(mAnimation->mJoints[i].mParent < 0) { mAnimation->mFrames[mFrameID][i].mPosition = _position; mAnimation->mFrames[mFrameID][i].mOrientation = _orientation; } else { MD5FrameJoint *mParent = &mAnimation->mFrames[mFrameID][mAnimation->mJoints[i].mParent]; float4 rpos = rotate(mParent->mOrientation, _position); mAnimation->mFrames[mFrameID][i].mPosition = rpos + mParent->mPosition; mAnimation->mFrames[mFrameID][i].mOrientation = mParent->mOrientation * _orientation; }
每一帧,构建骨骼矩阵(现在最多 4 个权重不会造成问题,因为目前我在简单的镶嵌四边形的场景中只有 3 个骨骼 - 旋转错误):
for(unsigned int i = 0; i < this->mJoints; i++) { const mat4 mTranslate = mat4( 1, 0, 0, this->mFramePositions[mFrame][i].x, 0, 1, 0, this->mFramePositions[mFrame][i].y, 0, 0, 1, this->mFramePositions[mFrame][i].z, 0, 0, 0, 1); const mat4 mRotate = mat4(this->mFrameOrientations[mFrame][i]); this->mOutput[i] = mTranslate * mRotate; }
并计算顶点(现在在 CPU 上做,想把它移到 GPU 上):
for(unsigned int j = 0; j < mSkinnedModel->mVertexCount[i]; j++) { float4 mResult = float4(0, 0, 0, 0); float4 mPosition = float4(mSkinnedModel->mVertices[i][j].mPosition[0], mSkinnedModel->mVertices[i][j].mPosition[1], mSkinnedModel->mVertices[i][j].mPosition[2], 1.0f); for(unsigned int k = 0; k < 4; k++) { mResult += (mAnimatedBones[mSkinnedModel->mVertices[i][j].mBoneIndices[k]] * mPosition) * mSkinnedModel->mVertices[i][j].mBoneWeights[k]; } mBuffer[j].mPosition[0] = mResult.x; mBuffer[j].mPosition[1] = mResult.y; mBuffer[j].mPosition[2] = mResult.z; mBuffer[j].mPosition[3] = 1.0f; }
Mesh + anim 文件是正确的(将它们导出并导入 3d 建模软件,可以!)
现在我正在测试我的数学库是否还可以,到目前为止它看起来不错(矩阵求逆很好,四元数乘法也是,四元数矩阵测试......)
请不要向我指出任何文章,我已经打开了其中一些文章(包括那些在 GPU 上使用矩阵 + 源代码进行 MD5 蒙皮的文章)并找出问题所在,到目前为止,代码看起来几乎和我的一模一样。这将是一些小小的蹩脚的细节。
有人看到大师在哪里吗?