Problem mit D3DVECTOR



  • Hi, ich bins mal wieder!

    Ich habe da mal wieder ein kleines Problem, konnte bei google leider nix finden, wbend so wenig in der Doku.

    Ich erstelle eine Struktur:

    struct OURCUSTOMVERTEX { float x,y,z; D3DVECTOR vNormal; DWORD color; };
    

    Nun mache ich ne Variale, basirend auf der Struktur:

    OURCUSTOMVERTEX cv_Vertices[WIDTH*HEIGHT];
    

    Soweit ist alles gut, aber nun möchte ich den wert "vNormal" (D3DVECTOR) ändern, aber ich weiß nicht wie.

    Ich stelle mir das im moment so vor:

    cv_Vertices[y*WIDTH + x].vNormal.a = 1;
    cv_Vertices[y*WIDTH + x].vNormal.b = 1;
    

    das "a" und "b" sind gerade nur als Psoido Code gedacht.

    Weiß einer, was dort stadt dessen des "a" und "b" hin müsst?



  • Lol, jetzt auf einmal nach PC neustart zeigt meine IDE nach dem ich den punkt gesetzt habe die unter dinger an xD

    x und y sind es^^



  • x und y 🤡



  • Naja, abwr irgent wie funktioniert das immer noch net so wie ich will xD

    Das mit dem Licht, was ich machen will ...

    Also, Licht kommt an, aber es entstehen keine Helligkeits unterschiede, überal ist die selbe Helligkeit ...

    Aber vieleicht kann mir ja jemand helfen, denn ich sitze da schon den ganzen Tag seit zwei uhr dran und ich weiß einfach nicht mehr weiter ...

    Ich setze das licht sowie das material folgender maßen:

    D3DLIGHT9 light;    // create the light struct
        D3DMATERIAL9 material;    // create the material struct
    
        ZeroMemory(&light, sizeof(light));    // clear out the struct for use
        light.Type = D3DLIGHT_DIRECTIONAL;    // make the light type 'directional light'
        light.Diffuse.r = 20.0f;    // .5 red
        light.Diffuse.g = 0.5f;    // .5 green
        light.Diffuse.b = 0.5f;    // .5 blue
        light.Diffuse.a = 1.0f;    // full alpha (we'll get to that soon)
    
        D3DVECTOR vecDirection = {-1.0f, -0.3f, -1.0f};    // the direction of the light
        light.Direction = vecDirection;    // set the direction
    
        p_dx_Device->SetLight(0, &light);    // send the light struct properties to light #0
        p_dx_Device->LightEnable(0, TRUE);    // turn on light #0
    
        ZeroMemory(&material, sizeof(D3DMATERIAL9));    // clear out the struct for use
        material.Diffuse.r = material.Ambient.r = 1.0f;    // set the material to full red
        material.Diffuse.g = material.Ambient.g = 1.0f;    // set the material to full green
        material.Diffuse.b = material.Ambient.b = 1.0f;    // set the material to full blue
        material.Diffuse.a = material.Ambient.a = 1.0f;    // set the material to full alpha
    
        p_dx_Device->SetMaterial(&material);    // set the globably-used material to &material
    

    Und so setze ich die ganze Vertices des Terrains:

    for (int x=0;x< WIDTH;x++)
            {
    
                for (int y=0; y< HEIGHT;y++)
                {
                    cv_Vertices[y*WIDTH + x].x = -x;
                    cv_Vertices[y*WIDTH + x].y = y;
                    cv_Vertices[y*WIDTH + x].z = f_DataFile.get()/50;
                    cv_Vertices[y*WIDTH + x].color = 0xffffffff;
    				cv_Vertices[y*WIDTH + x].NORMAL.x = -1;
    				cv_Vertices[y*WIDTH + x].NORMAL.y = -1;
    
                }
            }
    

    Ich habe jetzt nur aus testzwecken allen die selben Normal werte gegeben, dann ist ja klar das kein helligkeits unterschied zu erkennen ist, aber ich habe diese Werte einfach mal geendert und es verändert sich nix.

    Und komischerweise ist das Terrain sichtbar, aber ich kann die light.Diffuse werte ändern, und es ändert sich nix. heißt das dann das das licht doch nicht an kommt?

    Bitte helft mir!!!



  • ich muss zugeben das ich von direct3d keine ahnung habe, allerdings kommt mir

    light.Diffuse.r = 20.0f;
    

    sehr suspekt vor. ich denke werte höher als 1.0f werden kein sinn machen, auch wenn das nichts mit deinem problem zu tun haben wird



  • 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


Log in to reply