interpolation highmap



  • Ich weiß, daß das Thema hier schon behandelt wurde.
    Auchbeim goolen gibt es zig Seiten dazu. Ich schnalls bloß nicht.

    Zur Frage.

    Ich habe eine Highmap aus Dreiecken.
    Auf einem Dreieck liegt ein Punkt mit den bekannten Koordinaten x_pos, z_pos.

    Die Höhe y_pos ist unbekannt.

    Das Dreieck hat die Eckpunkte (x1,y1,y2), (x2,y2,z2), (x3,y3,z3).

    Wie kann ich mit diesen Variablen die Höhe des Punktes, also y_pos ausmachen.
    Alles was ich gefunden habe, hab ich nicht verstanden. Ich stolper einfach über mir unverständliche mathematische Gleichungen, und, oder grob umrissene Beschreibungen.



  • Die Höhe steht doch in der Heightmap. Und die Heightmap ist genauso groß, wie
    dein Terrain Elemente in X und Z Richtung hat. d.h. suchst dir einfach das
    Byte an der Stelle (Z*terrain_elemente_in_der_breite)+X in der Heightmap.

    Dort hast du dann einen Wert von 0 bis 255 und das ist dann deine Höhe. Diese
    kannst du dann noch mit einem Faktor multiplizieren, so dass du meinetwegen
    nur Höhen zwischen 0 und 10 hast.



  • Entweder bilineare Interpolation oder eine senkrechte Gerade mit dem Dreieck schneiden.

    Bye, TGGC (Denken, und gut ist.)



  • Es ist in dem Sinn keine Highmap, also aus einer .raw Datei, sondern ein Gitter aus float Koordinaten.
    Jedes Dreieck kann mit seinen Ecken z.B. auf y1=0.444, y2=1.554 und y3=7.894 höhe liegen.

    Meine xpos und zpos Koordinaten ligen also irgendwo dazwischen, wenn ich irgendwo auf dem Dreieck stehe.

    Das Dreieck-Netz ist sehr grob gestrickt.



  • TGGC schrieb:

    Entweder bilineare Interpolation oder eine senkrechte Gerade mit dem Dreieck schneiden.

    Bye, TGGC (Denken, und gut ist.)

    Ich weiß nicht wie das geht. Ich meine genau das ist meine Problem. Einen Algorithmus dazu in Codeartiger Form zu finden.



  • Trulli schrieb:

    Ich stolper einfach über mir unverständliche mathematische Gleichungen

    Die mathematische Gleichung dafür ist recht primitiv. Es ist sehr lobenswert, dass du bei google etc. gesucht hast, aber wenn du das schon nicht verstehst...Mehr als dir zu sagen wie es geht kann auch hier niemand und du wirst sicherlich dutzende Pages gefunden haben die das sehr ausführlich tun.

    Versuch doch mal, dir dass Ganze 2-dimensional vorzustellen. Zeichne dir in ein Koordinatensaystem eine Linie, setz irgendwo auf diese Linie einen Punkt und versuche dessen Höhe auszurechnen. Hast du das dann geschafft UND verstanden, schaust du dir die Gleichungen für die 3D-Version nochmal an und dir wird hoffentlich vieles klarer werden.



  • Was mir bei mathematischen Gleichungen so aufstößt, ist das ich nie weiß was mit A und a und ß usw.. gemeint ist.
    Wenn zum Beispiel A/B = C ist, ist dann die x,y oder z koordinate von A gemeint, oder besteht der Eckpunkt plötzlich nur noch aus einer einzigen Koordinate im Universum.
    Ich weiß, daß sich das blöd anhört. Aber Mathe ist nicht mein Ding. Kann trotzdem ganz gut proggen. Meistens löse ich meine Probleme auch ganz gut.
    Ich habe Tonnenweise vollgekritzelter DinA4 Zettel mit Koordinatenkreuzen vor mir zu liegen.

    A B E R
    Ich hab ne Sperre und brauche endlich ein Stück Code.

    ODER
    Vielleicht eine mathematische Gleichung, in der Zeile für Zeile aufgelöst wird.



  • Die Formel ist nur eine Zeile, die dann einfach in mehreren Dimensionen angewandt wird. Es steckt nicht mehr als ein Steigungsdreieck dahintet, also y= mx + b.

    Bye, TGGC (Denken, und gut ist.)


  • Mod

    du weißt doch die x und z position eines punktes
    damit weißt du, in welcher 'masche' deines 'gitternetes' der punkt liegt. nimm dir die eckpunkt heraus, aus der die masche aufgespannt ist.

    nun hast du links zwei punkte und rechts zwei punkte. zwischen jeweils dem oberen und unterem jeder seite kannst du nun interpolieren durch

    unten.y*(1.f-nachkommastellen(punkt.z)) + oben.y*nachkommastelle(punkt.z)
    

    wenn du das für beide seiten machst, dann hast du nun die höche für die linke und rechte seite der masche.

    nun kannst du auf die gleiche art und weise zwischen den beiden punkten interpolieren, mittels punkt.x, so erhällst du dann die höche an deinem punkt

    noch irgendwelche klarheiten:D ?

    rapso->greets();



  • Ich habs so gemacht. Ruckelt aber tierisch

    //Hilfsfunktion wegen DivZero Error
    float dif(float n, float z)
    {
        if (n == 0 || z == 0) return 0;
        else                  return n/z;
    }
    
    FUNTION
    b = dif(x3,x1);
    c = dif(y3,b);
    h1 = y3-c; //die höhe auf der x-Achse
    
    b = dif(x2,x1);
    c = dif(y2,b);
    h1 = y2-c; //die höhe auf der z-Achse
    
    b = dif(xpos,zpos);
    c = dif(h1,b);
    return = y2-c;
    


  • Kans auch nicht sein. Wird immer geändert wenn ich mich von einem Dreieck zum anderen bewege. Also keine Steigung auf dem einzelnen Dreieck.
    Sch.... ich bin kurz vorm Zusammenbruch.



  • Das schlimme ist, man kann nach den vielen Rechenschritten nicht mehr nachvollziehen, welcher der falsche war.


  • Mod

    wieso nicht? du kannst das doch im debugger gut mal testen, nimm als höchenwerte sowas wie 1,2,3,4 für die ecken und schau nach wo er dir müll ausgibt.

    zum coden gehört nunmal auch debuggen, je besser du das kannst, desto schneller wirst du mit der zeit vorrankommen. 👍

    rapso->greets();



  • Genau.

    Bye, TGGC (Dem beste BdT)



  • So nun habe ich endlich die Lösung

    Gegeben war also:

    Auf einem Dreieck liegt ein Punkt mit den bekannten Koordinaten x_pos, z_pos.

    Die Höhe y_pos ist unbekannt.

    Das Dreieck hat die Eckpunkte (x1,y1,y2), (x2,y2,z2), (x3,y3,z3).

    float ypos, lambda1, lambda2;
    
         if (x2 != x1){
             lambda2 = ( (zpos-z1) - (xpos-x1)*(z2-z1)/(x2-x1) )/( (z3-z1) - (x3-x1)*(z2-z1)/(x2-x1) );
             ypos = y1 +  (y2-y1)/(x2-x1)*(xpos-x1)  +( (y3-y1)-(x3-x1)*(y2-y1)/(x2-x1) )*lambda2;
         }else{
             lambda2 = (xpos-x1)/(x3-x2);
             lambda1 = ( (zpos-z1) - (z3-z1)*lambda2 )/(z2-z1);
             ypos = y1 + (y2-y1) * lambda1 + (y3-y1)*lambda2;
         }
    
             return ypos;
    

    Für alle, die mal auf das selbe Problem stoßen


Anmelden zum Antworten