Problem mit D3DVECTOR



  • Um so höher um so stärker diese Farbe^^

    Und ich habe sie ja nur höher gesetzt um zu sehen ob sich was verändert... aber es verändert sich nix



  • Lol, warum hänge ich eigentlich den ganzen tag an so nem minni Problehm, wenn mir ständig immer gleich nahcdem ich im Forum Frage durch zufall die Lösung entdecke xD

    Das licht zeigte in die falsche richtung 😃

    So, dann Frage ich gleich mal nach der dritten Sache nach der ich heute gesucht habe.

    Also, ich bin ja durch das experimentieren, googlen etc ein wenig schlauer geworden! ich weiß das ich wenn ich ein Licht vom Typ:

    D3DLIGHT_DIRECTIONAL

    erstelle, das die Vertices einen Normal wert haben müssen, irgent wie (was ich nicht verstanden habe) einen Kruzpunkt von einer ebene (es wurd acuh nur eine ebene gesagt, keine werte) und den eckpunkten des Vertices und das muss dannNormaliziert werden. Die beiden Werte müssten dann in der Structur der Vertices eingebunden werden und feddich.

    Da ich diese Informationen aus vielen verschiedenen Artikeln und Foren habe, kann es gut sein das da irgent etwas nicht zusammen passt.

    auf jeden fall habe ich das umgesetzt. Nur die Normal werte habe ich überal den selben, aber ich habe ihn ein paar mal geendertund geschaut ob sich was ändert, aber die helligkeit bleibt die selbe.

    Nun Frage ich mich, wie ich es hinbekomme das man die Helligkeits unterschiede auf den verschiedenen Vertices erkennen kann.

    Achja, es geht um ein Terrain das aus einer heightmap generiert wurde.

    Ich hoffe mir kann jemand helfen!, denn das werde ich nicht selber hin bekommen, dass weiß ich!



  • 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