現在、最初にピボットポイントに変換し、次に回転を実行し、最後に原点に戻すことで、ピボットポイントを中心に回転できます。私の例では、肩にそれを簡単に行うことができます。しかし、前腕の肘の周りの回転を追加する方法もわかりません。
肘の周りの前腕の回転について、次のことを試しました。
- 肩に変換、回転、原点に変換、前腕に変換、回転、原点に変換
- 肩に変換、回転、前腕に変換、回転、肩に変換、原点に変換
どちらも私には効かない。助言がありますか?私は本当にこれに固執しています。
現在、最初にピボットポイントに変換し、次に回転を実行し、最後に原点に戻すことで、ピボットポイントを中心に回転できます。私の例では、肩にそれを簡単に行うことができます。しかし、前腕の肘の周りの回転を追加する方法もわかりません。
肘の周りの前腕の回転について、次のことを試しました。
どちらも私には効かない。助言がありますか?私は本当にこれに固執しています。
スケルタルアニメーションをしているときに、同様の問題が発生しました。これに再帰を使用すると非常に役立ちます。また、ボーンを階層的に構造化します(たとえば、肩は前腕の親であり、手の親であるなど)。そうすることで、次のようにコードを書くことができます。
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;
このウェブサイトは、スケルタルアニメーションの優れたリソースです。
2番目のアプローチが機能するはずです。私はあなたの人体のモデルを本当に知りません。いくつかの同様のタスクは、私が受講したコンピュータービジョンコースの最初の課題でした。
シーングラフを使用して、共通のローカル座標系を共有するパーツを作成すると便利です。次に、それをトラバースして正しく回転させることができます。翻訳するのではなく、glPushMatrix()とglPopMatrix()を使用すると便利です。
このようにして、ローカル座標系で考え、他のすべての要素に影響を与えることができます。