Как повернуть модель, а не камеру в OpenGL? - PullRequest
5 голосов
/ 26 октября 2010

У меня такое же qasting, как в названии: / Я делаю что-то вроде:

  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();
  glTranslatef(0.0f, 0, -zoom);
  glRotatef(yr*20+moveYr*20, 0.0f, 1.0f, 0.0f);
  glRotatef(zr*20+moveZr*20, 1.0f, 0.0f, 0.0f);

  //Here model render :/

И в моем приложении камера вращается не модель: /

Ответы [ 3 ]

5 голосов
/ 26 октября 2010

Вероятно, причина, по которой вы полагаете, что ваша камера движется, а не ваша модель, в том, что все объекты на сцене движутся вместе?

После рендеринга вашей модели и перед рендерингом других объектов вы сбрасываете матрицу MODELVIEW? Другими словами, вы делаете другой glLoadIdentity () или glPopMatrix () после рендеринга модели, о которой вы говорите, и перед рендерингом других объектов?

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

Я думаю, что с вашим кодом может быть другая проблема:

  glTranslatef(0.0f, 0, -zoom);
  glRotatef(yr*20+moveYr*20, 0.0f, 1.0f, 0.0f);
  glRotatef(zr*20+moveZr*20, 1.0f, 0.0f, 0.0f);
  //Here model render :/

Вы пытаетесь повернуть модель вокруг точки (0, 0, -zoom)?

Обычно, чтобы вращаться вокруг определенной точки (x, y, z), вы делаете:

  1. Перевести (x, y, z) в начало координат (0,0,0), переведя вектором (-x, -y, -z)
  2. Выполнение поворотов
  3. Переведите начало координат в (x, y, z), переведя вектором (x, y, z)
  4. Draw

Если вы пытаетесь вращаться вокруг точки (0,0, увеличение), вы пропускаете шаг 3. Поэтому попробуйте добавить это, прежде чем рендерить вашу модель:

glTranslatef(0.0f, 0, zoom); // translate back from origin

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

И не забудьте сбросить матрицу MODELVIEW, прежде чем рисовать другие объекты. Таким образом, вся последовательность будет выглядеть примерно так:

  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();

#if you want to rotate around (0, 0, -zoom):
  glTranslatef(0.0f, 0, -zoom);
  glRotatef(yr*20+moveYr*20, 0.0f, 1.0f, 0.0f);
  glRotatef(zr*20+moveZr*20, 1.0f, 0.0f, 0.0f);
  glTranslatef(0.0f, 0, zoom); // translate back from origin
#else if you want to rotate around (0, 0, 0):
  glRotatef(yr*20+moveYr*20, 0.0f, 1.0f, 0.0f);
  glRotatef(zr*20+moveZr*20, 1.0f, 0.0f, 0.0f);
  glTranslatef(0.0f, 0, -zoom);
#endif    
  //Here model render :/

  glLoadIdentity();
  // translate/rotate for other objects if necessary
  // draw other objects
0 голосов
/ 26 октября 2010

Я считаю, что это связано с порядком, в котором вы применяете свои преобразования.Попробуйте переключить порядок звонка на glRotate и glTranslate.Как и сейчас, вы перемещаете его наружу от начала координат, затем поворачиваете его вокруг начала координат, что создает видимость объекта, вращающегося вокруг камеры.Если вместо этого вы поворачиваете его, пока он все еще находится в начале координат, переместите его, это должно дать вам желаемый результат.Надеюсь, это поможет.

0 голосов
/ 26 октября 2010

Вы используете GL_MODELVIEW при определении преобразования для ваших объектов и GL_PROJECTION для преобразования вашей точки обзора.

...