Является ли gluLookAt вместе с glFrustum искажающим рендеринг? - PullRequest
2 голосов
/ 07 февраля 2011

Мне интересно, если gluLookAt вместе с glFrustum искажает отрендеренное изображение.

Вот как визуализируется сцена:

enter image description here

А вот код, который его отобразил.

InitCamera называется один раз и должен, как я понимаю сейчас, настроить матрицу так, как если бы я смотрел с позиции на 2 единицы выше и на 3 единицы перед началом координат к началу координат , Также glFrustum используется для создания перспективы`.

void InitCamera() {

  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();

  gluLookAt (
    0,  2  ,   3, 
    0,  0  ,   0,
    0,  1  , - 0 
  );

  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  glFrustum   (-  1,     1, 
               -  1,     1, 
                  1,1000.0);

  glMatrixMode(GL_MODELVIEW);
}

Тогда TheScene - это то, что на самом деле рисует картину:

void TheScene() {

  glClear(
    GL_COLOR_BUFFER_BIT | 
    GL_DEPTH_BUFFER_BIT    
  );

  glMatrixMode(GL_MODELVIEW);

  // Draw red circle around origin and radius 2 units:    
  glColor3d(1,0,0);
  glBegin(GL_LINE_LOOP);
  for (double i = 0; i<=2 * M_PI; i+=M_PI / 20.0) {
    glVertex3d(std::sin(i) * 2.0, 0, std::cos(i) * 2.0);
  }
  glEnd();

  // draw green sphere at origin:
  glColor3d(0,1,0);
  glutSolidSphere(0.2,128, 128);


  // draw pink sphere a bit away    
  glPushMatrix();
    glColor3d(1,0,1);
    glTranslated(8, 3, -10);
    glutSolidSphere(0.8, 128, 128);
  glPopMatrix();

  SwapBuffers(hDC_opengl);
}

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

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

Итак, я не прав, и картинка нарисована правильно, или я что-то настраиваю?

Ответы [ 3 ]

5 голосов
/ 07 февраля 2011

Ваши ожидания просто неверны

  • Перспективная проекция трехмерного круга (если круг полностью виден) является эллипсом, однако проекция центра круга НЕ являетсяв общем центр эллипса.Perspective distortion on centers

  • Контур перспективной проекции сферы в общем случае представляет собой коническое сечение , т. Е. Может быть кругом, эллипсом, параболой или гиперболойв зависимости от положения точки обзора, плоскости проекции и сферы в 3D.Причина в том, что контур сферы можно представить как конус, начиная с точки зрения и касаясь сферы, пересекающейся с плоскостью проекции.

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

Эти различия между центрами более очевидны с сильной точки зрения (широкоугольные) камеры.При параллельной проекции взамен этого видимого искажения нет (т. Е. Проекция центра круга точно является центром проекции круга).

1 голос
/ 07 февраля 2011

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

1 голос
/ 07 февраля 2011

Чтобы увидеть зеленую сферу в центре экрана с идеальным кругом вокруг нее, вам нужно изменить местоположение камеры следующим образом:

gluLookAt (
  0, 3, 0, 
  0, 0, 0,
  0, 0, 1 
);

Не уверен, что вызывает искажение фиолетовой сферы, хотя.

...