Вращение куба вокруг шарового шарнира - PullRequest
1 голос
/ 16 октября 2019

У меня проблема с моим кодом.

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

Я пытаюсь заставить прямоугольник вращаться вокруг шарового шарнира (его левая сторона), но вместо этого он вращается в его центре. Я думаю, что проблема заключается в приведенном выше коде.

1 Ответ

1 голос
/ 16 октября 2019

Сфера расположена в (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 до и после вращения .

...