2010-07-25 4 views
0

У меня есть простой прямоугольник, который я нарисовал на экране в opengl.Перемещение некоторых точек по оси z в OpenGL не работает

Моя цель сделать этот прямоугольник в 3D, так что левая сторона его глубже (ось г), чем правая.

Посмотрите на этой картинке, так что вы можете увидеть, что я имею в виду: http://www.battleteam.net/tech/fis/docs/images/metroid_hud1.png

Это код, я использую, чтобы нарисовать прямоугольник, который использует различные цвета и я переехал обе точки на левой стороне немного.

glColor4f(1.0, 1.0, 1.0, 1.0); 
glVertex3f(0,   -20,   z_left); 

glColor4f(0.0, 1.0, 1.0, 1.0); 
glVertex3f(SQUARE_WIDTH, 0,    0); 

glColor4f(1.0, 0.0, 1.0, 1.0); 
glVertex3f(SQUARE_WIDTH, SQUARE_HEIGHT, 0); 

glColor4f(1.0, 1.0, 0.0, 1.0); 
glVertex3f(0,   SQUARE_HEIGHT-20, z_left); 

Я использую z_left переменную для динамического изменения Z-значение для обеих точек на левой стороне, чтобы переместить эти точки на оси. Но происходит то, что прямоугольник обрезается с левой стороны. Это происходит, когда значение z_left достигает значения zFar или zNear Variable, определенного посредством вызова функции «glOrtho».

Мое glOrtho выглядит так: glOrtho (0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, -100, 100);

Так что, если z_left становится выше, чем 100 или меньше, чем -100, то, что начинается странное отсечение. Я не знаю, почему. Я ожидал, что левая сторона прямоугольника будет перемещена по оси z, означает, что она будет двигаться глубже (от глаз) или ближе.

Может кто-нибудь сказать мне, что случилось здесь? Остальная часть кода довольно проста и стандартная. Простой прямоугольник в трехмерной среде немного изменился, чтобы иметь «3d панель», такую ​​как прямоугольник.

Мои OpenGL инициализации выглядит следующим образом.

glClearColor(0, 0, 0, 0); 
glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); glOrtho(0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, -100, 100); 
glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 

Спасибо за любую помощь.

ответ

4

Ortographic проекция имеет это свойство, вы можете перемещать их по оси Z, но объект выглядит так же. Переключитесь на перспективную проекцию, по которой объекты становятся меньше с расстоянием до камеры.

О выбраковки, вы рисуете за пределами просмотрового куба (когда Z < -100 или Z> 100). Проекция отбросит все, что находится вне его.

+0

Хорошо, так что это значит? Является ли моя инициатива неправильной? Я думал, что я уже в перспективной проекции. Единственное, что я делаю, это init, а затем начать рисовать с помощью glVertex3f. Можете ли вы объяснить мне, что изменить? Второй блок вашего ответа имеет смысл. Спасибо за помощь. – NovumCoder

+0

Вы используете glOrtho, что делает ортографическую проекцию. Используйте gluPerspective для получения проекции перспективы. –

+0

Ах отлично. Просто googled для «перспективной проекции opengl». Я вижу здесь два разных. glFrustum и gluPerspective. Как я использую SDL + OpenGL, я думаю, что «glFrustum» - мой выбор. Большое спасибо. – NovumCoder

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