我的OpenGL平面有问题

时间:2013-05-14 00:29:07

标签: c++ arrays opengl vertex

使用顶点数组创建一个平面(使用GL_TRIANGLE)时遇到了一些麻烦。

继承我的代码:

float halfW = (getPlaneWidth() / 2);
float halfD = (getPlaneDepth() / 2);

//Generate vertices
for(int z = halfD; z >= -halfD; z--)
{
    for(int x = -halfW; x <= halfW; x++)
    {
        float xV = x * cellWidth;
        float yV = 0;
        float zV = z * cellDepth;

        Vertices.push_back(xV);
        Vertices.push_back(yV);
        Vertices.push_back(zV);

        float xN = xV - getX();
        float yN = yV - getY();
        float zN = zV - getZ();

        setNormals(&xN, &yN, &zN); //Calculate normals
        Normals.push_back(xN);
        Normals.push_back(yN);
        Normals.push_back(zN);
    }
}
//Generate indices
for(int y = 0; y < getPlaneDepth(); y++)
{
    for(int x = 0; x < getPlaneWidth(); x++)
    {
        int curVertex = (x + (y * (getPlaneDepth() + 1))); //Bottom left vertex ID

        if(curVertex%2 == 0)
        {
            Indices.push_back((x)    + (y)   * (getPlaneDepth()+1)); //Bottom Left
            Indices.push_back((x+1)  + (y)   * (getPlaneDepth()+1)); //Bottom Right
            Indices.push_back((x+1)  + (y+1) * (getPlaneDepth()+1)); //Top Right

            Indices.push_back((x+1)  + (y+1) * (getPlaneDepth()+1)); //Top Right
            Indices.push_back((x)    + (y+1) * (getPlaneDepth()+1)); //Top Left
            Indices.push_back((x)    + (y)   * (getPlaneDepth()+1)); //Bottom Left
        }
        else //reverse triangle
        {
            Indices.push_back((x+1)  + (y)   * (getPlaneDepth()+1)); //Bottom Right
            Indices.push_back((x)    + (y)   * (getPlaneDepth()+1)); //Bottom Left
            Indices.push_back((x)    + (y+1) * (getPlaneDepth()+1)); //Top Left

            Indices.push_back((x)    + (y+1) * (getPlaneDepth()+1)); //Top Left
            Indices.push_back((x+1)  + (y+1) * (getPlaneDepth()+1)); //Top Right
            Indices.push_back((x+1)  + (y)   * (getPlaneDepth()+1)); //Bottom Right
        }
    }
}

如果宽度和深度相同,代码可以正常工作,但如果它们不同,它会搞砸。

有人能看到问题吗?

我把它编码为这样,以便枢轴点位于飞机的中间。

1 个答案:

答案 0 :(得分:1)

    int curVertex = (x + (y * (getPlaneWidth() + 1))); //Bottom left vertex ID

    if(curVertex%2 == 0)
    {
        Indices.push_back((x)    + (y)   * (getPlaneWidth()+1)); //Bottom Left
        Indices.push_back((x+1)  + (y)   * (getPlaneWidth()+1)); //Bottom Right
        Indices.push_back((x+1)  + (y+1) * (getPlaneWidth()+1)); //Top Right

        Indices.push_back((x+1)  + (y+1) * (getPlaneWidth()+1)); //Top Right
        Indices.push_back((x)    + (y+1) * (getPlaneWidth()+1)); //Top Left
        Indices.push_back((x)    + (y)   * (getPlaneWidth()+1)); //Bottom Left
    }
    else //reverse triangle
    {
        Indices.push_back((x+1)  + (y)   * (getPlaneWidth()+1)); //Bottom Right
        Indices.push_back((x)    + (y)   * (getPlaneWidth()+1)); //Bottom Left
        Indices.push_back((x)    + (y+1) * (getPlaneWidth()+1)); //Top Left

        Indices.push_back((x)    + (y+1) * (getPlaneWidth()+1)); //Top Left
        Indices.push_back((x+1)  + (y+1) * (getPlaneWidth()+1)); //Top Right
        Indices.push_back((x+1)  + (y)   * (getPlaneWidth()+1)); //Bottom Right
    }