Problem mit D3DVECTOR



  • Für die Beleuchtung muss eben jeder Vertex eine sinnvolle Normale haben. Sinnvoll bedeutet fast immer, dass die Normale orthogonal zur Ebene steht, in der das Dreieck des Vertex liegt. Das hat übrigens garnichts mit einem DirectionalLight zu tun - auch ein Punktlicht oder Spotlicht benötigt Vertex Normalen.



  • Wenn ich ein punktlicht benutze funktioniert es aber ganz gut, glaub aber nicht das es performant ist um ne ganze Landschaft aus zu leuchten xD

    Habe aber noch nicht ganz verstanden was du meinst 😞

    welche ebene (ich glaube ich habe garkeine ebene angelegt?), und wie mache ich das?

    Kennst du zufällig die Formel dafür, um diesen Normal Wert aus zu rechnen?



  • Ich sagte ja auch "Ebene, in der das Dreieck liegt". Ein Dreieck spannt logischerweise eine Ebene auf. Die Normale erhältst du durch das Kreuzprodukt 2er Kanten des Dreiecks (z.B. v1-v0 und v2-v0).



  • Also, ich rechne einfach (v1 - v0) und (v2 - v0) Und das erste ergebnis trage ich in Normal.x und das zweite in Normal.y und das wars dann?



  • Liest du dir die Beiträge überhaupt durch? Und selbst wenn du es nicht verstanden hast, kannst du doch einfach nach Kreuzprodukt googeln.



  • Irgent wie verstehe ich das nicht, ich habe jetzt ogar in meinem schlauen Buch:

    3d spiele programmieren mit directx und c++ (in 21 tagen) nachgeschaut, denn da steht auch nen wenig darüber, aber ich kappiers einfach nicht???



  • Tjo, dann reichen deine Mathekenntnisse eben noch nicht aus für Direct3D & Co => goto mathe



  • ich meine damit, das da tausende verscheidene wege sind, die auch noch nen anderes ergbnis ergeben.

    Bei der einen muss ich noch das sinus heraus finden etc ..., bei ner anderen muss ich das einfach nur multiplizieren. Das verwiert ich ganz schön, zumal da nichts von subtrahieren vor kommt!



  • Showball schrieb:

    ich meine damit, das da tausende verscheidene wege sind, die auch noch nen anderes ergbnis ergeben.

    Bei der einen muss ich noch das sinus heraus finden etc ..., bei ner anderen muss ich das einfach nur multiplizieren. Das verwiert ich ganz schön, zumal da nichts von subtrahieren vor kommt!

    this->that schrieb:

    Tjo, dann reichen deine Mathekenntnisse eben noch nicht aus für Direct3D & Co => goto mathe



  • Selbst wenn man den Zusammenhang nicht versteht, sollte man in der Lage sein, die Formel einfach zu benutzen...



  • Also, wenn ich jetzt b eispielsweise diese Form hier nehme:

    ax + by + cz = d

    Wo dort ja schon wieder viele verschiedene rechnungen sind, wo ich jetzt keine Ahnung habe, welche gemeint ist ...

    Ich muss ja einmal bei mir im Code ein Y und ein X wert angeben, aber da bekomme ich nur einen wert raus ... 😕



  • Grundlagen:
    Du hast ein Dreieck, gegeben durch 3 Punkte (v1,v2,v3).
    Verlaengert man gedanklich dieses Dreieck ueber seine Kanten hinaus ins Unendliche, hat man eine Ebene.
    Eine moegliche eindeutige Definition einer Ebene besteht aus deren Normale (die Ausrichtung der Ebene im Raum) und einem Punkt auf der Ebene (Position der Ebene im Raum).
    Jenen Punkt kann man noch weiter vereinfachen indem man einfach sagt wie weit man sich (vom Nullpunkt aus) die Normale entlang bewegen muss um auf die Ebene zu stossen - damit ist die Ebene durch 4 Skalare (Normale + Entfernung) definiert, daher die Formel **a***x + b*y + c*z = d.

    Da Du durch Dein Dreieck aber auch 3 Kanten gegeben hast, gilt:

    Ist E durch zwei aufspannende Vektoren u und v gegeben...

    Fuer diese "aufspannenden Vektoren" setzt Du also einfach zwei Deiner Kanten ein, zb u= v2-v1 und v= v3-v1.
    Was Du nun willst ist ein Vektor "n" der senkrecht auf diesen beiden steht - und den bekommst Du mit dem Kreuzprodukt:

    n.x= u.y * v.z - u.z*v.y;
    n.y= u.z * v.x - u.x*v.z;
    n.z= u.x * v.y - u.y*v.x;
    


  • Jetzt habe ich es verstanden xD

    Echt gute Erklärung!!!

    Wenn ich das nun alles ausgerechnet habe, muss ich den Vector N an mein Vertic übergeben, richtig?

    Ich werde (sobald ich zuhause bin) mich sofort dran setzen und es aus probieren^^ Bin grade in der Schule und auf den Pc habe ich leider kein MSVC++ xD



  • Wenn ich das nun alles ausgerechnet habe, muss ich den Vector N an mein Vertic übergeben, richtig?

    Singular: Vertex
    Plural: Vertices (engl.) bzw Vertizen (dt.)

    Der Normalenvektor ist Teil Deiner Vertexstruktur.
    Es ist sinnvoll diesen nach der Berechnung auch darin abzulegen...
    Weiterhin muss die Normale "normiert" sein, dh die Laenge 1.0 haben.
    Dadurch kann bei der Lichtberechnung die Divsion durch die Laenge entfallen und man spart sich allerhand Aufwand.



  • Wenn ich mich nicht irre, musst du noch vor dem Rendern dein FVF entsprechend
    setzen, sonst weiß D3D nicht, dass es die Normaleninformation in deinen Vertices
    gibt - nur für den Fall, dass du das noch nicht gemacht hast, da du die Normalen
    ja erst jetzt berechnest.

    m_pd3dDevice->SetFVF(D3DFVF_XYZ| D3DFVF_NORMAL | [...] );
    


  • Das hab ich schon gemacht, aber danke für den Hinweis!


Anmelden zum Antworten