OpenGL gluLookAt. Не удается сориентировать объект

#opengl #glulookat

#opengl #glulookat

Вопрос:

У меня есть 2 объекта в разных системах координат: планета и цилиндр. У меня есть координаты глаз обоих объектов. Я хочу сориентировать цилиндр вдоль вектора, который соединяет его и планету.

ориентируйте цилиндр вдоль красного вектора

   glLoadMatrixf( PlanetTransform);
  // .. draw planet
  glLoadMatrixf( CylinderTransform);
  glColor3f(0, 1, 0);
  DrawCylinder();

  // draw vector that connects cylinder and planet
  glColor3f(1, 0, 0);
  glLoadIdentity();
  glBegin(GL_LINES);
     // planet eye pos e.g. (0.045; -0.049; -0.186)
     glVertex3f(point1.x, point1.y, point1.z);
     // cylinder eye pos e.g. (-0.109; -0.064; -0.203)
     glVertex3f(point2.x, point2.y, point2.z);
  glEnd();

  // orient cylinder along red vector
  // TVector normal(0, 0, 1);
  glLoadIdentity();
  gluLookAt(point2.x, point2.y, point2.z,
     point1.x, point1.y, point1.z,
     normal.x, normal.y, normal.z);

  DrawCylinder();
 

Нарисовать код цилиндра:

   void DrawCylinder()
  {
  glPushMatrix();
  glRotatef(90, 1, 0, 0);
  gluCylinder(gp_quadratic, 0.01, 0, 0.03, 15, 15);
  glPopMatrix();
  }
 

Я попытался также указать normal как:

   TVector normal;
  TVector::cross(point2 - point1, TVector(0, 0, 1), normal);
 

Итак, в конце я ожидаю увидеть 2 цилиндра — 1 зеленый, 1 — красный. Красный должен быть ориентирован вдоль красного сегмента. Но я не вижу красного. Не могли бы вы помочь мне найти, что здесь не так? Красный цилиндр не отображается в центре системы координат зеленого цилиндра..

Комментарии:

1. Дайте мне ваши point1 и point2, пожалуйста. И расскажите нам, как вы рисуете цилиндры.

2. Отредактированный вопрос в соответствии с вашим комментарием. Спасибо

Ответ №1:

глюцилиндр (/**/)

  1. построен вдоль локальной оси z, таким образом, указывая наружу вдоль красной линии
  2. локальная ось y — это глобальная ось z_axis (указывающая на зрителя), спроецированная на плоскость обзора планеты
  3. таким образом, локальная ось x проходит примерно вдоль плоскости обзора планеты
  4. таким образом, после glRotatef(90, 1, 0, 0); цилиндр направлен в сторону от пользователя в глубину изображения и скрыт за планетой
  5. таким образом, если вместо glRotatef(180, 1, 0 ,0 ); используется, все должно быть хорошо afais.

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

Если я ошибаюсь, попробуйте использовать glPolygonMode(GL_FRONT_AND_BACK, GL_LINE) для планеты и просто посмотрите, где находится цилиндр.