2015-11-09 6 views
0

Использование C++ и OpenGL Я нарисовал куб, используя квадратики, линии и точки. Теперь я пытаюсь сделать мой код более плотным. Для этого я хотел бы использовать для циклов.Куб OpenGL с использованием цикла for

Мои вершины для моего куба в 2d массив так:

double vertices[8][3] = { 
    { 1.0f, 1.0f, 1.0f}, //0 
    { 1.0f, 1.0f,-1.0f}, //1 
    { 1.0f,-1.0f,-1.0f}, //2 
    {-1.0f,-1.0f,-1.0f}, //3 
    {-1.0f,-1.0f, 1.0f}, //4 
    {-1.0f, 1.0f, 1.0f}, //5 
    {-1.0f, 1.0f,-1.0f}, //6 
    { 1.0f,-1.0f, 1.0f} //7 
}; 

В настоящее время мой код, чтобы сделать куб с помощью линий

void drawLines(){ 
    glBegin(GL_LINES); 
    //Front Lines 
    //Left 
    glVertex3f(vertices[5][0],vertices[5][1],vertices[5][2]); 
    glVertex3f(vertices[4][0],vertices[4][1],vertices[4][2]); 
    //Top 
    glVertex3f(vertices[5][0],vertices[5][1],vertices[5][2]); 
    glVertex3f(vertices[0][0],vertices[0][1],vertices[0][2]); 
    //Bottom 
    glVertex3f(vertices[4][0],vertices[4][1],vertices[4][2]); 
    glVertex3f(vertices[7][0],vertices[7][1],vertices[7][2]); 
    //Right 
    glVertex3f(vertices[7][0],vertices[7][1],vertices[7][2]); 
    glVertex3f(vertices[0][0],vertices[0][1],vertices[0][2]); 
    //Middle Lines 
    //Top Left 
    glVertex3f(vertices[6][0],vertices[6][1],vertices[6][2]); 
    glVertex3f(vertices[5][0],vertices[5][1],vertices[5][2]); 
    //Top Right 
    glVertex3f(vertices[1][0],vertices[1][1],vertices[1][2]); 
    glVertex3f(vertices[0][0],vertices[0][1],vertices[0][2]); 
    //Bottom Left 
    glVertex3f(vertices[3][0],vertices[3][1],vertices[3][2]); 
    glVertex3f(vertices[4][0],vertices[4][1],vertices[4][2]); 
    //Bottom Right 
    glVertex3f(vertices[2][0],vertices[2][1],vertices[2][2]); 
    glVertex3f(vertices[7][0],vertices[7][1],vertices[7][2]); 
    //Back Lines 
    //Left 
    glVertex3f(vertices[6][0],vertices[6][1],vertices[6][2]); 
    glVertex3f(vertices[3][0],vertices[3][1],vertices[3][2]); 
    //Top 
    glVertex3f(vertices[6][0],vertices[6][1],vertices[6][2]); 
    glVertex3f(vertices[1][0],vertices[1][1],vertices[1][2]); 
    //Bottom 
    glVertex3f(vertices[3][0],vertices[3][1],vertices[3][2]); 
    glVertex3f(vertices[2][0],vertices[2][1],vertices[2][2]); 
    //Right 
    glVertex3f(vertices[2][0],vertices[2][1],vertices[2][2]); 
    glVertex3f(vertices[1][0],vertices[1][1],vertices[1][2]); 

    glEnd();     // Done Drawing Edges 
} 

Это достигается этот результат: enter image description here

В попытке сконденсировать мой код Я пытаюсь получить тот же результат, используя для циклов в настоящее время у меня есть:

glBegin(GL_LINES); 

for (int i=0; i<8; i+=1) { 
    for (int j=0; j<8; j+=1) { 
     glVertex3f(vertices[i][0],vertices[i][1],vertices[i][2]); 
     glVertex3f(vertices[j][0],vertices[j][1],vertices[j][2]); 
    } 
} 
glEnd(); 

Это дает мне этот результат: enter image description here

Мой вопрос, будет кто-нибудь, пожалуйста, быть в состоянии дать мне рекомендации, чтобы получить тот же результат, как у меня с моим оригинальным кодом?

+2

Не было бы лучше сделать массив строк (пары вершин) и перебрать его? – Matso

+1

В вашем коде каждая вершина соединяется с каждой вершиной (включая себя). В кубе каркаса каждая вершина соединяется с тремя другими вершинами. Это невозможно сделать с помощью простого для цикла, ему нужны дополнительные рекомендации. – usr2564301

ответ

7

Добавить массив для индексов:

int[12][2] indices = { 
    {5,4}, 
    {5,0}, 

    {4,7}, 
    {7,0}, 

    {6,5}, 
    {1,0}, 

    {3,4}, 
    {2,7}, 

    {6,3}, 
    {6,1}, 

    {3,2}, 
    {2,1} 
} 

и перебираем, что:

glBegin(GL_LINES); 

for (int i=0; i<12; i+=1) { 

    glVertex3f(vertices[indices[i][0]][0],vertices[indices[i][0]][1],vertices[indices[i][0]][2]); 
    glVertex3f(vertices[indices[i][1]][0],vertices[indices[i][1]][1],vertices[indices[i][1]][2]); 
} 
glEnd(); 

Однако при использовании старой (и устаревшее) OPENGL как вы не рекомендуется для обучения. Вместо этого предлагаемый метод загружает данные вершин в VBO; создавая набор шейдеров и вместо этого используйте glDrawArrays или glDrawElements.

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