Создание трехмерного куба с 3-мя сторонами, показывающими во время выполнения, без поворота, чтобы увидеть все 3 стороны

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

У меня есть только передняя и правая стороны, показывающие (работающие) только для того, чтобы попытаться получить эти 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, gluPerspective это то, что вы хотите вместо glOrtho, Если вы хотите перейти на более современный OpenGL, все математические функции матрицы будут удалены, поэтому вам придется использовать библиотеку, такую ​​как glm, чтобы выполнить всю вашу математику.

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

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

0

Другие решения

Других решений пока нет …