2012-02-01 14 views
1

私はCとOpenGLで作業しています。私は骨格アニメーションの3Dモデルを読み込もうとしていますが、アニメーションの各フレームの各骨の絶対行列を計算しているようには見えません。各骨の絶対行列を取得するにはどうすればよいですか?

私は以下を持っています:各骨について、私は行列と逆行列を持ち、アニメーションの各フレームについて、私は回転(オイラー)と各骨の平行移動を持っています。

ブレンダーのインポート/エクスポートスクリプト:

http://pastebin.com/xMJ2fG26

http://pastebin.com/9D42RKRf

編集:誰かが(それもいいと思い、ブレンダーおよびエクスポートで私を骨の絶対行列を取得する方法を知っている場合は、」

for each frame f 
    for each bone i 
     glLoadIdentity(); 
     glMultMatrixd(bones[i].matrix); 
     for each parent bone ii(starting from the top) 
      glTranslated(bones[ii].translation[f].x, bones[ii].translation[f].y, bones[ii].translation[f].z); 
      glRotated(bones[ii].degrees[f].z, 0.0, 0.0, 1.0); 
      glRotated(bones[ii].degrees[f].x, 1.0, 0.0, 0.0); 
      glRotated(bones[ii].degrees[f].y, 0.0, 1.0, 0.0); 
     glMultMatrixd(bones[i].inversematrix); 
     glGetDoublev(GL_PROJECTION_MATRIX, bones[i].absmatrix[f]); 
+0

私は、最初の親の骨から回転/転移を適用しようとしました。それから私は骨(まだ最初の親の骨から始まっています)の行列を適用してから、回転/平行移動、次にその骨の逆行列を試してみました。私はまた、他の多くのことを試しました... – Jonathan

+0

あなたが試したことのいくつかの例のコードを与えることができますか、それについては何ができません? –

+0

最新の試行を表す擬似コードを追加しました – Jonathan

答えて

0

これらのスクリプトは、廃止された2.4 * x *バージョンのBlender用に書かれたように見えます。 2.5 * x */2.6 * x *では、 "matrix"属性と "matrix_local"属性を持つBoneのオブジェクトを含む大幅に改良されたPython APIがあります。

現在のバージョンのBlenderでやりたいことをお勧めします。そのようにしてレンガの壁に頭を打つことはあまりありません。

+0

各骨の絶対行列をどのように得ることができるのでしょうか(2.4 * x *)?私はフレームごとに各骨のposeMatrixを使ってみましたが、動作しませんでした。私はBlenderの新しいバージョンを使用できません。これらのスクリプトは動作しませんでした(実際には私は試してみませんでした..) – Jonathan

0

あなたのコメントでは、あなたの2.4スクリプトはBlender 2.5ではうまくいきません。しかし、あなたの問題はあまり複雑ではありません。あなたが得る行列は、各骨から次の骨への局所的な変換です。だから、依存関係ツリーの中でそれを何度も繰り返す必要があります。

それでは、ツリーの深さ優先のトラバースと、ツリーの下の各繰り返しについて、glPushMatrix(); glMultMatrix(bone_matrix);とし、ステップを上げるとglPopMatrix()で効果を戻します。

+0

"bone_matrix"とは骨のアーマチュアマトリックスまたは骨のローカルトランスフォーメーションマトリックスを意味しますか? – Jonathan

+0

@Jonathan:IIRCアーマチュアマトリックスはアーマチュアのピボットポイントの変形です。各骨は、ローカル変換によってその親ボーンに対して相対的にローカルに表される。だから、AM * BM * BM * ... * BMを乗算します。 – datenwolf

関連する問題