Uhrzeigersinn eines Dreiecks...



  • Hi, der Titel ist etwas unschön formuliert xD

    Also ich hab drei Vertices von einem Dreieck. Ich weiß in welche Reihen folge die Koordinaten aufgerufen wurden. Wie kann ich daraus im 3D-Raum berechnen, wie das Dreieck gerendert wurde? CCW, CW CCW=CounterClockWisw, CW=ClockWise...
    Warum brauche ich daS? -> Ich will die Normale von dem Dreieck berechnen, damit es richtig beleuchtet wird. Ich benutze OpenGL...

    Hier ist eine Funktion die das Ganze 2D macht...
    Quelle ist GameDev.net

    /* A single vertex */
    
    typedef struct {
            int color;              /* RGB */
            float x;
            float y;
            float z;
    } vertex;
    
    /*
     * determinant
     *
     * Computes the determinant of the three points.
     * Returns whether the triangle is clockwise or counter-clockwise.
     */
    
    int determinant( p1, p2, p3, v )
        int p1, p2, p3;             /* The vertices to consider */
        vertex v[];                 /* The vertex list */
    {
        float x1, x2, x3, y1, y2, y3;
        float determ;
    
        x1 = v[p1].x;
        y1 = v[p1].y;
        x2 = v[p2].x;
        y2 = v[p2].y;
        x3 = v[p3].x;
        y3 = v[p3].y;
    
        determ = (x2 - x1) * (y3 - y1) - (x3 - x1) * (y2 - y1);
        if (determ >= 0.0)
            return COUNTER_CLOCKWISE;
        else
            return CLOCKWISE;
    } /* End of determinant */
    

    Gruß Chris



  • Die Definition CCW und CW ist immer bezüglich einer Richtung definiert. Wenn du dir ein Dreieck von einer Seite betrachtest und die Vertices sind im Uhrzeigersinn definiert, so ist dies von der anderen Seite gesehen genau umgekehrt.

    Die Reihenfolge CW bzw. CCW ist bei der Normalenberechnung wichtig. Bei Änderung der Reihenfolge zeigt die Normale dann in die entgegengesetzte Richtung, was (normalerweise) zur falschen Beleuchtungsrechnung führt.



  • Ok, ähm hast du vlt ne Idee wie man das lösen kann ? Also folgende Situation:
    Ich will die Normale zum Betrachter zeigen lassen, und nun muss geprüft werden wierum es gezeichnet wurde! Sprich ich brauche lediglich diese Funktion !
    EDIT: Mit anderen Worten, ich will praktisch berechnen wierum das Dreieck gezeichnet wurde von einem gewissen Punkt.

    Gruß Chris



  • Ich muss da irgendwie an den orientierbaren Rand einer Mannigfaltigkeit denken.
    Du hast ja genau 2 normierte (Länge 1) Normalenvektoren auf dein Dreieck.
    Eine zeigt in das "innere" (vom Betrachter weg) und eine ins "äußere" (zum Betrachter). Ich würde jene Normale nehmen, die den kleinsten Winkel zum Vektor Betrachter-Dreieck aufweist.


Anmelden zum Antworten