OpenGL中的三维绘图

OpenGL中的三维绘图,opengl,Opengl,我想用OpenGL画一个棋盘。我可以完全按照自己的意愿画出游戏板上的方块。但我还想在游戏板的周边添加一个小棋盘。不知怎么的,我的周长比我想要的要大得多。事实上,边界的每个边都是整个游戏板本身的确切宽度 我的方法是画一个中性的灰色矩形来代表整个“板”的木材将被削减,使董事会。然后,在这块板的内部,我放置了64个游戏方块,它们应该精确居中,并且占用的2d空间比这块板稍微少一些。我对更好的方法持开放态度,但请记住我不是很聪明 编辑:在下面的图像中,所有的灰色区域应该是一个正方形大小的1/2。但正如你所

我想用OpenGL画一个棋盘。我可以完全按照自己的意愿画出游戏板上的方块。但我还想在游戏板的周边添加一个小棋盘。不知怎么的,我的周长比我想要的要大得多。事实上,边界的每个边都是整个游戏板本身的确切宽度

我的方法是画一个中性的灰色矩形来代表整个“板”的木材将被削减,使董事会。然后,在这块板的内部,我放置了64个游戏方块,它们应该精确居中,并且占用的2d空间比这块板稍微少一些。我对更好的方法持开放态度,但请记住我不是很聪明

编辑:在下面的图像中,所有的灰色区域应该是一个正方形大小的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();
}
void display()
{
//清除图像
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
//重置任何以前的转换
glLoadIdentity();
//定义楼板
浮动正方形_边=8;
浮动边界=4;
浮置板_厚度=2;
浮置板_角=4*方形_边+边框;
//设置视图角度
gl(ph,1,0,0);
gl(th,0,1,0);
gl(zh,0,0,1);
浮点暗方[3]={0,0,1};
float lightSquare[3]={1,1,1};
//设置查看矩阵
glOrtho(-slab_corner,slab_corner,slab_corner,-slab_corner,-slab_corner,slab_corner);
GLfloat板_顶点[8][3]={
{-slab_角,slab_角,0},
{-slab_角,-slab_角,0},
{slab_corner,-slab_corner,0},
{板角,板角,0},
{-板角,板角,板厚},
{-板角,-板角,板厚},
{板角,-板角,板厚},
{板角,板角,板厚}
};
glEnableClientState(GL_顶点_数组);
glVertexPointer(3,GL_INT,0,board_顶点);
//这将按逆时针顶点顺序定义六个面中的每个面
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);//左上角的正方形始终是亮的
GLD元素(GLU四元组,24,GLU无符号字节,slabIndices);
//在板的顶部和内部居中绘制各个正方形
对于(int x=-4;x<4;x++){
对于(int y=-4;y<4;y++){
//设置正方形的颜色
如果((x+y)%2)glColor3fv(暗方);
else glColor3fv(lightSquare);
glBegin(GL_QUADS);
glVertex2i(x*方形边缘,y*方形边缘);
glVertex2i(x*方形边缘+方形边缘,y*方形边缘);
glVertex2i(x*方形边缘+方形边缘,y*方形边缘+方形边缘);
glVertex2i(x*方形边缘,y*方形边缘+方形边缘);
格伦德();
}
}
glFlush();
glutSwapBuffers();
}

指定board_顶点包含整数,但它实际上是GLfloat类型。这可能是问题吗?

你能发布你当前结果的截图吗?我不认为你的程序中的任何地方都有对GLCuffLoice(0.3,0.3,0.3)的调用吗?同样,考虑在一个Quad上绘制一个重复的板纹理,而不是为每一个方形渲染一个四元组。我也不太知道数组是如何存储的,而是一个浮点[24 ]。可能与浮动[8][3]有所不同?至少(对我来说)更容易想象。@EricB我认为C标准保证float[24]和float[8][3]在内存中的布局完全相同。如果不是,大多数编译器似乎都同意这一普遍假设。
glVertexPointer(3, GL_INT, 0, board_vertices);