私はちょっと迷っています、
私はついにGPU上のMD5を使用してスキンメッシュで作業する時間ができました-マトリックスを介して、そして私は必死に正しい結果を得ることができません(それはとても間違っています)!
だからここに私がすることです:
MD5MESHファイルをロードします
バインドポーズメッシュを構築します(この1つのステップは正しく実行されます-ジオメトリは正しいです)
このようにbindposeとinversebindposeを作成します(ジョイントは親によって変換されるのではなく、ロードされた状態で使用されることに注意してください。必要ですか?):
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; }
各フレームで、次のようなボーンマトリックスを作成します(現在、単純なテッセレーションされたクワッドのシーンにボーンが3つしかないため、現在最大4つのウェイトが問題を引き起こしていません-誤って回転します):
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; }
メッシュ+アニメーションファイルは正しいです(それらをエクスポートして3Dモデリングソフトウェアにインポートしました、動作します!)
現在、数学ライブラリに問題がないかどうかをテストしていますが、これまでのところ問題はないようです(行列の反転は良好、クォータニオンの乗算も、クォータニオンからの行列のテスト、...)
そして、私に記事を指摘しないでください。それらのいくつか(マトリックスとソースコードを使用してGPUでMD5スキニングを行うものを含む)を開いて、何が悪いのかを理解しています。これまでのところ、コードは私のものとほとんど同じように見えます。それはいくつかの小さなくだらない詳細になります。
誰もが教祖がどこにいるのかわかりますか?