äußere Flächennormale



  • Ich möchte die äußere Flächennormale Berechnen, was ja eigentlich kein Problem ist. Aber im Moment steh ich total auf'm Schlauch und finde meinen Fehler nicht. Ich berechne die Normalen wie folgt:

    void Model::CalculateNormale(float *pVector, unsigned short pP1, unsigned short pP2, unsigned short pP3)
    {
        // Kantenvektoren erstellen (entgegen dem Uhrzeigersinn)
        float tV1[3] = {mVertices[pP2][0]-mVertices[pP1][0],
                        mVertices[pP2][1]-mVertices[pP1][1],
                        mVertices[pP2][2]-mVertices[pP1][2]},
              tV2[3] = {mVertices[pP3][0]-mVertices[pP2][0],
                        mVertices[pP3][1]-mVertices[pP2][1],
                        mVertices[pP3][2]-mVertices[pP2][2]};
    
        // äußeren Normalenvektor ermitteln
        pVector[0] = tV1[1]*tV2[2] - tV1[2]*tV2[1];
        pVector[1] = tV1[2]*tV2[0] - tV1[0]*tV2[2];
        pVector[2] = tV1[0]*tV2[1] - tV1[1]*tV2[0];
    
        // Normalenvektor normieren
        float tNorm = sqrt(pVector[0]*pVector[0] + pVector[1]*pVector[1] + pVector[2]*pVector[2]);
        pVector[0] = pVector[0]/tNorm;
        pVector[1] = pVector[1]/tNorm;
        pVector[2] = pVector[2]/tNorm;
    }
    

    Die Normale wird in pVector geschrieben, die anderen 3 Parameter sind die Indizes der Eckpunkte. Das Problem ist, dass die berechneten Normalen nie senkrecht auf meinen Flächen stehen und ich den Fehler nicht entdecke.



  • sieht aber richtig aus^^

    überprüfe mal ob die Normalen den richtigen Flächen zuordnest.



  • Dieser Thread wurde von Moderator/in Jester aus dem Forum Mathematik in das Forum Spiele-/Grafikprogrammierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • überprüfe mal ob die Normalen den richtigen Flächen zuordnest.

    Ich denke schon. Ich bastele gerade an einem "3ds-Loader", der Code beim Laden der Flächen und bei Aufruf der obigen Funktion sieht we folgt aus:

    case 0x4120:
                    tFile.read((char*)&mQtyFaces, 2);    // Anzahl der Oberflächen
                    mFaces = new unsigned short*[mQtyFaces];
                    mNormals = new float*[mQtyFaces];
                    for(int i=0; i<mQtyFaces; i++) {
                        unsigned short tFaceInfo;
                        mFaces[i] = new unsigned short[4];     // Vertex A, B, C, Index des Materials
                        mNormals[i] = new float[3];
                        tFile.read((char*)&mFaces[i][0], 2);    // Vertex A auslesen
                        tFile.read((char*)&mFaces[i][1], 2);    // Vertex B auslesen
                        tFile.read((char*)&mFaces[i][2], 2);    // Vertex C auslesen
                        this->CalculateNormale(mNormals[i], mFaces[i][0], mFaces[i][1], mFaces[i][2]);
                        tFile.read((char*)&tFaceInfo, 2);       // sonstige Informationen über die Fläche
                    }
                    break;
    

    Pro Fläche berechne ich eine Normale, du den gleichen Index kann es da eigentlich zu keiner Verwechslung kommen. Und ich verwende ja schließlich auch direkt die drei aus der Datei gelesenen Eckpunkte.



  • Ach verdammt ... die Normalen werden schon richtig berechnet, nur habe ich bei der Ausgabe selbiger die falschen Koordinaten verwendet.


Anmelden zum Antworten