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);

次に、マトリックスをキャンバスに設定して、脚を描きます。

脚の2番目の部分を膝の下に描くにはどうすればよいですか?それはその上の脚とは異なる速度で回転し、その上の脚と一緒に動く中心点を持っています。次のことを試しましたが、最終的には、上の脚に従わない単一の点を中心に回転することがわかりました。

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つの異なるMatrixオブジェクトで2つの回転を実行してから、それらを何らかの方法で組み合わせる必要があると思いますが、それを正確に行う方法がわかりません。

編集:このタイプの行列は「変換行列」と呼ばれているようです。複数の操作を組み合わせると、変換の合成と呼ばれます。ただし、このトピックのどのページにも、一連の平行移動と回転を行う方法については触れられていません。

確かに、行列を使用して1つの点を中心に回転できる場合は、何らかの方法で複数の行列操作を実行して、1つの点を中心に回転し、次に別の点を中心にさらに回転できるようにする必要があります。

スケルタルアニメーションのページを見てみましたが、彼らが話していることの頭も尻尾も作れません。

4

2 に答える 2

6

問題を正しく理解していれば、相対回転のケースがあります。二重振り子を検索してみることができます。図を参照してください。

二重振り子

回転行列を使用して、ポイントをp1中心に回転したポイントの新しい座標を次のp0ように見つけることができます

ポイントをp2中心に回転したポイントの新しい座標はp1

p2最後に、ポイントを中心に回転したポイントの新しい座標は次のp0ようになります。

行列の乗算の順序は、角度の符号と同様に重要です。

于 2013-02-28T10:44:12.857 に答える
2

これは言語にとらわれないものになるのではないかと心配しています-私は実際にAndroidで現在似たようなことをしていますが、Androidと行列数学の両方を学んでいます! あなたは Android で行列を使用する方法を知っているようですので、これは問題にならないと思います。

では、2 つのメッシュがあるとしましょう (メッシュとは、画面に個別に描画できるものです):UpperLegLowerLeg.

  • UpperLegメッシュが回転するポイント ( RotationPoint)(現実の世界では、これはヒップになると思います) があり、メッシュがメッシュに接続するポイント( LowerLeg) AttachmentPoint(現実の世界では私はこれは膝だと思います)。
  • LowerLegメッシュが回転するポイント ( ) があるためRotationPointです (現実の世界では、これは膝になると思います)。

UpperLeg.AttachmentPoint= LowerLeg.RotationPoint(そうすれば足が落ちません)。

ここで、回転量が 2 つあるとします (1 つは 用UpperLeg、もう 1 つは 用LowerLeg):UpperLeg.RotationLowerLeg.Rotation.

(回転の主題の 1 つ - Quaternionsについて聞いたことがない場合は、見るべきです - 1846 年の誰かがこれらを思いついたことに驚かされます - それらは基本的に回転の概念をカプセル化し、回転行列に変換することができます。 (乗算によって)組み合わされ、ジンバルロックに悩まされません)。

まず、次の方法で回転UpperLegします。

  1. 原点にUpperLegなるようにメッシュを移動するUpperLeg.RotationPoint
  2. で回転UpperLeg.Rotation
  3. UpperLeg現実世界で必要な場所にメッシュを移動します。私はあなたがこれをしているのを見ます。

したがって、次のLowerLegようになります。

  1. 原点にLowerLegなるようにメッシュを移動するLowerLeg.RotationPoint
  2. による回転 (UpperLeg.Rotationと組み合わせてLowerLeg.Rotation)
  3. 手順 3 でメッシュを移動したLowerLegのと同じ量だけメッシュを移動するUpperLeg
  4. によって回転された ( からへLowerLegのベクター) であるベクターによってメッシュを移動します。UpperLeg.RotationPointUpperLeg.AttachmentPointUpperLeg.Rotation

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

基本的に私が言っているのは、
回転LowerLegする必要があるときに回転させてから、移動する必要がある場所に押し込むことUpperLegです。LowerLegUpperLeg

これは私の最初の投稿なので、基本的なルールに違反している場合は、それらが何であるかを教えてください.

于 2013-03-02T20:30:48.470 に答える