我目前可以通过首先平移到枢轴点然后执行旋转并最后平移回原点来围绕枢轴点旋转。在我的例子中,对于肩膀,我很容易做到这一点。但是,我不知道如何还为前臂添加围绕肘部的旋转。
我尝试了以下方法来围绕肘部旋转前臂:
- 平移到肩部,旋转,平移到原点,平移到前臂,旋转,平移到原点
- 平移到肩部,旋转,平移到前臂,旋转,平移到肩部,平移到原点
都不适合我。有什么建议么?我真的坚持这个。
我目前可以通过首先平移到枢轴点然后执行旋转并最后平移回原点来围绕枢轴点旋转。在我的例子中,对于肩膀,我很容易做到这一点。但是,我不知道如何还为前臂添加围绕肘部的旋转。
我尝试了以下方法来围绕肘部旋转前臂:
都不适合我。有什么建议么?我真的坚持这个。
我在做一些骨骼动画时遇到了类似的问题。为此使用递归非常有帮助。此外,分层构造你的骨骼(例如,肩部是前臂的父级,前臂是手的父级,等等)。通过这样做,您可以编写如下代码:
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;
该网站是骨骼动画的绝佳资源。
第二种方法应该有效。我真的不知道你的人体模型。一些类似的任务是我参加的计算机视觉课程的第一个任务。
一个有用的事情是使用场景图来构建共享公共局部坐标系的部件。然后你可以遍历它并正确旋转。不翻译而是使用 glPushMatrix() 和 glPopMatrix() 会很有帮助
通过这种方式,您可以在局部坐标系中思考并影响所有其他元素。