Порядок вершин OpenGl для куба

Я искал OpenGL и нырял в мир 3D. Этот вопрос относится к OpenGL в целом, но я использовал WebGL (который, если мне кажется, является OpenGL ES). У меня возникла проблема с пониманием того, как рисуются кубики. Я знаю, что для рисования четырехугольника вы создаете два треугольника в порядке (по умолчанию) против часовой стрелки, например

1       0 
|‾ ‾ ‾ ‾|
|       |    Indices = 0,1,2, 0,2,3 (2 triangles one face)
|       |
|_ _ _ _|
2       3  

Однако у меня возникли некоторые проблемы с пониманием того, как лучше всего нарисовать куб. Есть ли особый способ рисования куба? Например, рисование граней в оптимальном порядке спереди-> справа-> снизу-> слева-> сверху-> сзади или каким-то другим способом. Мне тоже нужно рисовать грани куба против часовой стрелки или что-то в этом роде? Мне просто нужно понять, как можно представить модель / куб разными способами и почему.


person Joey Clover    schedule 15.03.2014    source источник


Ответы (1)


Это можно сделать с двумя полосами треугольников, но полосы обычно заменяются индексированными треугольниками для более сложной геометрии, потому что они становятся более эффективными, когда вам нужно несколько полос. Я думаю, что это также можно сделать с одной полосой, если вы используете вырожденный треугольник для соединения двух, но индексирование обычно лучше для большей геометрии. Квадроциклы просто превращаются в треугольники.

Направление намотки важно только тогда, когда включена отбраковка задней поверхности. Кроме того, все усложняется, когда вы добавляете координаты текстуры и нормали поверхности для освещения. Нормали можно использовать для придания кубу граненого или плавного оттенка, что действительно для больших моделей, таких как сферы. Вот учебник, который я написал много лет назад для OpenGL ES 2.0:

/******************************************************************************

  Function      DrawCubeSmooth

  Return        None

  Description   Draw a cube using Vertex and NormalsPerVertex Arrays and
                glDrawArrays with two triangle strips.  Because normals are
                supplied per vertex, all the triangles will be smooth shaded.
                Triangle strips are used instead of an index array.  The first
                strip is texture mapped but the second strip is not.

******************************************************************************/

void Cube2::DrawCubeSmooth(void)
{
    static GLfloat Vertices[16][3] =
    {   // x     y     z
        {-1.0, -1.0,  1.0}, // 1  left    First Strip
        {-1.0,  1.0,  1.0}, // 3
        {-1.0, -1.0, -1.0}, // 0
        {-1.0,  1.0, -1.0}, // 2
        { 1.0, -1.0, -1.0}, // 4  back
        { 1.0,  1.0, -1.0}, // 6
        { 1.0, -1.0,  1.0}, // 5  right
        { 1.0,  1.0,  1.0}, // 7
        { 1.0,  1.0, -1.0}, // 6  top     Second Strip
        {-1.0,  1.0, -1.0}, // 2
        { 1.0,  1.0,  1.0}, // 7
        {-1.0,  1.0,  1.0}, // 3
        { 1.0, -1.0,  1.0}, // 5  front
        {-1.0, -1.0,  1.0}, // 1
        { 1.0, -1.0, -1.0}, // 4  bottom
        {-1.0, -1.0, -1.0}  // 0
    };
    static GLfloat NormalsPerVertex[16][3] =    // One normal per vertex.
    {   // x     y     z
        {-0.5, -0.5,  0.5}, // 1  left          First Strip
        {-0.5,  0.5,  0.5}, // 3
        {-0.5, -0.5, -0.5}, // 0
        {-0.5,  0.5, -0.5}, // 2
        { 0.5, -0.5, -0.5}, // 4  back
        { 0.5,  0.5, -0.5}, // 6
        { 0.5, -0.5,  0.5}, // 5  right
        { 0.5,  0.5,  0.5}, // 7
        { 0.5,  0.5, -0.5}, // 6  top           Second Strip
        {-0.5,  0.5, -0.5}, // 2
        { 0.5,  0.5,  0.5}, // 7
        {-0.5,  0.5,  0.5}, // 3
        { 0.5, -0.5,  0.5}, // 5  front
        {-0.5, -0.5,  0.5}, // 1
        { 0.5, -0.5, -0.5}, // 4  bottom
        {-0.5, -0.5, -0.5}  // 0
    };
    static GLfloat TexCoords[8][2] =
    {   // x   y
        {0.0, 1.0}, // 1  left                  First Strip
        {1.0, 1.0}, // 3
        {0.0, 0.0}, // 0
        {1.0, 0.0}, // 2
        {0.0, 1.0}, // 4  back
        {1.0, 1.0}, // 6
        {0.0, 0.0}, // 5  right
        {1.0, 0.0}  // 7
    };

    glEnableVertexAttribArray(VERTEX_ARRAY);
    glEnableVertexAttribArray(NORMAL_ARRAY);
    glEnableVertexAttribArray(TEXCOORD_ARRAY);

    // Set pointers to the arrays
    glVertexAttribPointer(VERTEX_ARRAY, 3, GL_FLOAT, GL_FALSE, 0, Vertices);
    glVertexAttribPointer(NORMAL_ARRAY, 3, GL_FLOAT, GL_FALSE, 0, NormalsPerVertex);
    glVertexAttribPointer(TEXCOORD_ARRAY, 2, GL_FLOAT, GL_FALSE, 0, TexCoords);

    // Draw first triangle strip with texture map
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 8);

    // Draw second triangle strip without texture map
    glDisableVertexAttribArray(TEXCOORD_ARRAY);
    glDrawArrays(GL_TRIANGLE_STRIP, 8, 8);

    glDisableVertexAttribArray(VERTEX_ARRAY);
    glDisableVertexAttribArray(NORMAL_ARRAY);
};

Надеюсь, это поможет.

person ClayMontgomery    schedule 18.03.2014