OpenGL 1.4.Сцена сдвигается, когда я меняю центр вращения, используя выбор мышью - PullRequest
0 голосов
/ 16 февраля 2019

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

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

Центр вращения изменяется с помощью выбора мыши.

Например, в исходном центре

Тогдая меняю центр щелчком мыши

1 Ответ

0 голосов
/ 16 февраля 2019

Прежде всего, этот код:

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 );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...