如何使用GL_TRIANGLES生成飞机?

时间:2018-02-05 00:25:02

标签: c++ opengl mesh

是否有可用于使用GL_TRIANGLES基元类型生成平面的算法?

这是我目前的职能:

Mesh* Mesh::CreateMeshPlane(vec2 bottomleft, ivec2 numvertices, vec2 worldsize){

int numVerts = numvertices.x * numvertices.y;

float xStep = worldsize.x / (numvertices.x - 1);
float yStep = worldsize.y / (numvertices.y - 1);

VertexFormat* verts = new VertexFormat[numVerts];

for (int y = 0; y < numvertices.y; y++)
{
    for (int x = 0; x < numvertices.x; x++)
    {           
        verts[x + (y * numvertices.x)].pos.x = bottomleft.x + (xStep * x);
        verts[x + (y * numvertices.x)].pos.y = bottomleft.y + (yStep * y);
        verts[x + (y * numvertices.x)].pos.z = 0;
    }
}

Mesh* pMesh = new Mesh();
pMesh->Init(verts, numVerts, indices, 6, GL_STATIC_DRAW);

glPointSize(10.0f);
pMesh->m_PrimitiveType = GL_POINTS;

delete[] verts;

return pMesh;}

我只是不确定如何在for循环中实现索引,以便能够知道要绘制哪些点。

我认为我需要知道:

每个正方形将由2个三角形组成,每个正方形需要6个指数

目前我从左下角绘图

我需要知道我传给的数字中有多少个方格

2 个答案:

答案 0 :(得分:0)

也许是这样的:

int width = 4;
int length = 6;
int height = 1;

std::vector<float> planeVertices;

for (int x = 0; x < width - 1; x++) {
    for (int z = 0; z < length - 1; z++) {
        planeVertices.push_back(x);
        planeVertices.push_back(height);
        planeVertices.push_back(z);

        planeVertices.push_back(x);
        planeVertices.push_back(height);
        planeVertices.push_back(z + 1);

        planeVertices.push_back(x + 1);
        planeVertices.push_back(height);
        planeVertices.push_back(z + 1);


        planeVertices.push_back(x);
        planeVertices.push_back(height);
        planeVertices.push_back(z);

        planeVertices.push_back(x + 1);
        planeVertices.push_back(height);
        planeVertices.push_back(z);

        planeVertices.push_back(x + 1);
        planeVertices.push_back(height);
        planeVertices.push_back(z + 1);
    }
}

...

unsigned int VBO, VAO;
glGenVertexArrays(1, &VAO);
glGenBuffers(1, &VBO);

glBindVertexArray(VAO);

glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, planeVertices.size() * sizeof(float), planeVertices.data(), GL_STATIC_DRAW);

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), 0);
glEnableVertexAttribArray(0);

...

glDrawArrays(GL_TRIANGLES, 0, (width - 1) * (length - 1) * 6);

此代码创建std::vector<float>并将平面顶点添加到其中。嵌套的for循环为平面的每个单元添加两个三角形(因此,width为4,length为6,平面将为4个单位乘以6个单位,并且将由6 * 4 * 2 = 48个三角形)。平面的高度由height变量设置。这只会生成平面,但通过简单的变换,您可以根据需要旋转和缩放。

警告:此代码未经测试。

答案 1 :(得分:0)

在这里关闭这个问题我是怎么做到的:

Mesh* Mesh::CreateMeshPlane(vec3 bottomleft, ivec2 numvertices, vec2 
worldsize, vec2 texturerepetition)
{
    int numVerts = numvertices.x * numvertices.y;
    int numFaces = (numvertices.x - 1) * (numvertices.y - 1);
    int numIndices = numFaces * 6;

    float xStep = worldsize.x / (numvertices.x - 1);
    float yStep = worldsize.y / (numvertices.y - 1);
    float zStep = worldsize.y / (numvertices.y - 1);

    float uStep = texturerepetition.x / (numvertices.x - 1);
    float vStep = texturerepetition.y / (numvertices.y - 1);

    VertexFormat* verts = new VertexFormat[numVerts];
    unsigned int* indices = new unsigned int[numIndices];

    for (int y = 0; y < numvertices.y; y++)
    {
        for (int x = 0; x < numvertices.x; x++)
        {
            verts[x + (y * numvertices.x)].pos.x = bottomleft.x + (xStep * x);
            verts[x + (y * numvertices.x)].pos.y = bottomleft.y;
            verts[x + (y * numvertices.x)].pos.z = bottomleft.z + (zStep * y);

            verts[y * numvertices.x + x].uv.x = uStep * x;
            verts[y * numvertices.x + x].uv.y = vStep * y;
        }
    }

    int offset = 0;

    for (int i = 0; i < numIndices; i++)
    {
        // The bottom left index of the current face
        // + the offset to snap back when we hit the edge
        unsigned int cornerIndex = i/6 + offset;

        // If we reach the edge we increase the offset so that it goes to the next bottom left
        if ((cornerIndex + 1)%numvertices.x == 0)
        {
            offset++;
            cornerIndex++; // Adding new offset to the bottom left
        }

        // First triangle
        indices[i] = (unsigned int)cornerIndex;
        i++;
        indices[i] = (unsigned int)cornerIndex + numvertices.x;
        i++;
        indices[i] = (unsigned int)cornerIndex + numvertices.x + 1;
        i++;

        // Second triangle
        indices[i] = (unsigned int)cornerIndex;
        i++;
        indices[i] = (unsigned int)cornerIndex + numvertices.x + 1;
        i++;
        indices[i] = (unsigned int)cornerIndex + 1;
    }

    //glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);

    Mesh* pMesh = new Mesh();
    pMesh->Init(verts, numVerts, indices, numIndices, GL_STATIC_DRAW);

    delete[] verts;

    return pMesh;
}

工作流: 1.计算我需要的面数,然后计算指数 2.当我们意识到我们到达顶点数组的边缘时(通过使用模数numvertices.y),创建一个添加到cornerIndex的偏移量 3.根据cornerIndex

进行简单的数学计算,以正确的顺序绘制角点

注意: 1.我使用GL_TRIANGLES作为基本类型绘图 2.从左下角到右上角绘图 3. cornerIndex因此是我们在

上绘制的当前正方形的左下角

希望有人能发现这有用!