Normalvektor berechnen und das Kreuzprodukt



  • Ich habe mich in letzter Zeit damit befasst, den Normalvektor eines Dreiecks zu berechnen, ich versuche es wie folgt:

    vertices[0].position = D3DXVECTOR3(0.3f, 0.3f, 0.0f); 
    vertices[0].texture = D3DXVECTOR2(0.0f, 1.0f);
    
    vertices[1].position = D3DXVECTOR3(0.3f, 0.3f, 0.25f);  
    vertices[1].texture = D3DXVECTOR2(0.5f, 0.0f);
    
    vertices[2].position = D3DXVECTOR3(0.3, 0.7f, 0.0f); 
    vertices[2].texture = D3DXVECTOR2(1.0f, 1.0f);
    
    vertices[3].position = D3DXCROSS(vertices[0].position,vertices[1].position);
    vertices[4].position = D3DXCROSS(vertices[0].position,vertices[2].position);
    vertices[5].position = D3DXNORMALIZE((vertices[3].position+vertices[4].position)/2);
    

    In vertices[5].position soll eigentlich nur der Normalvektor der Vektoren vertices[0].position,vertices[1].position sowie vertices[2].position.
    Mein Ergebnis lautet für vertices[5].position = {0.46829292 , -0.46829292 , 0.74926865)
    Daher wollte ich fragen ob dieses Ergebnis richtig ist oder ansonsten, wo der Fehler in der Rechnung liegt.
    Mfg SpR



  • Schau dir nochmal genau die Formeln an. Das was dort steht, ist...irgendwas anderes.

    Warum teilst du eigentlich in der letzten Zeile durch 2, wenn du danach nochmal normalisierst?



  • Sorry vielleicht hätte ich die Zeilen Code erklären sollen, nach dem was ich verstanden habe ist ein Normalvektor ein Vektor welcher senkrecht auf dem Dreieck/Polygon steht. Ich habe zuerst das Kreuzprodukt von den Vekotren vertices[0].position und vertices[1].position bestimmt. Danach habe ich das Kreuzprodukt der Vektoren vertices[0].position und vertices[2].position bestimmt, der absolute Normalvektor des Polygon läge demnach bei dem Mittelwert der beiden Kreuzprodukte also habe ich die beiden addiert, danach durch 2 geteilt um den Mittelwert zu bestimmen und am Ende normalisiert damit die Vektorlänge nicht ungleich 1 ist. Ich verstehe den fehler in meiner Logik leider nicht ganz.



  • Der Fehler liegt darin, dass das nicht die richtige Formel ist.

    http://www.matheboard.de/archive/6908/thread.html



  • Vielen Dank du hast vollkommen Recht, allerdings wie kann ich den Normalvektor berechnen wenn es z.b. sich 3 Vektoren auf vertices[0] auswirken z.b. sind es bei einer Kugel ja auch nicht genau 3 Vektoren, die den Vektor vertices[0] nutzen.



  • zuerst einmal berechnet dir die Formel die Normale eines _Dreiecks_. Nicht eines Punktes. Die Normale eines Punktes ergibt sich dann als Mittelwert der Normalen aller angrenzenden Dreiecke.



  • Vielen Dank,
    klappt jetzt alles prima.
    MfG SpR.



  • Könnte vielleicht mir jeman noch erklären, wie man eine Kugel aus Driecken rendert bzw. deren Normalvektoren berechnet, damit Beleuchtung auf veko0rebene möglich ist. Mir fehlen leider die Mathematischen Kenntnisse dazu, wäre nett wenn jemand eine Seite verlinken könnte oder es selbst erklärt. Sinus , Cosinus und tangenz kenne ich schon ich weiß nur nicht wie sie einzusetzen sind.


  • Mod

    -du initialisierst alle vertex normalen mit 0
    -berechnest pro dreieck die normale und addierst sie auf die jeweiligen 3 vertex normalen
    -du gehst alle vertex normalen durch und normalisierst sie

    damit bekommst du die simple version. es gibt nicht "DIE" art es zu machen, es gibt einige und je nach 3d program wird es auch ein anderer algorithmus benutzt. mit dem oben bekommst du aber leicht ein zufriedenstellendes ergebnis (wenn keine bugs bei dir im source sind).



  • Vielen dank Rapso,
    Schönen Abend noch.


Anmelden zum Antworten