2013-09-23 2 views
0

Я пытаюсь нарисовать шахматную доску в OpenGL. Я могу рисовать квадраты игрового поля точно так, как я хочу. Но я также хочу добавить небольшой пограничник по периметру игрового поля. Каким-то образом мой периметр намного больше, чем я хочу. Фактически, каждый край границы является точной шириной всей игровой доски.3d рисунок в OpenGL

Мой подход состоит в том, чтобы нарисовать нейтральный серый прямоугольник, чтобы представить всю «плиту» из дерева, которая была бы разрезана, чтобы сделать доску. Затем, внутри этой плиты, я помещаю 64 квадрата игры, которые должны быть точно центрированы и занимать чуть меньше 2d-пространства, как это делает плита. Я открыт для лучших способов, но имейте в виду, что я не очень яркий.

EDIT: на изображении ниже всего, что серая область должна быть около 1/2 размера одного квадрата. Но, как вы можете видеть, каждый край - это размер всей игровой площадки. Ясно, что я ничего не понимаю.

enter image description here

Вот функция отображения, что я написал. Почему моя «плита» слишком велика?

void display() 
{ 
    // Clear the image 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    // Reset any previous transformations 
    glLoadIdentity(); 

    // define the slab 
    float square_edge = 8; 
    float border = 4; 
    float slab_thickness = 2; 
    float slab_corner = 4*square_edge+border; 

    // Set the view angle 
    glRotated(ph,1,0,0); 
    glRotated(th,0,1,0); 
    glRotated(zh,0,0,1); 

    float darkSquare[3] = {0,0,1}; 
    float lightSquare[3] = {1,1,1}; 

    // Set the viewing matrix 
    glOrtho(-slab_corner, slab_corner, slab_corner, -slab_corner, -slab_corner, slab_corner); 

    GLfloat board_vertices[8][3] = { 
     {-slab_corner, slab_corner, 0}, 
     {-slab_corner, -slab_corner, 0}, 
     {slab_corner, -slab_corner, 0}, 
     {slab_corner, slab_corner, 0}, 
     {-slab_corner, slab_corner, slab_thickness}, 
     {-slab_corner, -slab_corner, slab_thickness}, 
     {slab_corner, -slab_corner, slab_thickness}, 
     {slab_corner, slab_corner, slab_thickness} 
    }; 

    glEnableClientState(GL_VERTEX_ARRAY); 
    glVertexPointer(3, GL_INT, 0, board_vertices); 

    // this defines each of the six faces in counter clockwise vertex order 
    GLubyte slabIndices[] = {0,3,2,1,2,3,7,6,0,4,7,3,1,2,6,5,4,5,6,7,0,1,5,4}; 

    glColor3f(0.3,0.3,0.3); //upper left square is always light 
    glDrawElements(GL_QUADS, 24, GL_UNSIGNED_BYTE, slabIndices); 

    // draw the individual squares on top and centered inside of the slab 
    for(int x = -4; x < 4; x++) { 
     for(int y = -4; y < 4; y++) { 
      //set the color of the square 
      if ((x+y)%2) glColor3fv(darkSquare); 
      else glColor3fv(lightSquare); 

      glBegin(GL_QUADS); 
       glVertex2i(x*square_edge, y*square_edge); 
       glVertex2i(x*square_edge+square_edge, y*square_edge); 
       glVertex2i(x*square_edge+square_edge, y*square_edge+square_edge); 
       glVertex2i(x*square_edge, y*square_edge+square_edge); 
      glEnd(); 
     } 
    } 

    glFlush(); 
    glutSwapBuffers(); 
} 
+2

Не могли бы вы опубликовать скриншот ваших текущих результатов? –

+0

Хорошая идея. Готово. – Alex

+0

Я не думаю, что в вашей программе есть вызов glClearColor (0.3,0.3,0.3)? –

ответ

1
glVertexPointer(3, GL_INT, 0, board_vertices); 

указывает, что board_vertices содержит целые числа, но это на самом деле типа GLfloat. Это может быть проблема?

+0

Я также не знаю, как много массивов хранится, но поплавок [24] может отличаться от поплавка [8] [3] каким-то образом? По крайней мере, это легче визуализировать (для меня). –

+0

@EricB Я думаю, что стандарт C гарантирует, что float [24] и float [8] [3] выложены точно так же в памяти. Если нет, это распространенное предположение, что большинство компиляторов, похоже, согласны. – cobbal

+0

Вот и все. Благодаря! – Alex

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