Vertices der Landschaft auslesen - Hilfe....

  • Hallo Leute, ich bin neu hier :bye:


    Ich bin hier etwas am Verzweifeln bezüglich des Auslesens der heightmap einer Landschaft.



    TInlineComponentArray<ULandscapeComponent*> components;

    landscape->GetComponents<ULandscapeComponent>(components);



    for (auto i = components.CreateIterator(); i; i++)

    {

    FTextureSource& hmap_texture = (*i)->GetHeightmap()->Source;

    check(hmap_texture.IsValid());


    int32 hmap_size_x = hmap_texture.GetSizeX();

    int32 hmap_size_y = hmap_texture.GetSizeY();

    }



    hmap_size_x und hmap_size_y sind nur jeweils 512.


    Das heißt die heightmapgröße ist nur 512x512 obwohl die Landschaft viel größer ist (8129x8129).
    Dementsprechend kann ich nicht auf alle Vertices der Landschaft zugreifen.

    Was mach ich denn hier falsch??

  • Ich würde sagen, dass du eine Mipmap abrufst, also eine vekleinerte Version der Textur.


    Versuch mal die Textur in Originalgröße abzurufen


    Hier gibt es einen Blogartikel dazu:


    https://isaratech.com/ue4-read…pixels-from-a-utexture2d/


    Also über hmap_texture.PlatformData->Mips[0] gehen.


    Dann hast du diesen Typen:

    https://docs.unrealengine.com/…exture2DMipMap/index.html

  • Hi freezernick,

    danke schon mal für die schnelle Antwort :-)

    Mein code sieht dann so aus (Anhang):


    als size_x kommt aber wieder 512 (anstatt 8129)...

    Stimmt die Zeile 221 in der ich die Heightmap aus der ersten LandscapeComponent fische?

    Die Originalwerte in Zeile

    222 OldCompressionSettings = TC_Default(0)
    223 OldMipGenSettings = TMGS_LeaveExistingMips(14)
    224 OldSRGB = false



    Vielleicht magst nochmal drüberschaun. Danke schon mal.

  • Ich bin kein Programmierer aber ein Gedanke:


    1. Bei der Heightmap findet ja eine Tesselierung statt. Das heißt das Terrain wird in kleinere Dreiecke zerlegt, wodurch alles runder wird. (Pixel Probleme in der Heightmap verschwinden dadurch)


    2.Beim Start und wenn der Player das Terrain nicht sieht, hat das Terrain einen sehr sehr niedrigen Polycount und das Terrain ist flach wie eine Flunder.


    3.Der Polycount ändert sich ständig je Position des players und Kamera Winkel.


    Ich glaube deswegen nicht das man den Polycount beim Start auf einmal auslesen kann.

    Dass du vielleicht den Polycount jede Sekunde einmal ausließt und du dann andere Zahlen bekommst...


    Ich weiß nicht was du vorhast aber du kannst die Tessellierung auch manuell ändern. zb beim Start kurz hochdrehen, messen und dann wieder runter drehen.

  • Hm, was ich benötige ist jeden Vertex der Landschaft (also seine x,y und z Koordinate). Damit baue ich in einer anderen Physikengine (Bullet) ein Terrain.

    Also benötige ich nach dem Bau der Landschaft alle Vertices. Später dann nicht mehr, richtig.

    Ich glaube der Ansatz von freezernick ist schon richtig. Denn wenn ich die MipMaps der Landschaft anschau dann gehen die nur bis maximaler Auflösung von 512x512.


    Ich brauch daher die Originaltextur.

  • Ich habe mich ehrlich gesagt auch noch nie damit beschäftigt und habe einfach nur schnell in der Dokumentation und bei Google gesucht, aber ich kann mir das auch nochmal genauer ansehen. Da komme ich dann aber (wahrscheinlich) erst Richtung Wochenende zu.

    Was ist denn dein genauer use-case? Also woher hast du den Landscape-Pointer?

  • Das wäre super, freezernick!

    Also ich erzeuge im Editor mit Modes->Landscape die Landschaft. Zum Beispiel eine mit 8129x8129 pixeln

    In c++ suche ich danach:


    TArray<AActor*> lands;

    UGameplayStatics::GetAllActorsOfClass(UeWorld, ALandscape::StaticClass(), lands);

    ALandscape* landscape = Cast<ALandscape>(lands[0]);

    UTexture2D* MyTexture2D = landscape->LandscapeComponents[0]->GetHeightmap();


    Und dann ginge es weiter mit dem link den du empfohlen hast:


    TextureCompressionSettings OldCompressionSettings = MyTexture2D->CompressionSettings;

    TextureMipGenSettings OldMipGenSettings = MyTexture2D->MipGenSettings;

    usw.



    Das MyTexture2D das da ausgelesen wird ist maximal 512x512 groß.
    Aber wie du gesagt hast, es ist nicht die Originalgröße.

    Sogar nach der Programmzeile:
    MyTexture2D->UpdateResource();


    Dort werden zwar die MipMaps eliminiert aber die Texturegröße bleibt bei 512x512

    Vielleicht findest du was raus :-)