Прежде всего, этот код:
glTranslated(m_rotationCenter.x, 0, 0);
glTranslated(0, m_rotationCenter.y, 0);
glTranslated(0, 0, m_rotationCenter.z);
glScalef( scale, scale, scale );
glTranslated(-m_rotationCenter.x, 0, 0);
glTranslated(0, -m_rotationCenter.y, 0);
glTranslated(0, 0, -m_rotationCenter.z);
glTranslated(m_rotationCenter.x-xTrans, 0, 0);
glTranslated(0, m_rotationCenter.y+yTrans, 0);
glTranslated(0, 0, m_rotationCenter.z+zTrans);
glRotated( xRot, 1.0, 0.0, 0.0 );
glRotated( yRot, 0.0, 1.0, 0.0 );
glRotated( zRot, 0.0, 0.0, 1.0 );
glTranslated(-m_rotationCenter.x+xTrans, 0, 0);
glTranslated(0, -m_rotationCenter.y-yTrans, 0);
glTranslated(0, 0, -m_rotationCenter.z-zTrans);
glTranslated( -xTrans, 0.0, 0.0 );
glTranslated( 0.0, yTrans, 0.0 );
glTranslated( 0.0, 0.0, zTrans);
Может быть написано так и будет делать то же самое:
glTranslated(m_rotationCenter.x, m_rotationCenter.y, m_rotationCenter.z);
glScalef( scale, scale, scale );
glTranslated(-xTrans, yTrans, zTrans);
glRotated( xRot, 1.0, 0.0, 0.0 );
glRotated( yRot, 0.0, 1.0, 0.0 );
glRotated( zRot, 0.0, 0.0, 1.0 );
glTranslated(-m_rotationCenter.x, -m_rotationCenter.y, -m_rotationCenter.z);
Но если вы хотитечтобы сделать поворот вокруг точки (m_rotationCenter
), вам нужно изменить порядок инструкций.
Обратите внимание, что для вращения вокруг оси вы должны перевести объект таким образом, чтобыточка поворота находится в начале координат (0, 0, 0):
glTranslated(-m_rotationCenter.x, -m_rotationCenter.y, -m_rotationCenter.z);
Поворот объекта:
glRotated( xRot, 1.0, 0.0, 0.0 );
glRotated( yRot, 0.0, 1.0, 0.0 );
glRotated( zRot, 0.0, 0.0, 1.0 );
Наконец переместите повернутый объект обратно на исходное место:
glTranslated(m_rotationCenter.x, m_rotationCenter.y, m_rotationCenter.z);
Конечно, эти инструкции должны выполняться в обратном порядке, потому что такие операции, как glTranslated
и glRotated
определяют новую матрицу и умножают еек текущей матрице.
Окончательный код должен быть:
glScalef( scale, scale, scale );
glTranslated(-xTrans, yTrans, zTrans);
glTranslated(m_rotationCenter.x, m_rotationCenter.y, m_rotationCenter.z);
glRotated( xRot, 1.0, 0.0, 0.0 );
glRotated( yRot, 0.0, 1.0, 0.0 );
glRotated( zRot, 0.0, 0.0, 1.0 );
glTranslated(-m_rotationCenter.x, -m_rotationCenter.y, -m_rotationCenter.z);
Далее я рекомендую сначала выполнить масштабирование (последнее в коде), чтобы легче было определять координаты, такие как m_rotationCenter
и xTrans
, поскольку масштаб не применяется к этим координатам. Он применяется только к модели:
// move the model to its location
glTranslated(-xTrans, yTrans, zTrans);
// rotate the model around `m_rotationCenter`
glTranslated(m_rotationCenter.x, m_rotationCenter.y, m_rotationCenter.z);
glRotated( xRot, 1.0, 0.0, 0.0 );
glRotated( yRot, 0.0, 1.0, 0.0 );
glRotated( zRot, 0.0, 0.0, 1.0 );
glTranslated(-m_rotationCenter.x, -m_rotationCenter.y, -m_rotationCenter.z);
// scale the model
glScalef( scale, scale, scale );