Mal wieder Terrain...

Übersicht BlitzBasic Blitz3D

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

 

LaiKiam

Betreff: Mal wieder Terrain...

BeitragDi, Mai 16, 2006 14:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo an alle hier im Forum,

Da ich gerne mal was Größeres tippen möchte, hab' ich mir gedacht, so eine Weltoberfläche auf der man rumrennen kann wäre für's erste was Feines. Die Welt komplett in einem 3D Editor zusammenbauen und jeden Stein einzeln setzen ist nicht mein Ding, also sind Meshes und BSP Sachen ala Quake erstmal weggefallen.
Deshalb bin ich beim Befehl LoadTerrain hängengeblieben, weil's so schön einfach ist Wink.
Also habe ich 'ne Heightmap gemalt, dazu die Textur und eine Miniroutine um die Kamera laufen und springen zu lassen. So weit, so gut. Allerdings bin ich sofort an die Grenzen des Terrains (512x512) gestoßen. Nun habe ich die Routine flux dahingehend erweitert, das die Kamera sich innerhalb einer Blase bewegt und für jede Blase eine Heightmap und Tex gemalt, was allerdings zB. bei 32x32 Blasen auch sehr viel Arbeit wäre, da die Ränder sich wegen der Sichtweite überlappen müssen, sonst poppt beim Wechsel auf das neue Terrain der Inhalt der neuen Blase auf und wenn die Kamera sich um 180 Grad dreht, sieht der Player nichts mehr aus der alten Blase, logo.

Bevor ich nun einen 'Land-Auto-Generator' und 'Objektpositioniereditor' dafür code, meine Fragen:

1.) Hat jemand performancetechnisch schon Erfahrungen mit einem dynamischen Terrainloader?

2.) Gibt es dort Speicherlecks, da ja beim Wechsel in eine neue Blase ein neues Terrain samt Texturen geladen wird?

2a) Wenn ja, wie würde das mit Meshes funktionieren? Habe dort keine Idee, wie ich das mit den Überlappungen realisieren könnte... (Ansatz reicht mir)

3.) Ist das mit dem Terrainbefehl alles Kappes und es gibt einen besseren Ansatz? Wenn ja, her damit... Wink oder

4.) hat jemand so etwas schon fertig (Kamera auf einem theoretisch beliebig großem Terrain bewegen mit World-Generator) und würde mich mal reinschauen lassen?

Als Neuling in B3D würde es mich freuen, wenn ihr dazu mal ein paar Kommentare abgebt. Und danke schonmal im voraus...

LaiKiam
 

coldie

BeitragDi, Mai 16, 2006 14:30
Antworten mit Zitat
Benutzer-Profile anzeigen
ich hab etwas ähnliches mit meshes gemacht (aber nur ganz simpel) weil ich nicht wusste wie ich bei heightmaps die übergänge machen soll (das hat einfach nicht funktioniert). Hast du eine lösung für die übergänge bei mehreren heightmaps?
 

LaiKiam

BeitragDi, Mai 16, 2006 14:40
Antworten mit Zitat
Benutzer-Profile anzeigen
@ coldie: wenn Du 2 Heightmaps verbinden willst, brauchst Du eine 3te mit der Hälfte der Daten von den beiden anderen, die sozusagen dazwischen liegt. Ich hab's für meinen Test von Hand gemacht, je nachdem wie gross Deine Welt sein soll, mehr oder minder aufwendig. Ich schau mir grad nebenbei auf Wikipedia ( http://de.wikipedia.org/wiki/Windows_bitmap ) das BMP Format an, da mir ein Tilegenerator für eine (fast) beliebig große Welt vorschwebt und wenn es kein Nachteil ist, laufend ein neues Terrain zu laden, werde ich wohl ein riesiges BMP erstellen (lassen) und dann automatisch mit einem Generator zerlegen....[/url]
 

Dreamora

BeitragDi, Mai 16, 2006 14:41
Antworten mit Zitat
Benutzer-Profile anzeigen
1) Geht nicht. Blitz Anwendungen bleiben solange stehen bis alles geladen ist ...
Hier wird normalerweise die methode verwendet, alles vorweg zu laden und dnan hidet man, was man nicht braucht in dem Moment.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

LaiKiam

BeitragDi, Mai 16, 2006 14:51
Antworten mit Zitat
Benutzer-Profile anzeigen
@ Dreamora:
Das es kurz 'hängt' wenn das neue Terrain geladen wird, habe ich schon bei meiner Minimap gemerkt, ist aber auch nichts anderes als bei Morrowind, Anarchy Online, Projekt Entropia usw., dort hakelt es auch kurz, da ja neue Daten geladen (lokal/Server) werden, sollte also nicht so schlimm sein.
Es wird ja bei allen Zocks auch Außenengine und Innenengine unterschieden, dort wird ebenfalls nachgeladen. Solange es keine 10 Sec dauert, imho np...

https://www.blitzforum.de/foru...php?t=5868
 

coldie

BeitragDi, Mai 16, 2006 15:06
Antworten mit Zitat
Benutzer-Profile anzeigen
korrigiert mich:
Wenn man eine richtig große welt machen will, kommt man um das laden von maps während des spiels nicht herum. Weil heightmaps eine zeitlang brauchen bis sie generiert sind sollte man vlt. besser meshes nehmen da die nicht erst berechnet werden müssen und so schneller geladen werden können.
Aber: Eigentlich finde ich die methode festgelegte x und z Koordinaten für vertexes zu haben und nur die y Koordinaten variieren zu lassen recht genial, und der rechenaufwand müsste eigentlich geringer sein. Gibt es keine Möglichkeit das heightmap prinzip in einer 3d-datei zu speichern?

Und: Eigentlich ist es doch sowieso nicht gerade elegant aus einem bild extra eine geometrie zu erstellen, wo doch das ergebniss jedesmal dasselbe ist. Wieso speichert man die aus der heightmap generierte geometrie nicht in eine datei und lädt diese dann?
 

LaiKiam

BeitragDi, Mai 16, 2006 15:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Da ich es einfach mag, wollte ich den Terrainbefehl nutzen. Habe mich nun nebenbei fast durch's ganze Forum gelesen und ein paar nette Postings gefunden:

https://www.blitzforum.de/foru...php?t=4572
https://www.blitzforum.de/foru...mp;start=0
https://www.blitzforum.de/foru...php?t=3733

So wie es aussieht, scheint es außer dem kurzen Stop beim Nachladen keinerlei Probleme zu geben, bleibt nur noch die Frage, ob B3D ordentlich den Speicher aufräumt, wenn laufend das Terrain ausgetauscht wird.

Die Berechnungszeit des LoadTerrain Befehls kann man getrost vernachlässigen Wink.

@coldie : Ich wollte nicht die fertige Geometrie aus dem Bild erstellen, sondern die Terraintiles (512x512) aus einem RiesenBMP (32000x32000) automatisiert erstellen lassen. Dieses RiesenBMP wird natürlich auch automatisiert berechnet nach Vorgaben auf Fraktalbasis, somit fällt die aufwendige Handmalerei weg.
 

Dreamora

BeitragDi, Mai 16, 2006 15:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Scalst du eigentlich das Terrain? weil ich sehe den Sinn von 32k Terrains nicht sooo wirklich, da BlitzTerrains selbst unterteilen ...

Einzig ihre erzeugungsgrösse ist bei weitem zu klein.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

coldie

BeitragDi, Mai 16, 2006 15:41
Antworten mit Zitat
Benutzer-Profile anzeigen
@LaiKiam:
mit "erstellen" meinte ich auch nicht, wie die heightmap erstellt wird, sondern wie das 3d-terrain aus der hightmap erstellt wird.

Was die übergänge angeht ist mir inzwischen klar warum du dich darum nicht kümmern musst. Das "Übergangsproblem" kommt nur dadurch zustande, dass die heightmaps getiled werden, d.h am rechten rand der heigmap gibt es einen übergang mit dem linken rand. Dasselbe gilt für Texturen.
Mit einer einzigen großen Textur umgehst du das ganze.
Aber bei mir geht das nicht, weil die Textur zu groß wäre.
 

LaiKiam

BeitragDi, Mai 16, 2006 15:55
Antworten mit Zitat
Benutzer-Profile anzeigen
@ Dremora : Ja, das scale ich. Die 32k HeightmapBMP dient nur aus Ausgang für die vielen,vielen kleineren HeightmapTiles und ist nach der Generierung nicht mehr nötig. Der Spieler sieht nur sein 512x512 HeightmapTile auf dem er sich gerade bewegt. Über die Tilekoordinate kann ich bequem die Objekte aus der Datenbank holen. Somit werden auch nur die Objekte angezeigt, welche sich innerhalb dieser Blase (512x512) befinden.

@coldie : Die Textur des jeweiligen Tiles wird auch geladen und hat somit handliches Format. Eine 32000x32000 Textur wäre ja auch echter Dummfug, mal abgesehen vom Speicherbedarf und den Ladezeiten.
 

LaiKiam

BeitragDi, Mai 16, 2006 15:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Hier ein Stück 'Testcode':

Code: [AUSKLAPPEN]

Function map_updaten()
   ;Heightmap und Texture für die aktuelle Blase laden

    FreeEntity terrain

    aktuelle_gtex$="textures/tex-"+Str(playerblasex)+"-"+Str(playerblasez)+".bmp"
    aktuelle_htex$="textures/height-"+Str(playerblasex)+"-"+Str(playerblasez)+".bmp"
    terrain=LoadTerrain( aktuelle_htex$ )
 
    TerrainDetail terrain,4000,True
    ScaleEntity terrain,1,terrainscale,1
    grass_tex=LoadTexture( aktuelle_gtex$)
    ScaleTexture grass_tex,64,64
    EntityTexture terrain,grass_tex

End Function


und

Code: [AUSKLAPPEN]

...
   ;Blasen
   If EntityX(camera)>(boxhalf+startx#) Then
      playerblasex=playerblasex+1
      PositionEntity camera,(EntityX(camera)-boxrange),EntityY(camera),EntityZ(camera)
      map_updaten()
   EndIf
   If EntityX(camera)<-(boxhalf-startx#) Then
      playerblasex=playerblasex-1
      PositionEntity camera,(EntityX(camera)+boxrange),EntityY(camera),EntityZ(camera)
      map_updaten()
   EndIf
   If EntityZ(camera)>(boxhalf+startz#) Then
      playerblasez=playerblasez+1
      PositionEntity camera,EntityX(camera),EntityY(camera),(EntityZ(camera)-boxrange)
      map_updaten()
   EndIf
   If EntityZ(camera)<-(boxhalf-startz#) Then
      playerblasez=playerblasez-1
      PositionEntity camera,EntityX(camera),EntityY(camera),(EntityZ(camera)+boxrange)
      map_updaten()
   EndIf
...


Ist zum Testen noch sehr simpel gehalten, deshalb habe ich die Heightmaps und Texturen erstmal nach Koordinaten benannt.
 

LaiKiam

BeitragDi, Mai 16, 2006 16:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
...bleibt nur noch die Frage, ob B3D ordentlich den Speicher aufräumt, wenn laufend das Terrain ausgetauscht wird.


Ja, tut es, ich Dummi Embarassed , hab' gerade die Funktion 15min in einer Endlosschleife laufenlassen und den RAMbedarf mit einem Monitor gegengecheckt, B3D scheint nichts übrigzulassen, Speicher war hinterher sogar 2k leerer als vorher...

Vielen Dank für Eure Meinungen, ich hab jetzt was zu coden Wink

cee all

LaiKiam
 

Dreamora

BeitragDi, Mai 16, 2006 18:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Solange du nicht versuchst die 32k bmp zu laden und in Blitz zu unterteilen ist alles ok Smile (das passt nämlich selbst bei aktuellen high end zockersystemen net in den RAM rein Wink )
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

LaiKiam

BeitragDo, Mai 18, 2006 13:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo nochmal,

bin jetzt etwas weiter, Terrain ist 4096x4096 groß und wird in 256x256 Tiles unterteilt, die je nach Position nachgeladen werden. Theoretisch kann das Gesamtterrain beliebig Groß sein, praktisch sind es bei 4096 aber schon 170MB pro Textureset (Heightmap+Lightmap+Texture=510MB).
Lightmapping für die Umgebung ist auch schon drin, allerdings wie realisiert man das für Objekte?
Papp' ich da einfach noch 'ne Textur an die passende Stelle am Boden oder muss das auch vorab 'gerendert' werden? Objekte ohne Lightmapping sehen einfach nur doof aus (Kreis am unteren Baum):
user posted image

Dann noch eine kleine Frage, kann man Entitys vom Fogging ausschließen? Das würde die Himmelsdarstellung extrem vereinfachen.

Danke schonmal für's durchlesen Wink

LaiKiam
 

Dreamora

BeitragDo, Mai 18, 2006 13:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Garnicht.
Lightmapping geht auf Terrains nicht wirklich gut ausser du machst die Terrain Tiles sehr klein, da du sehr viele Details benötigst, damit Objekte noch erkennbar sind auf der Lightmap.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

LaiKiam

BeitragDo, Mai 18, 2006 13:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmm, warum kriege ich immer ein gar nicht Confused , schade, dann brüte ich mal darüber nach, wie man was Vergleichbares implementieren kann. Eine softe Abdunklung wie es der Berg im Hintergrund macht mit den Etwaumrissen des Objektes würde mir ja genügen, aber ganz ohne etwas Schattenartiges sehen die Objekte nicht aus.
Noch jemand vllt eine Idee?

5k41

BeitragDo, Mai 18, 2006 15:09
Antworten mit Zitat
Benutzer-Profile anzeigen
weiss nicht ob es was bring/ du es schon hast aber stell mal den EntityFx typ der Skybox auf "selbstleuchtend" !

MfG
Projekte:
For a better World - Gesellschaftsspiel ( 100%)

User posted image
 

Dreamora

BeitragDo, Mai 18, 2006 16:42
Antworten mit Zitat
Benutzer-Profile anzeigen
LaiKiam hat Folgendes geschrieben:
Hmm, warum kriege ich immer ein gar nicht Confused , schade, dann brüte ich mal darüber nach, wie man was Vergleichbares implementieren kann. Eine softe Abdunklung wie es der Berg im Hintergrund macht mit den Etwaumrissen des Objektes würde mir ja genügen, aber ganz ohne etwas Schattenartiges sehen die Objekte nicht aus.
Noch jemand vllt eine Idee?


Etwas was du machen kannst ist beim Laden des Levels (oder im Leveleditor) Schattenmeshes erzeugen. Dazu müsstest du nur alle Vertices in Lichtrichtung mit "Linepick" auf das Terrain projezieren.
Am einfachsten geht das, wenn du ein schwarzes Dublikat des Objektes erzeugst, dessen Vertices du auf den Boden verschiebst. Dann musst du die Triangles nicht neu erzeugen.

Am effizientisten wäre es natürlich, wenn du die "Outline" berechnen würdest, also die äussersten Kanten, die den Schatten effektiv werfen. Dann bräuchtest du bedeutend weniger Polygone. Nur ist das garnicht so einfach.


Dazu müsste es meines wissens sogar einen Codearchiv Eintrag im englischen Board geben, wo eine einfache Figur auf den Untergrund projiziert wird.
Für statische Objekte funktioniert dieser Ansatz eigentlich recht gut, C&C überlebt damit schon ewig *ggg*
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

LaiKiam

BeitragDo, Mai 18, 2006 17:38
Antworten mit Zitat
Benutzer-Profile anzeigen
@ 5k41 : Super, EntityFX war der gesuchte Befehl, damit kann man das Fogging auf der Skybox deaktivieren Smile

@ Dreamora : Danke, ich werde mal dort stöbern gehen, hört sich gut an.

Danke für die guten Tips....

LaiKiam

*LaiKiam guckt nun auf sein altes Generals im Regal und überlegt, es kurz zu installieren*

Bob

BeitragSa, Mai 20, 2006 11:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo zusammen,

habe den Thread leider jetzt erst entdeckt da ich 'ne Zeit nicht im Forum war.
Zufällig arbeite ich grade an zimlich genau der selben Sache.

Erstellen einer BMP im Speicher mittels PerlinNoise Algo.
Zerteilen der BMP in Texturgerechte Häppchen.
Erstellen eines Mesh Terrains auf Basis der Hightmaptiles.

Wie bitte wurde nun das Problem gelöst das die MeshTerain Tiles
nahtlos und ohne Lücken exakt aneinander passen?

Zitat:
LaiKiam
Verfasst am: Di Mai 16, 2006 12:40 pm
@ coldie: wenn Du 2 Heightmaps verbinden willst, brauchst Du eine 3te mit der Hälfte der Daten von den beiden anderen, die sozusagen dazwischen liegt. Ich hab's für meinen Test .....


Ich würde gerne ohne ein "Verbindungstile" auskommen und hab mir folgendes überlegt. (noch nicht ausprobiert. Ist nur ne Idee)

Die große Ausgangsheigthmap von z.B. 4096*4096 wird z.B. in 128*128er Tiles zerlegt wobei jedoch jeweils die letzte Pixelspalte (Y) die erste Spalte in der angrenzenden Map ist (in x Richtung)
und die letzte Pixelreihe (x) ebenfalls die erste Reihe in der angrenzenden Map in Y Richtung.
Wen nun aus den so überlappenden Bitmaps eine MeshTile erzeugt wird sollten eigentlich die Vertices der Berührungskanten an den gleichen Koordinaten liegen und kein Übergang mehr sichtbar sein.

Hat jemand mit dieser Methode schon Erfahrungen gesammelt? und ist sie praktikabel.
(Bin mir sicher das da schon lange vor mir jemand diese Idee hatte und getestet hat.)

Danke und Gruß
bob
Er soll an den Spielen teilnehmen bis er spielend stirbt. MCP - TRON

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group