Рисование вершины и основания цилиндра - PullRequest
1 голос
/ 30 марта 2020

Я пытаюсь создать класс, который может процедурно создавать призмы (или цилиндры, если точность достаточно высока), но отображаются только стороны 3d-модели (не верх и низ). Это использует openGL и c ++. Не ради эффективности, просто изменив предыдущий класс, который создал сферу.

#define numSlices 2
Prism::Prism() {
    init(3);
}

Prism::Prism(int prec) {
    init(prec);
}

float Prism::toRadians(float degrees) { return (degrees * 2.0f * 3.14159f) / 360.0f; }

void Prism::init(int prec) {
    prec = (prec < 3) ? 3 : prec;

    numVertices = (prec + 1) * (numSlices+1);
    numIndices = prec * numSlices * 6;
    for (int i = 0; i < numVertices; i++) { vertices.push_back(glm::vec3()); }
    for (int i = 0; i < numVertices; i++) { texCoords.push_back(glm::vec2()); }
    for (int i = 0; i < numVertices; i++) { normals.push_back(glm::vec3()); }
    for (int i = 0; i < numVertices; i++) { tangents.push_back(glm::vec3()); }
    for (int i = 0; i < numIndices; i++) { indices.push_back(0); }

    // calculate triangle vertices
    for (int i = 0; i <= numSlices; i++) {
        for (int j = 0; j <= prec; j++) {
            float y = i;
            float x = -(float)cos(toRadians(j * 360.0f / (float)prec));
            float z = (float)sin(toRadians(j * 360.0f / (float)prec));
            vertices[i * (prec + 1) + j] = glm::vec3(x, y, z);
            texCoords[i * (prec + 1) + j] = glm::vec2(((float)j / prec), ((float)i / numSlices));

        }
    }

    // calculate triangle indices 
    for (int i = 0; i < numSlices; i++) {
        for (int j = 0; j < prec; j++) {
            indices[6 * (i * prec + j) + 0] = i * (prec + 1) + j;
            indices[6 * (i * prec + j) + 1] = i * (prec + 1) + j + 1;
            indices[6 * (i * prec + j) + 2] = (i + 1) * (prec + 1) + j;
            indices[6 * (i * prec + j) + 3] = i * (prec + 1) + j + 1;
            indices[6 * (i * prec + j) + 4] = (i + 1) * (prec + 1) + j + 1;
            indices[6 * (i * prec + j) + 5] = (i + 1) * (prec + 1) + j;
        }
    }

}

Любые советы или решения, которые тесно связаны с уже написанным кодом, будут высоко оценены.

1 Ответ

1 голос
/ 31 марта 2020

Чтобы отобразить верх и низ цилиндра, вы можете создать «веерный треугольник», который начинается с вершины в центре верха / низа цилиндра и создает один треугольник для каждой стороны.

Адаптация вашего кода: (не проверено, возможно, я допустил ошибки в отношении порядка намотки)

int bottom_center = vertices.length(); vertices.push_back(glm::vec3(0,0,0));
int top_center = vertices.length(); vertices.push_back(glm::vec3(0,numSlices,0));

// Bottom
for (int j = 0; j < prec; j++) {
  int base = 0;
  indices.push_back(bottom_center);
  indices.push_back(base+j);
  indices.push_back(base+j+1);
}

// Top
for (int j = 0; j < prec; j++) {
  int base = numSlices * (prec+1);
  indices.push_back(top_center);
  indices.push_back(base+j);
  indices.push_back(base+j+1);
}

См. http://www.songho.ca/opengl/gl_cylinder.html для более проработанного примера.

...