如何在我当前的OpenGL代码中加入圆柱体?

tktrz96b  于 2023-08-04  发布在  其他
关注(0)|答案(1)|浏览(86)

我是一个OpenGL初学者,几乎没有任何意义给我。下面是我当前创建3D矩形的代码。我想创建一个3D圆柱体坐在它的中间,但我不确定如何实现这一点。我试图创建圆柱体的顶部使用8个三角形,但它不显示所需的。我已经看了多个教程,都集中在GLUdrawCylinder方法,但我没有线索,如何将其纳入我目前的代码。任何关于如何修复我当前代码以显示3D圆柱体的建议都将非常感谢。

void UCreateMesh(GLMesh& mesh)
{
// Position and Color data
GLfloat verts[] = {
    // Vertex Positions    // Colors (r,g,b,a)
     -0.5f,  0.25f, 0.0f,   1.0f, 1.0f, 0.5f, 1.0f, // Top Right Vertex 0
     -0.5f, -0.0f, 0.0f,   1.0f, 1.0f, 0.5f, 1.0f, // Bottom Right Vertex 1
    0.0f, 0.0f, 0.25f,   1.0f, 1.0f, 0.5f, 1.0f, // Bottom Left Vertex 2
    0.0f,  -0.25f, -0.25f,   1.0f, 1.0f, 0.5f, 1.0f, // Top Left Vertex 3

     0.75f, 0.25f, -.25f,  1.0f, 1.0f, 0.5f, 1.0f, // 4 br  right
     0.75f,  0.0f, -.25f,  1.0f, 1.0f, 0.5f, 1.0f, //  5 tl  right
    0.25f,  .5f, 0.0f,  1.0f, 1.0f, 0.5f, 1.0f, //  6 tl  top
    0.25f, 0.25f, 0.0f,  1.0f, 1.0f, 0.5f, 1.0f,  //  7 bl back

    0.12f, 0.25f, 0.0f,  1.0f, 0.0f, 0.0f, 1.0f,  //  8 bl back
    0.06f, 0.30f, 0.0f,  1.0f, 0.0f, 0.0f, 1.0f,  //  9 bl back
    0.12f, 0.40f, 0.0f,  1.0f, 0.0f, 0.0f, 1.0f,  //  10 bl back
    0.25f, 0.30f, 0.05f,  1.0f, 0.0f, 0.0f, 1.0f,  //  11 bl back
    0.25f, 0.25f, 0.0f,  1.0f, 0.0f, 0.0f, 1.0f,  //  12 bl back
    0.25f, 0.20f, 0.0f,  1.0f, 0.0f, 0.0f, 1.0f,  //  13 bl back
    0.20f, 0.15f, 0.0f,  1.0f, 0.0f, 0.0f, 1.0f,  //  14 bl back
    0.10f, 0.20f, 0.0f,  1.0f, 0.0f, 0.0f, 1.0f,  //  15 bl back
    0.0f, 0.25f, 0.0f,  1.0f, 0.0f, 0.0f, 1.0f  //  16 bl back
    
};

// Index data to share position data
GLushort indices[] = {
    0, 1, 3,  // Triangle 1
    0, 2, 3,   // Triangle 2
    5, 4, 6,  // Triangle 3
    5, 7, 6,  // Triangle 4
    0, 2, 4, // Triangle 5
    0, 6, 4,  // Triangle 6
    1, 3, 5, // Triangle 7
    1, 7, 5, // Triangle 8
    2, 3, 5, // Triangle 9
    2, 4, 5, // Triangle 10
    0, 1, 7, // Triangle 11
    0, 6, 7, // Triangle 12     
    9,8,10,
    10,8,11,
    11,8,12,
    12,8,13,
    13,8,14,
    14,8,15,
    15,8,16,
    16,8,9,

    17,18,19,
    17,20,19,
    20,19,21,
    20,22,21,
    22,21,24,
    22,23,24,
    23,24,26,
    23,25,26,
    25,26,28,
    25,27,28,

};

字符集
我已经审查了多个教程,但所有我能设法创建的是立方体和金字塔。对汽缸毫无头绪。

xesrikrc

xesrikrc1#

你做它的部分。首先,为每个顶面和底面创建一个三角形圆圈。然后为每个面创建两个三角形,围绕圆柱体。下面是一些未经测试的代码,可以让你朝着正确的方向开始(如果我有机会,我会检查它是否都是CCW,并正确地生成人脸):

vector<vec3> initCylinder(int resolution, float radius, float height) {

    // top circle of vertices
    vector<vec3> topCircle = {};
    for (unsigned int i = 0; i < resolution; i++) {
        // create a vertex i/resolution the way around the circle
        float angle = (i / resolution) * 360.0f;
        topCircle.push_back(vec3(-cos(radians(angle))*radius, height/2.0f, sin(radians(angle)))*radius);
    }
    // bottom circle of vertices
    vector<vec3> bottomCircle = {};
    for (unsigned int i = 0; i < resolution; i++) {
        // create a vertex i/resolution the way around the circle
        float angle = (i / resolution) * 360.0f;
        bottomCircle.push_back(vec3(-cos(radians(angle))*radius,-height/2.0f, sin(radians(angle)))*radius);
    }
    // store the raw triangle data
    vector<vec3> data = {};

    // create triangles for the vertices
    // top circle triangles
    vec3 topCenter = vec3(0,height/2.0f,0);
    for (unsigned int i = 0; i < resolution; i++) {
        data.push_back(topCircle.at(i));
        data.push_back(topCircle.at((i+1) % resolution));
        data.push_back(topCenter);
    }
    // bottom circle triangles
    vec3 bottomCenter = vec3(0,-height/2.0f,0);
    for (unsigned int i = 0; i < resolution; i++) {
        data.push_back(bottomCircle.at(i));
        data.push_back(bottomCircle.at((i+1) % resolution));
        data.push_back(bottomCenter);
    }

    // side faces
    for (unsigned int i = 0; i < resolution; i++) {
        // first triangle
        data.push_back(bottomCircle.at(i));
        data.push_back(bottomCircle.at((i+1) % resolution));
        data.push_back(topCircle.at((i+1) % resolution));       
        // second triangle
        data.push_back(bottomCircle.at(i));
        data.push_back(topCircle.at((i+1) % resolution));       
        data.push_back(topCircle.at(i));
    }
    return data;
}

字符集

相关问题