Вращение объекта в OpenGL ES для iPhone [перевести на оригинал -> повернуть -> перевести обратно не работает] - PullRequest
0 голосов
/ 17 июня 2010

Я недавно начал работать с OpenGL ES для iPhone, и у меня возникли некоторые проблемы с ним. Я хочу иметь возможность вращать объект пальцами. Моя проблема в том, что мой объект находится в точке (0, 0, -3), и я хотел бы повернуть его вокруг его центра. Я знаю, что мне нужно перевести обратно в исходное положение, повернуть, а затем вернуть его в исходное место. Я думаю, что столкнулся с проблемой, потому что я использую матрицу для отслеживания (?) Всех моих вращений / перевода / масштабирования и т. Д., И я думаю, что это может быть объединение операций таким образом, что порядок даже не рассматривается ( два перевода отменяют друг друга). Я только начал изучать OpenGL день назад и являюсь новичком, поэтому моё предположение может быть неверным.

Вот часть in drawView, с которой у меня возникают проблемы:

GLfloat matrix[16]; 
glGetFloatv(GL_MODELVIEW_MATRIX, matrix);
glLoadIdentity();
glTranslatef(0, 0, 3); // bring to origin
glRotatef(self.angle, self.dy, self.dx, 0); // rotate 
glTranslatef(0, 0, -3); // put it back in place 
glMultMatrixf(matrix); // save the transformations performed

Помощь будет высоко ценится, спасибо!

1 Ответ

0 голосов
/ 17 июня 2010

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

Обычно вы просто выполняете translate + rotate + translate как наиболее локальные действия над объектом, непосредственно перед его рендерингом. Также обратите внимание, что это применимо только в том случае, если ваш объект находится в точке (0, 0, -3) в объектном пространстве. Если он находится в этом месте в мировом пространстве, то вращение будет уже вращать объект вокруг его собственного центра, если вы ранее сделали серию вызовов преобразования (translate, rotate и т. Д.), Чтобы переместить объект в его предполагаемое положение в мире.

Порядок преобразования - одна из самых сложных частей изучения OpenGL. Как правило, ваши операции начинаются с самого внешнего и продвигаются до самого внутреннего. Таким образом, типичным простым набором преобразований будет: обратное преобразование камеры, чтобы переместить мир в соответствие с камерой, затем перевод объекта, чтобы переместить его в его положение в мировом пространстве, затем вращение, чтобы установить его предполагаемую ориентацию. Функции стека PushMatrix / PopMatrix позволяют сохранять и отменять часть этой серии преобразований, чтобы группы объектов могли совместно использовать части этой цепочки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...