Я пытаюсь нарисовать шахматную доску в OpenGL. Я могу рисовать квадраты игрового поля точно так, как я хочу. Но я также хочу добавить небольшой пограничник по периметру игрового поля. Каким-то образом мой периметр намного больше, чем я хочу. Фактически, каждый край границы является точной шириной всей игровой доски.3d рисунок в OpenGL
Мой подход состоит в том, чтобы нарисовать нейтральный серый прямоугольник, чтобы представить всю «плиту» из дерева, которая была бы разрезана, чтобы сделать доску. Затем, внутри этой плиты, я помещаю 64 квадрата игры, которые должны быть точно центрированы и занимать чуть меньше 2d-пространства, как это делает плита. Я открыт для лучших способов, но имейте в виду, что я не очень яркий.
EDIT: на изображении ниже всего, что серая область должна быть около 1/2 размера одного квадрата. Но, как вы можете видеть, каждый край - это размер всей игровой площадки. Ясно, что я ничего не понимаю.
Вот функция отображения, что я написал. Почему моя «плита» слишком велика?
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();
}
Не могли бы вы опубликовать скриншот ваших текущих результатов? –
Хорошая идея. Готово. – Alex
Я не думаю, что в вашей программе есть вызов glClearColor (0.3,0.3,0.3)? –