2

現在、最初にピボットポイントに変換し、次に回転を実行し、最後に原点に戻すことで、ピボットポイントを中心に回転できます。私の例では、肩にそれを簡単に行うことができます。しかし、前腕の肘の周りの回転を追加する方法もわかりません。

肘の周りの前腕の回転について、次のことを試しました。

  1. 肩に変換、回転、原点に変換、前腕に変換、回転、原点に変換
  2. 肩に変換、回転、前腕に変換、回転、肩に変換、原点に変換

どちらも私には効かない。助言がありますか?私は本当にこれに固執しています。

4

2 に答える 2

3

スケルタルアニメーションをしているときに、同様の問題が発生しました。これに再帰を使用すると非常に役立ちます。また、ボーンを階層的に構造化します(たとえば、肩は前腕の親であり、手の親であるなど)。そうすることで、次のようにコードを書くことができます。

void drawBone(Bone *root) {  
    if (!root) return;  
    glPushMatrix();  
    glTranslatef(root->x,root->y,0);  
    glRotatef(root->a,0,0,1);  
    // insert code to actually draw bone here  
    int i;  
    glTranslatef(root->l,0,0);  
    for (i=0; i<root->childCount; i++)   
        drawBone(root->child[i]);  
    glPopMatrix();  
}  

私の骨の構造体は次のようになりました。

typedef struct _Bone {  
    float x,y,a,l;    // position, angle, length of bone  
    int childCound;   // number of children for this bone  
    struct _Bone *child[MAX_CHILD_COUNT], *parent;  
} Bone;  

このウェブサイトは、スケルタルアニメーションの優れたリソースです。

于 2011-03-31T13:14:17.420 に答える
0

2番目のアプローチが機能するはずです。私はあなたの人体のモデルを本当に知りません。いくつかの同様のタスクは、私が受講したコンピュータービジョンコースの最初の課題でした。

シーングラフを使用して、共通のローカル座標系を共有するパーツを作成すると便利です。次に、それをトラバースして正しく回転させることができます。翻訳するのではなく、glPushMatrix()とglPopMatrix()を使用すると便利です。

このようにして、ローカル座標系で考え、他のすべての要素に影響を与えることができます。

于 2011-03-31T12:54:21.580 に答える