2013-05-12 3 views
1

Я только начал читать начальные главы Blue Book и понял, что матрица проецирования может использоваться для изменения отображения нашей желаемой системы координат на реальные координаты экрана. Он может быть использован для сброса системы координат и изменить его от -1 до 1 на левой, правой, верхней и нижней следующим (в качестве примера)
Настройка системы координат для рисования в OpenGL

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); //With 1's in the diagonal of the identity matrix, the coordinate system is rest from -1 to 1 (and the drawing should happen then inside those coordinates which be mapped later to the screen) 

Другой пример: (Ширина: 1024, Высота : 768, соотношение сторон: 1,33) и изменить систему координат, сделайте следующее:

glOrtho (-100.0 * aspectRatio, 100.0 * aspectRatio, -100.0, 100.0, 100.0, 1000.0);

Я ожидал, что система координат для OpenGL, чтобы изменить -133 на левой стороне, 133 на правом, -100 на дне и 100 сверху. Используя эти координаты, я понимаю, что рисунок будет выполнен внутри этих координат, и что-либо вне этих координат будет обрезано.

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
    glOrtho(-100 * aspectRatio, 100 * aspectRatio, -100, 100, 100, 1000); 
glMatrixMode(GL_MODELVIEW); 
    glRectf(-50.0, 50.0, 200, 100); 

Однако вышеприведенная команда не дает мне никакого вывода на экран. Что мне здесь не хватает?

+0

Вы не должны использовать устаревший API! В текущем API настройка системы координат сильно отличается (вы должны сделать это самостоятельно), а изучение устаревшего API - это пустая трата времени ИМХО. –

+0

@FelixK. : Можете ли вы указать последний правильный путь здесь. Я даже не уверен, что это такое. – user1240679

+0

Возможно, вы не установили цвет. Я бы порекомендовал сделать некоторый учебник для OpenGL 3 или более поздней версии, чтобы повесить вещи. –

ответ

2

Я вижу две проблемы здесь:

  1. Прямоугольник должен не поднятием на всех, так как glRectf() рисует на глубине г = 0, но вы создали свой orthorgraphic проекцию, чтобы покрыть диапазон г [100,1000], поэтому объект лежит перед ближайшей плоскостью и должен быть отсечен.
  2. Вы не указываете матрицу MODELVIEW, которую используете. В комментариях вы указываете, что объект действительно отображается, но не там, где вы его ожидаете. Это также нарушает мою первую точку, но можно объяснить, если матрица ModelView не является идентичной.

Поэтому я предлагаю сначала использовать другую матрицу проекций с подобными glOrtho (..., -1.0f, 1.0f); так что z = 0 фактически покрывается, а второй вставляет вызов glLoadIdentity() после glMatrixMode (GL_MODELVIEW) в приведенном выше коде.

Другим подходом было бы сохранить glOrtho() как есть и указать матрицу перевода, которая перемещает rect где-то между z = 100 и z = 1000.

Смежные вопросы