Mal wieder Terrain...
Übersicht

LaiKiamBetreff: Mal wieder Terrain... |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() 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... ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
@ 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
@ 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() @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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
@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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
@ 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Zitat: ...bleibt nur noch die Frage, ob B3D ordentlich den Speicher aufräumt, wenn laufend das Terrain ausgetauscht wird.
Ja, tut es, ich Dummi ![]() Vielen Dank für Eure Meinungen, ich hab jetzt was zu coden ![]() cee all LaiKiam |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Solange du nicht versuchst die 32k bmp zu laden und in Blitz zu unterteilen ist alles ok ![]() ![]() |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
LaiKiam |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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): ![]() 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 ![]() LaiKiam |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hmm, warum kriege ich immer ein gar nicht ![]() Noch jemand vllt eine Idee? |
||
![]() |
5k41 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
LaiKiam hat Folgendes geschrieben: Hmm, warum kriege ich immer ein gar nicht
![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
@ 5k41 : Super, EntityFX war der gesuchte Befehl, damit kann man das Fogging auf der Skybox deaktivieren ![]() @ 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group