皮のメッシュでロスト)!は</p> <p>私は最終的にGPU上でMD5と皮メッシュ上で動作する時間を持って、私は一種の迷ってしまいました
だからここに私が何をすべきかです: -
はMD5MESHファイルをロードし
ビルドメッシュ(ジオメトリが正しいか、この一歩が正しく行われている)バインドポーズこのようなバインドと逆バインドを作成します(ジョイントは読み込まれたものとして使用されますが、親によって変換されるのではありません)。
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点の重みの最大は、現在I、トラブルの原因とされていないような骨マトリックスを構築シンプルなモザイク状のクワッド上のシーンでわずか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; }
(+のアニメーションファイルが正しいメッシュは、(それらをエクスポートし、3Dモデリングソフトウェアにインポート、作品!)
今、私は私の数学ライブラリは大丈夫であるかどうかをテストすることだし、これまでのところ、それは良いようです行列逆行列は良いですが、四元数の乗算も四元数からの行列です...)
そして私には何かを指摘しないでください。行列+ソースコード付きのGPUでMD5スキニングをしている人)が開いて何が間違っているのか分かりませんが、これまでのコードはほぼ私のようです。それはいくつかの小さなちっさいな細部になります。
誰でもグルがどこですか?
MD5は、最も一般的なハッシュアルゴリズムです。私はそのタグを削除しました。 – rekire