Terrains



  • Wenn sich das Terrain nicht verändert, dann solltest Du Vertex Arrays verwenden. Dadurch sparts Du Dir sehr viele Funktionsaufrufe und die Schleifen.



  • @headhunter:
    wenn ich die x und y koordinaten einfach mit dem scalefaktor multiplieziere kommen trotzdem nicht die richtigen werte raus:

    terrain.getHeight( x * terrain.scale.v[0],
                       y * terrain.scale.v[2]);
    

    musste doch eigentlich stimmen oder?!

    @simon:
    ich wills erst später optimieren...



  • Jo, der Code müsste stimmen. Was klappt denn nicht ? Kleine Ungenauigkeiten, oder komplett falsch ?



  • hatte einen fehler (hab das terrain auf y koordinate ausgerichtet und das nicht berücksichtigt)
    aber jetzt ist das problem immer noch nicht richtig gelöst:
    bei dem objekt das ich verschiebe ändert sich die y koordinate nicht schön langsam, sondern springt auf und ab...



  • Ist ja auch klar, denn das Terrain hat ja nur eine bestimmte "Auflösung". Du musst zwischen den vier nächsten Kontrollpunkten interpolieren, so wie es auch bei Textur-Filtern gemacht wird.
    Hier ist ein Stück Code von einem meiner Programme, das ein Bild linear filtert:

    /*******************************************************************/
    // Funktion zum Abfragen eines gefilterten Pixelwerts
    tbColor CBitmap::GetFilteredPixel(float x,
                                      float y)
    {
        float fx = x - (float)((int)(x));
        float fy = y - (float)((int)(y));
    
        // Bilinearer Filter
        return (tbColor)((1.0f - fx) * ((1.0f - fy) * GetPixel((int)(x), (int)(y)) +
                          fy * GetPixel((int)(x), (int)(y) + 1)) +
                          fx * ((1.0f - fy) * GetPixel((int)(x) + 1, (int)(y)) +
                          fy * GetPixel((int)(x) + 1, (int)(y) + 1)));
    }
    

    Das dürfte sich gut für Dein Terrain verwenden lassen! Anstelle von tbColor hast Du halt floats und GetPixel muss bei Dir die Höhe an einer bestimmten Stelle liefern (hast Du ja schon).



  • Original erstellt von Headhunter:
    Du könntest z.B. einen Ray nach unten schießen und dann checken ob der mit dem Terrain kollidiert, das ist das einzige was mit im moment so einfallen würde

    Das ist nicht unbedingt sinnvoll, da der Ray sowieso mit dem Terrain kollidiert solange man sich in dem Rechteck( Quadrat ) über dem Terrain befindet. Also etwas zuviel Aufwand 😉

    Original erstellt von TomasRiker:
    **Ist ja auch klar, denn das Terrain hat ja nur eine bestimmte "Auflösung". Du musst zwischen den vier nächsten Kontrollpunkten interpolieren, so wie es auch bei Textur-Filtern gemacht wird.
    Hier ist ein Stück Code von einem meiner Programme, das ein Bild linear filtert:
    **

    Das ist eigentlich nicht genau das, was man braucht, da hier immer aus 3 Punkten ein Dreick aufgespannt wird. Man muss die 3 Punkte finden und eine Ebene durch sie aufspannen, dann kommt man zu dem gesuchten Punkt im Dreieck.



  • Mit der Interpolation müsste es aber auch funktionieren.



  • Original erstellt von TomasRiker:
    Mit der Interpolation müsste es aber auch funktionieren.

    Ja, es ist auch eine Annäherung, für den gesuchten Wert. Er ist aber eben nicht genau. Gerade bei LOD und wenn Quads stark "geknickt" sind, gibt es hohe Abweichungen.



  • danke! das mit dem interpolieren funktioniert wunderbar!!

    @TGGC wie würdest du das dann machen?!



  • Original erstellt von <freddy>:
    @TGGC wie würdest du das dann machen?!

    Augen auf bitte, bzw. lesen lernen. 😉



  • oh *g* 😃


Anmelden zum Antworten