Как исправить наматывание треугольников против часовой стрелки в 3D-модели сетки?

Прежде всего, позвольте мне прояснить ... Я не спрашиваю о 2D-сетке, чтобы определить порядок намотки 2D-сетки очень легко с направлением по нормали-z.

Во-вторых, я не спрашиваю какой-либо оптимизированный алгоритм, я не беспокоюсь о времени или скорости, я просто хочу сделать это с моей сеткой.

Когда я триангулирую 3D-объект, используя алгоритм триангуляции Greedy Projection, возникает эта проблема. проверьте прикрепленные изображения.

Если я применяю двухмерные подходы к этой модели, используя «Calc, ulate Signed Area» или «Перекрестное производство векторов AB и BC треугольника», она решает только 2D-сетку, но как насчет 3D-сетки?

Сначала нам нужно проверить, какие треугольники находятся в неправильном направлении намотки в трехмерной сетке, затем мы рассмотрим только эти треугольники, поэтому вопрос в том, как мы можем проверить, какие треугольники имеют неправильное направление намотки в 3D? Мы не можем просто сделать с 2D подходом, я проверил это, но безуспешно.

Например, в случае сферы, мы не можем применить 2D подход к сфере. Так есть ли способ решить эту проблему?

Благодарю.

Обновление № 1:

Ниже приведен алгоритм проверки того, какое ребро имеет одинаковую обмотку. Это не работает хорошо, я не знаю почему. Теоретически это должно исправить все треугольники, но это не исправление. Например, в случае сферы проверьте на прилагаемом рисунке. Что-то не так с этим.

void GLReversedEdge(int i, int j, GLFace *temp)
{
    //i'th triangle
    int V1 = temp[i].v1;
    int V2 = temp[i].v2;
    int V3 = temp[i].v3;

    //i'th triangle edges
    int E1[] ={V1, V2};
    int E2[] ={V2, V3};
    int E3[] ={V3, V1};

    //adjacent triangle
    int jV1 = temp[j].v1;
    int jV2 = temp[j].v2;
    int jV3 = temp[j].v3;

    //adjacent edges
    int jE1[] ={jV1, jV2};
    int jE2[] ={jV2, jV3};
    int jE3[] ={jV3, jV1};

    // 1st edge of adjacent triangle is checking with all edges of ith triangle
    if((jE1[0] == E1[0] && jE1[1] == E1[1]) ||
       (jE1[0] == E2[0] && jE1[1] == E2[1]) ||
       (jE1[0] == E3[0] && jE1[1] == E3[1]))
    {
       temp[j].set(jV2, jV1, jV3);      // 1st edges orientation is same, so reverse/swap it
    }
    // 2nd edge of adjacent triangle is checking with all edges of ith triangle
    else if((jE2[0] == E1[0] && jE2[1] == E1[1]) ||
            (jE2[0] == E2[0] && jE2[1] == E2[1]) ||
            (jE2[0] == E3[0] && jE2[1] == E3[1]))
    {
            temp[j].set(jV1, jV3, jV2); // 2nd edges orientation is same, so reverse/swap it
    }
    // 3rd edge of adjacent triangle is checking with all edges of ith triangle
    else if((jE3[0] == E1[0] && jE3[1] == E1[1]) ||
            (jE3[0] == E2[0] && jE3[1] == E2[1]) ||
            (jE3[0] == E3[0] && jE3[1] == E3[1]))
    {
            temp[j].set(jV3, jV2, jV1); // 3rd edges orientation is same, so reverse/swap it
    }
}

void GetCorrectWindingOfMesh()
{
    for(int i=0; i<nbF; i++)
    {
        int j1 = AdjacentTriangleToEdgeV1V2;
        if(j1 >= 0) GLReversedEdge(i, j1, temp);

        int j2 = AdjacentTriangleToEdgeV2V3;
        if(j2 >= 0) GLReversedEdge(i, j2, temp);

        int j3 = AdjacentTriangleToEdgeV3V1;
        if(j3 >= 0) GLReversedEdge(i, j3, temp);
    }
}

Ответы на вопрос(2)

Ваш ответ на вопрос