Почему мой glutWireCube не находится в исходной точке? - PullRequest
0 голосов
/ 03 декабря 2009

У меня есть следующий код OpenGL в функции дисплея:

glLoadIdentity();
gluLookAt(eyex, eyey, eyez, atx, aty, atz, upx, upy, upz);
// called as: gluLookAt(20, 5, 5, -20, 5, 5, 0, 1, 0);

axis();
glutWireCube (1.);

glFlush ();

axis() рисует линии от (0,0,0) до (10,0,0), (0,10,0) и (0,10,0) плюс линии от (1,0, 0) до (1,3,0).

Моя функция изменения формы содержит следующее:

glViewport (0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
gluPerspective(45.0, (GLsizei) w / (GLsizei) h, 1.0, 100.0);
glMatrixMode (GL_MODELVIEW);

На этом изображении показан результат запуска программы с 1. в качестве аргумента glutWireCube:

glutWireCube(1.)

Как видите, куб не центрирован вокруг (0,0,0), как указано в документации:

Куб центрируется при моделировании начало координат (...) (источник)

Если я запускаю программу с 5. в качестве аргумента, куб смещается еще дальше:

glutWireCube(5.)

Почему это так, и как мне разместить кубики вокруг (0,0,0)?

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ

Неважно, если я переключу порядок axis() и glutWireCube. Окружение axis() с glPushMatrix() и glPopMatrix() тоже не исправляет.

РЕШЕНИЕ

Я изменил gluPerspective, чтобы начать смотреть дальше от камеры, и теперь Z-буферизация работает правильно, поэтому ясно, что кубы расположены вокруг начала координат.

Ответы [ 2 ]

1 голос
/ 03 декабря 2009

Вы уверены, что ось не связывается с матрицей вида?

Что произойдет, если вы назовете это после рисования куба?

Изменить, чтобы добавить:

На самом деле ... Если посмотреть на картинку поближе, то похоже, что она может быть с центром в начале координат.

Центр куба точно совпадает с пересечением трех осей. Единственное, что выглядит подозрительно, это то, что красная линия не пишет поверх белого края. у вас правильно настроена Z-буферизация?

0 голосов
/ 03 декабря 2009

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

Чтобы быстро исключить, что axis() не изменяет матрицу вида модели, окружите вызов матрицами push / pops:

glPushMatrix();
axis();
glPopMatrix();

Что нужно исследовать / проверить:

  1. Это все окно? Кажется странным, что вид внизу в одном углу.
  2. Поможет ли добавить вращение перед рендерингом? Это может облегчить определение перспективы, давая больше подсказок.
  3. Вы также можете попробовать переместить «камеру», динамически изменив аргументы на gluLookAt().
...