Влияние последовательности при указании треугольников, образующих куб с линиями ребер - PullRequest
0 голосов
/ 16 апреля 2020

Я начал с этого урока для начинающих (http://www.opengl-tutorial.org/beginners-tutorials/tutorial-4-a-colored-cube/): ...

static const GLfloat g_vertex_buffer_data[] = {
    -1.0f,-1.0f,-1.0f, // triangle 1 : begin
    -1.0f,-1.0f, 1.0f,
    -1.0f, 1.0f, 1.0f, // triangle 1 : end
    1.0f, 1.0f,-1.0f, // triangle 2 : begin
    -1.0f,-1.0f,-1.0f,
    -1.0f, 1.0f,-1.0f, // triangle 2 : end
    1.0f,-1.0f, 1.0f,
    -1.0f,-1.0f,-1.0f,
    1.0f,-1.0f,-1.0f,
    1.0f, 1.0f,-1.0f,
    1.0f,-1.0f,-1.0f,
    -1.0f,-1.0f,-1.0f,
    -1.0f,-1.0f,-1.0f,
    -1.0f, 1.0f, 1.0f,
    -1.0f, 1.0f,-1.0f,
    1.0f,-1.0f, 1.0f,
    -1.0f,-1.0f, 1.0f,
    -1.0f,-1.0f,-1.0f,
    -1.0f, 1.0f, 1.0f,
    -1.0f,-1.0f, 1.0f,
    1.0f,-1.0f, 1.0f,
    1.0f, 1.0f, 1.0f,
    1.0f,-1.0f,-1.0f,
    1.0f, 1.0f,-1.0f,
    1.0f,-1.0f,-1.0f,
    1.0f, 1.0f, 1.0f,
    1.0f,-1.0f, 1.0f,
    1.0f, 1.0f, 1.0f,
    1.0f, 1.0f,-1.0f,
    -1.0f, 1.0f,-1.0f,
    1.0f, 1.0f, 1.0f,
    -1.0f, 1.0f,-1.0f,
    -1.0f, 1.0f, 1.0f,
    1.0f, 1.0f, 1.0f,
    -1.0f, 1.0f, 1.0f,
    1.0f,-1.0f, 1.0f
};

И применил DrawArray: GLES20.GL_TRIANGLE_FAN, чтобы получить штриховку, а затем DrawArray : GLES20.GL_LINES для ребер куба. Но в дополнение к искажениям глубины, упомянутым в руководстве, он также рисовал диагонали кое-где, чтобы исказить внешний вид куба. Я изменил последовательность таким образом (вы можете изменить все коэффициенты обратно на 1.0f, чтобы вернуть форму куба):

    // [01] +XY face elev front
    .7f,  1.4f, -0.1f,   //2: ele front top right
    .7f, -1.4f, -0.1f,   //1: ele front bottom right
    .7f, -1.4f, -0.1f,   //1: ele front bottom right
    -.7f, -1.4f, -0.1f,  //0: ele front bottom left
    -.7f,  1.4f, -0.1f,  //3: ele front top left
    .7f,  1.4f, -0.1f,   //2: ele front top right

    // [02] +ZX face pln top
    .7f,  1.4f, -0.1f,   //2: pln top  bot right
    -.7f,  1.4f, -0.1f,  //3: pln top top left
    -.7f,  1.4f, 0.1f,   //5: pln top bot left
    -.7f,  1.4f, 0.1f,   //5: pln top bot left
    .7f,  1.4f, 0.1f,    //4: pln top  bot right
    .7f,  1.4f, -0.1f,   //2: pln top  bot right

    // [03] +YZ face elevn rght
    .7f,  1.4f, -0.1f,   //2: ele rgt top left
    .7f,  1.4f,  0.1f,   //4: ele rgt top right
    .7f,  -1.4f, 0.1f,   //7: ele rgt bot right
    .7f,  -1.4f, 0.1f,   //7: ele rgt bot right
    .7f, -1.4f, -0.1f,   //1: ele rgt bot left
    .7f,  1.4f, -0.1f,   //2: ele rgt top left

    // [04] -YZ face ele left
    -.7f, -1.4f, 0.1f,   //6: ele lft bot right
    -.7f, 1.4f, 0.1f,    //5: ele lft bot left
    -.7f, -1.4f, -0.1f,  //0: ele lft top right
    -.7f,  1.4f, -0.1f,  //3: ele lft top left
    -.7f, 1.4f, 0.1f,    //5: ele lft bot left

    // [05] -XY face ele back
    -.7f, -1.4f, 0.1f,   //6: ele back bot right
    -.7f, 1.4f, 0.1f,    //5: ele back  top right
    .7f,  1.4f, 0.1f,    //4: ele back top left
    .7f,  1.4f, 0.1f,    //4: ele back top left
    .7f,  -1.4f, 0.1f,   //7: ele back bot left
    -.7f, -1.4f, 0.1f,   //6: ele back bot right

    // [06] -ZX face plan bot
    -.7f, -1.4f, 0.1f,   //6: plan bot back left
    -.7f, -1.4f, -0.1f,  //0: plan bot front left
    .7f, -1.4f, -0.1f,   //1: plan bot front right
    .7f, -1.4f, -0.1f,   //1: plan bot front right
    .7f,  -1.4f, 0.1f,   //7: plan bot back right
    -.7f, -1.4f, 0.1f,   //6: plan bot back left

И получил только линии ребер, но они были неполными, поэтому после ряда испытаний и обойти ошибки, удалось получить эффект прозрачного каркаса, добавив к этой измененной последовательности следующие дополнительные треугольники:

    // Cross-Over from front to back views
    .7f,  -1.4f, 0.1f,   //7: plan bot back right
    .7f, -1.4f, -0.1f,   //1: plan bot front right
    -.7f, -1.4f, -0.1f,  //0: plan bot front left

    -.7f, -1.4f, -0.1f,  //0: plan bot front left
    -.7f, -1.4f, 0.1f,   //6: ele back bot right
    .7f,  -1.4f, 0.1f,   //7: plan bot back right

    .7f,  -1.4f, 0.1f,   //7: ele back bot left
    .7f,  1.4f, 0.1f,    //4: ele back top left
    .7f,  1.4f, -0.1f,   //2: ele rgt top left

    .7f,  1.4f, -0.1f,   //2: ele rgt top left
    -.7f,  1.4f, -0.1f,  //3: pln top top left
    -.7f,  1.4f, 0.1f,   //5: pln top bot left
    -.7f,  1.4f, -0.1f,  //3: pln top top left
    .7f,  1.4f, -0.1f,   //2: ele rgt top left

В конечных комментариях действительны только метки вершин. Для визуализации В соответствии с настройками моих аннотаций восемь вершин грани нумеруются от начальной грани главной грани 0: (-1, -1, -1) против часовой стрелки, а начальная вершина 4 противоположной грани: (1, 1, 1) также против часовой стрелки, обращенной к положительному Z.

Эта последовательность дала четкий каркасный след куба, в отличие от непрозрачного эффекта solid с использованием GLES20.glEnable: GL_DEPTH_TEST с GLES20.glDepthFun c: GL_LESS.

Стоит упомянуть дополнительные наблюдения, (1): фильтр проверки глубины уничтожил плоские формы, которые были в непосредственной близости от куб, и (2): без пяти дополнительных конечных треугольников исключение теста глубины обнажило диагонали на непрозрачных передних гранях (не в начальном рендере, чувствительном к глубине, но после поворота, который изменил последовательность порядка глубины).

Моя последовательность вершин каркаса больше похожа на иголку в стоге сена. Кто-нибудь может объяснить это более предсказуемым образом? С другой стороны, есть ли способ непосредственно нарисовать куб из каркасной конструкции, повторно используя последовательность вершин без дополнительных треугольников? (Самое большее, что я знаю на данный момент, это то, что начало дополнительных линий треугольника должно было быть достигнуто путем отвода вдоль письменных ребер вместо того, чтобы переходить непосредственно к ним, чтобы вызвать дополнительные нежелательные диагонали.)

Заранее спасибо (TIA )

...