2017-02-15 1 views
0

Я пытаюсь создать проект в OpenGL C++, который имеет три стороны куба, отображаемые во время выполнения. Нет вращения, необходимого для просмотра трех сторон. Я очень новичок в OpenGL, мой план атаки теперь меняет значения x, y и z. Я отлично работаю в 2d, но добавление z для смешивания - это то, что, как мне кажется, отключает меня. Я знаю, что использование отрицательного значения приблизит изображение ближе к камере и положит дальше, но в моем коде ниже, когда я изменяю значение Z, он ничего не делает для объекта.Создание 3D-куба с тремя сторонами, отображаемыми во время выполнения, без вращения, чтобы увидеть все 3 стороны

У меня только передняя и правая стороны показаны (работают), чтобы попытаться получить эти 2 в правильном положении в окне перед тем, как весь куб будет нарисован. Первоначально я рисовал их в терминах 0,5 или -0,5, но это только создает прямоугольник на экране.

Итак, мой главный вопрос: существует ли более простой способ предсказать поведение каждой из вершин? Да, я знаю, что работаю в графическом пространстве, но почему некоторые из моих моментов не двигаются, когда значение изменяется?

#ifdef __APPLE__ 
#include <GLUT/glut.h> 
#else 
#include <GL/glut.h> 
#endif 
#include <stdlib.h> //For exit function 

void exit(int); //To Exit Program 

void init(void) 
{ 
    glClearColor (0.0, 0.0, 0.0, 1.0); 
    glColor3f(1.0, 1.0, 1.0); 
    glMatrixMode (GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0); 
} 


void cube() 
{ 
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); 

    glBegin(GL_QUADS); 

    glColor3f(1.0, 0.0, 0.0);  glVertex3f( 0.2, -0.3, -0.5);  // P1 is red lb 
    glColor3f(0.0, 1.0, 0.0);  glVertex3f( 0.3, 0.2, -0.5);  // P2 is green lt 
    glColor3f(0.0, 0.0, 1.0);  glVertex3f(-0.2, 0.3, -0.5);  // P3 is blue tt 
    glColor3f(1.0, 0.0, 1.0);  glVertex3f(-0.3, -0.2, -0.5);  // P4 is purple tb 

    glEnd(); 

// Green side - LEFT 
    glBegin(GL_QUADS); 
    glColor3f(0.0, 1.0, 0.0); 
    glVertex3f(-0.2, -0.3, 0.5); 
    glVertex3f(-0.3, 0.2, 0.5); 
    glVertex3f(-0.2, 0.3, -0.5); 
    glVertex3f(-0.3, -0.2, -0.5); 
    glEnd(); 

    glFlush(); 

} 

void myKeyboard(unsigned char theKey, int mouseX, int mouseY) 
{ 
    switch(theKey) 
    { 
     case 'Q': 
     case 'q': 
      exit(-1); //terminate the program 
     default: 
      break; // do nothing 

    } 
} 

int main(int argc, char** argv) 
{ 
    glutInit(&argc,argv); 
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH); 
    glutInitWindowSize(640,480); 
    glutInitWindowPosition(100,150); 
    glutCreateWindow("Shapes: Q or q to quit"); 
    glutDisplayFunc(cube); 

    glutKeyboardFunc(myKeyboard); 

    init(); 
    glEnable(GL_DEPTH_TEST); 
    glutMainLoop(); 
} 

ответ

0

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

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

Хороший способ подумать об этом - подумать о действительно длинном сегменте прямых железнодорожных путей. В орфографической проекции вы бы просто увидели, что два рельса продолжаются прямо навсегда. В перспективной проекции вы, в конце концов, увидите, что два рельса встречаются в одной точке на расстоянии, а также смогут частично видеть внутренний край рельса.

+0

Это отличный способ выразить это, что вызывающе помогает мне понять это больше. К сожалению, пока это школьное задание, и мой профессор только позволяет нам использовать glOrtho для задания. В исследовании, чтобы найти помощь, я обнаружил, что большинство людей используют массивы для создания своих кубов. Наверное, поэтому у меня так много проблем с поиском помощи, потому что никто не использует устаревшую версию – csm60

+0

Да, немедленный режим был заменен массивами вершин назад, когда - например, 1995 или около того. Позор, что большинство классов компьютерной графики все равно научат этому. –

+0

Если это назначение, которое может быть выполнено только через glOrtho, возможно, что-то еще вам не хватает. По умолчанию будут отображены образы вершин. Фреймы определяются порядком, в котором указаны вершины, по часовой стрелке или против часовой стрелки. Вы можете отключить отбраковку, переключить лицевую сторону на другое направление или убедиться, что все ваши квадратики указаны в правильном порядке. Еще несколько деталей: https://www.khronos.org/opengl/wiki/Face_Culling –

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