2013-02-26 10 views
5

Androidアプリでは、走っている脚を描きたい。脚の上部を出力するには、次のようにします。どのように変換してから次に平行移動し、次に回転させるのかを行列で計算しますか?

// legCX,legCY is the location on screen about which the leg rotates. 
Matrix m = new Matrix(); 
m.postTranslate(-legCX,-legCY); 
m.postRotate(legRot); 
m.postTranslate(legCX,legCY); 

次に、キャンバスに行列を設定して脚を描画します。

どのように私は膝から下の脚の第二の部分を描くのですか?それはその上の脚とは異なる速度で回転し、上の脚で動く中心点を有する。私は次のことを試しましたが、最終結果は上の脚に従わない単一の点の回りの回転です。

Matrix m = new Matrix(); 
m.postTranslate(-legCX,-legCY); 
m.postRotate(legRot); 
m.postTranslate(0,-legLength); 
m.postRotate(footRot); 
m.postTranslate(0,legLength); 
m.postTranslate(legCX,legCY); 

私はそれが二つの異なるマトリックスオブジェクトに2つの回転を行い、その後、何とかそれらを組み合わせることがおそらく必要だと思われるが、私はそれを行う方法を正確に把握することはできません。

EDIT: 行列のこのタイプは、「変換行列」と呼ばれているように見えます。複数の操作を組み合わせることは、変換の合成と呼ばれます。しかし、このトピックのページでは、一連の翻訳と回転のしかたについては言及していません。あなたは1点の周りで回転を行うには、マトリックスを使用できるかどう

確かに、一点と異なる点の周りの追加の回転についての回転を可能にする何らかの方法で、複数の行列演算を行うことが可能でなければなりません。

私は、骨格アニメーションのページを見てみましたが、私は、彼らが何を言ってるのかの頭や尾をすることはできません。

+0

あなたは 'legRot'を取り消すのを忘れたようです。あなたの最も内側の回転を除いて、他のすべての操作は完全にバランスが取れているはずです。これを実現するには、逆回転を適切な位置に追加するか、最初の3つの演算を1つの行列に結合し、その行列を最初に適用し、その後逆行列を適用します。これで問題が解決したら、このコメントを回答に変えます。 – MvG

+0

これは機能しませんでした。私はこれを行う方法についてのチュートリアルを見つけることができればいいと思うが、それは不可能であるか、または間違ったことを探している。 – HappyEngineer

答えて

6

私が正しくあなたの問題を理解していれば、あなたは相対回転ケースを持っています。あなたは二重振り子を検索しようとすることができます。回転行列を使用

double pendulum

p0回りに回転点p1の新しい座標があろう点p1回りに回転点p2

新しい座標のように求めることができる

最後に、ポイントp0周りに回転ポイントp2の新しい座標は

行列の掛け算の順番に、同様の角度の符号になります。

+0

私はgamedevでの答えを把握します。あなたがここでやっている実際の数学に対応しているのかどうかは分かりません。それはそのようには見えませんが、Matrixオブジェクトが何をしているのかは完全にはわかりません。 http://gamedev.stackexchange.com/questions/50171/what-matrix-operations-do-i-perform-to-translate-then-rotate-then-translate-then – HappyEngineer

2

私は、これは、言語に依存しないことになるだろう怖い - 私は実際にAndroidの中の瞬間に似た何かをやっているが、私は両方のAndroidと行列数学を学んでいます!あなたはAndroidで行列を使う方法を知っているようですので、これは問題ではないと思います。

つまり、2つのメッシュ(メッシュは画面に独立して描画できるもの):UpperLegLowerLegがあるとします。UpperLegについては

  • あなたはメッシュ回転(RotationPoint)のポイントを持っているつもりだ(現実の世界で、私は、これは腰になり推測)、あなたはLowerLegはにアタッチポイントを持っているつもりですそれ(AttachmentPoint)(私はこれが膝になるだろうと思う)。
  • LowerLegについては、メッシュが回転するポイント(RotationPoint)を持っているはずです(現実世界ではこれは膝になると思います)。

UpperLeg.AttachmentPoint = LowerLeg.RotationPoint(あなたの脚が落ちないように)。 UpperLeg.RotationLowerLeg.Rotation

はのは、今、あなたは、2つの回転量(UpperLeg用とLowerLegに1つ)を持っていることを想像してみましょう。

Quaternionsについて聞いたことがないなら、1846年のある人がこれらを思いついたと私は驚きました。彼らは基本的に回転の概念をカプセル化して、 (乗算によって)組み合わせることができ、ジンバルロックに苦しむことはありません)。

まずはあなたがでUpperLegを回転させる:

  1. それがために必要がある場合、それがあるようにUpperLeg.RotationPointUpperLeg.Rotation
  2. によって回転起源
  3. UpperLegメッシュを移動されるようにUpperLegメッシュを移動します現実世界では。 私はあなたがこれをやっているのを見る。

だから、LowerLegのためにそれはなるだろう:

  1. LowerLeg.RotationPointがでLowerLegメッシュを移動(LowerLeg.Rotationと組み合わせるUpperLeg.Rotation
  2. によって回転
  3. の原点になるようにLowerLegメッシュを移動しますステップ3でUpperLegメッシュが移動されたのと同じ量
  4. 移動する(UpperLeg.RotationPointからUpperLeg.AttachmentPointまでのベクトル)がUpperLeg.Rotationで回転されたベクトルによって0メッシュに変換されます。

上記の手順を組み合わせて最適化することができます。

基本的に私は言っている:
回しLowerLegを、それが回転する必要があるとして、それは行くために必要がある場合、それを突き出す - それは行く必要がどこUpperLegが行った、プラスあなたはどこLowerLegに着く方法をどこで決定されますUpperLegに添付されています。

これは私の最初の投稿ですので、もし私が基調規則を壊してしまった場合は、私にそれらが何であるか教えてください。

関連する問題