Вращение объекта вокруг неподвижной точки с помощью glMultMatrix

Вращение объекта вокруг (x, y, 0): // 2D

glTranslatef(-x, -y, 0); glRotatef(theta, 0.0, 0.0, 1.0); glTranslatef(x, y, 0); 

это правильно ?! как об использовании «glMultMatrix» вместо «glTranslatef» и «glRotatef»?!

 glLoadIdentity(); glMultMatrix(Translation_Matrix); //glTranslatef(x, y, 0); glMultMatrix(Rotation_Matrix); //glRotatef(theta, 0.0, 1.0, 0.0); glMultMatrix(Neg_Translation_Matrix); // glTranslatef(-x, -y, 0); 

правильная последовательность матриц ?!

Поскольку ни один из предыдущих ответов не выглядит полностью правильным и полным, позвольте мне попробовать:

Ключевым моментом для понимания является то, что преобразования применяются к вашим вершинам в обратном порядке порядка, в котором вы указали их. Последнее указанное вами преобразование является первым, которое применяется к вашим вершинам.

Это относится как к вызовам типа glTranslate и к glRotate , а также к использованию glMultMatrix . glTranslate и glRotate являются удобными функциями для создания определенных типов преобразований, но они работают так же, как glMultMatrix .

В вашем примере, чтобы повернуть вокруг произвольной точки, вам нужно сначала перевести ваши вершины так, чтобы точка вращения переместилась в начало координат, т.е. вы хотите перевести на (-x, -y, 0). Затем вы применяете поворот. Затем переведите начало координат в точку вращения, что означает перевод по (x, y, 0).

Теперь, поскольку нам нужно указать эти шаги в обратном порядке, это означает, что ваш первоначальный набор преобразований находится в неправильном порядке. Это должно быть:

 glTranslatef(x, y, 0); glRotatef(theta, 0.0, 0.0, 1.0); glTranslatef(-x, -y, 0); 

Ваша версия с использованием glMultMatrix выглядит правильно, так как вы уже указываете преобразования в этом порядке.

Предполагая, что текущая matrix является ModelView Matrix, а центр объекта находится в (x, y, 0), первая последовательность перевода, поворота, а затем перевода назад кажется правильной последовательностью.

При использовании glMultMatrix вместо этого, я не думаю, что последовательность меняется на противоположную, но они совпадают с первой последовательностью.

правильная последовательность матриц ?!

Порядок вашего первого fragmentа кода верен, а второй – нет. Правильная последовательность

 glMultMatrix(Translation_Matrix); // glTranslatef(x, y, 0); glMultMatrix(Rotation_Matrix); // glRotatef(theta, 0.0, 1.0, 0.0); glMultMatrix(Neg_Translation_Matrix); // glTranslatef(-x, -y, 0); 

Имейте в виду, что glTranslate, glRotate и т. Д. Сводятся к функции, делает матрицу трансляции / вращения / … и умножает их на glMultMatrix.

  • OpenGL - маска с несколькими текстурами
  • Вычисление нормалей в треугольной сетке
  • Передача списка значений в fragment-шейдер
  • Почему преобразование нормалей с транспонированием обратной матрицы модели?
  • OpenGL 2 Texture Внутренние форматы GL_RGB8I, GL_RGB32UI и т. Д.
  • Как нарисовать текст, используя только методы OpenGL?
  • glVertexAttribPointer и glVertexAttribFormat: В чем разница?
  • Почему мой OBJ-парсер оказывает такие сетки?
  • OpenGL - Как создать независимую прозрачность заказа?
  • Как сделать снимок экрана в OpenGL
  • Рисование сферы в OpenGL без использования gluSphere ()?
  • Давайте будем гением компьютера.