Jak skorygować nawijanie trójkątów w kierunku przeciwnym do ruchu wskazówek zegara modelu 3D Mesh?

Przede wszystkim pozwól mi wyjaśnić. Nie pytam o siatkę 2D, aby określić porządek uzwojenia siatki 2D, jest bardzo łatwy w kierunku normalnym-z.

Po drugie, nie zadaję żadnego zoptymalizowanego algorytmu, nie martwię się czasem ani szybkością, chcę to zrobić za pomocą mojej siatki.

Kiedy trianguluję obiekt 3D za pomocą algorytmu Chciwy rzut triangulacji, ten problem występuje. sprawdź załączone obrazy.

Jeśli zastosuję podejścia 2D do tego modelu za pomocą „Oblicz obszar podpisany” lub „Krzyżowa produkcja wektorów AB i BC trójkąta”, rozwiązuje to tylko siatkę 2D, ale co z siatką 3D?

Najpierw musimy sprawdzić, które trójkąty są w złym kierunku nawijania w siatce 3D, a następnie rozważamy tylko te trójkąty, więc problem polega na tym, jak możemy sprawdzić, które trójkąty są w złym kierunku nawijania w 3D? Nie możemy zrobić tylko z podejściem 2D. Przetestowałem to i bez powodzenia.

Na przykład w przypadku kuli nie możemy zastosować podejścia 2D do kuli. Czy jest jakiś sposób na rozwiązanie tego problemu?

Dzięki.

Aktualizacja nr 1:

Poniżej znajduje się algorytm sprawdzania, która krawędź ma to samo uzwojenie. To nie działa dobrze, nie wiem dlaczego. Teoretycznie powinien poprawić wszystkie trójkąty, ale nie koryguje. Na przykład w przypadku kontroli kuli na załączonym rysunku. Coś jest z nim nie tak.

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);
    }
}

questionAnswers(2)

yourAnswerToTheQuestion