Search code examples
c++arraysopenglvertex

Having problems with my OpenGL plane


I'm having a bit of trouble with creating a plane (using GL_TRIANGLE) using vertex arrays.

Heres my code:

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
        }
    }
}

The code works fine if the width and depth are the same, but if they are different, it screws up.

Can anyone see the problem?

I've coded it like this so that the Pivot point is in the middle of the plane.


Solution

  •     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
        }
    

    ?