首页 > 解决方案 > 立方体围绕球形接头旋转

问题描述

我的代码有问题。

//ball joint
glLoadIdentity();
glTranslatef(0.0,0.0,-12.0);
glRotatef(tippangle, 1,0,0);    
glRotatef(viewangle, 0,1,0);
glTranslatef(2.5, .6, 0.0);
glPushMatrix(); 
gluSphere(quad,.25,15,15);
glPopMatrix();

//right arm 
glLoadIdentity();   
glTranslatef(0.0,0.0,-12.0);
glRotatef(tippangle, 1,0,0);    
glRotatef(viewangle, 0,1,0);
glTranslatef(3.2, .55, 0.0);
glRotatef((GLfloat)rightHandAngle, 0.0, 0.0, 1.0);
glScalef(0.5,.12,0.1); 
glPushMatrix();  
drawBox();
glPopMatrix();

我试图让矩形围绕球形接头(其左侧)旋转,但它在其中心旋转。我认为问题在于上面的代码。

标签: openglmatrixopengl-compat

解决方案


球体位于 (2.5, 0.6):

glTranslatef(2.5, .6, 0.0);

该框位于 (3.2, 0.55):

glTranslatef(3.2, .55, 0.0);

球体的中心是支点。从枢轴到盒子原点的向量是:

(3.2, 0.55) - (2.5, 0.6) = (0.75, -0.05)

如果要围绕枢轴旋转对象,则必须:

  • 以这种方式平移对象,即枢轴位于原点 (0, 0, 0)。这是从枢轴到盒子原点的向量 (0.75, -0.05)。

    glTranslatef(0.75, -0.05f, 0.0f);

  • 旋转对象。

    glRotatef((GLfloat)rightHandAngle, 0.0, 0.0, 1.0);

  • 以枢轴回到其原始位置的方式平移矩形。这是从枢轴到盒子原点的负向量 (-0.75, 0.05)。

    glTranslatef(-0.7, 0.05f, 0.0f);

另请参阅如何在转换中使用枢轴点

由于操作类似于定义一个矩阵glTranslate并将glRotate当前矩阵与 nes 矩阵相乘,因此这些操作必须以相反的顺序进行。

//right arm 
glLoadIdentity();
glTranslatef(0.0,0.0,-12.0);
glRotatef(tippangle, 1,0,0); 
glRotatef(viewangle, 0,1,0);
glTranslatef(3.2, .55, 0.0);

glTranslatef(-0.7, 0.05f, 0.0f);
glRotatef((GLfloat)rightHandAngle, 0.0, 0.0, 1.0);
glTranslatef(0.75, -0.05f, 0.0f);

glScalef(0.5,.12,0.1);
drawBox();

另请参见 旋转前后的 OpenGL 平移


推荐阅读