Mesh Terrain

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

Archangel

Betreff: Mesh Terrain

BeitragMi, Nov 25, 2009 17:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Dieses Thema wurde oft angesprochen aber nie wirklich gelöst (meiner Meinung nach) ^^

WIE ERSTELLT MAN SOETWAS?? Ich weiß bis jetzt nur, dass es soetwas gibt und das der große Vorteil gegenüber einem BlitzTerrain (Was ich derzeit nutze) darin besteht, mehr als eine Einheitstextur zu besitzen!

Aber wie schon gesagt, wie man soetwas macht .. k.A.
In der Hilfe habe ich nichts passendes gefunden Sad

Gruß

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMi, Nov 25, 2009 17:58
Antworten mit Zitat
Benutzer-Profile anzeigen
... Sorry ... Falschen Link gepostet... ich suche mal kurz weiter
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
  • Zuletzt bearbeitet von hectic am Mi, Nov 25, 2009 18:01, insgesamt 2-mal bearbeitet

Archangel

BeitragMi, Nov 25, 2009 18:00
Antworten mit Zitat
Benutzer-Profile anzeigen
ok, danke =))

Falls noch fragen auftreten werden, werde ich mich per PN mal kurz an dich melden!

Gruß Archangel

SYSThern

BeitragMi, Nov 25, 2009 18:30
Antworten mit Zitat
Benutzer-Profile anzeigen
möchtest du ein simples mesh terrain oder geht es dir um die verschiedenen texturen?

mfg SYSThern
Tools and Programms
--------------------
www.systhern.de

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMi, Nov 25, 2009 18:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Sorry, ich hatte zuerst einen falschen Link gepostet. Embarassed

Ich packe mal den Code hier rein, da ich noch ein paar Änderungen vorgenommen hatte:

Code: [AUSKLAPPEN]
;PUBLIC/DOMAIN
;CODE/BY/HECTIC
Graphics3D 800,600,0,2
SetBuffer BackBuffer()

Local Timer=CreateTimer(100)
Global Camera=CreateCamera()
MoveEntity Camera,0,15,30
EntityRadius Camera,1
EntityType Camera,1

CameraFogMode Camera,True
CameraFogRange Camera,0,150
CameraFogColor Camera,50,60,70
CameraClsColor Camera,50,60,70

TerrainLoad(32,"highmap_.png","colormap_.png","struktur.png")




While Not KeyHit(1)
   x=x-MouseXSpeed()
   y=y+MouseYSpeed()
   MoveMouse 400,300
   RotateEntity Camera,y,x,0
   If MouseDown(1) Then MoveEntity Camera,0,0,-.05
   If MouseDown(2) Then MoveEntity Camera,0,0,+.05
   If KeyDown(30) Then TranslateEntity Camera,0,+.25,0 Else TranslateEntity Camera,0,-.025,0
   
   UpdateWorld
   RenderWorld
   
   Text 20,20,TrisRendered()+" triangles rendered"
   
   WaitTimer Timer
   Flip 0
Wend
End




Function TerrainLoad(FTile#=32,FHMap$,FCMap$,FDMap$)
   Local HMap%=LoadTexture(FHMap,1+256) ;Highmap
   Local CMap%=LoadTexture(FCMap,1+256) ;Colormap
   Local DMap%=LoadTexture(FDMap,2+256) ;Detailmap
   ScaleTexture DMap,1.0/16.0,1.0/16.0
   If TextureWidth(HMap)<>TextureHeight(HMap) Then RuntimeError "Heighmap hat ungleiche Größe"
   If TextureWidth(CMap)<>TextureHeight(CMap) Then RuntimeError "Colorhmap hat ungleiche Größe"
   If TextureWidth(HMap)<FTile Then RuntimeError "Heighmap ist kleiner als Anzahl Tiles"
   Local H#=TextureWidth(HMap)/FTile
   Local C#=TextureWidth(CMap)/FTile
   Local IX2#,IY2#,IZ2#
   Local IX1#,IZ1#
   
   For IZ1=0 To H-1
      For IX1=0 To H-1
         
         Local mesh=CreateMesh()
         Local face=CreateSurface(mesh)
         
         For IZ2=0 To H-1
            For IX2=0 To H-1
               Rect 20+IX2*20,20+IZ2*20,21,21,0
            Next
         Next
         
         Rect 20+IX1*20,20+IZ1*20,21,21,1
         Flip 0:Cls
         
         LockBuffer TextureBuffer(HMap)
         
         For IZ2=0 To FTile
            For IX2=0 To FTile
               IY2=2*(ReadPixel(IX2+IX1*FTile,FTile+IZ1*FTile-IZ2,TextureBuffer(HMap)) And $FF0000)/$10000
               AddVertex(face,IX2,IY2/(128/H),-IZ2, IX1/H+IX2/FTile/H,IZ1/H+1/H-IZ2/FTile/H,0)
            Next
         Next
         
         UnlockBuffer TextureBuffer(HMap)
         
         For IZ2=0 To FTile-1
            For IX2=0 To FTile-1
               AddTriangle(face,IX2+IZ2*(FTile+1),IX2+1+IZ2*(FTile+1),IX2+1+(IZ2+1)*(FTile+1))
               AddTriangle(face,IX2+1+(IZ2+1)*(FTile+1),IX2+(IZ2+1)*(FTile+1),IX2+IZ2*(FTile+1))
            Next
         Next
         
         MoveEntity mesh,-(FTile*H/2)+IX1*FTile,0,FTile-(FTile*H/2)+IZ1*FTile
         EntityAutoFade mesh,100,200
         EntityTexture mesh,CMap,0,0
         EntityTexture mesh,DMap,0,1
         TextureBlend DMap,2
         UpdateNormals mesh
         EntityType mesh,2
         EntityFX mesh,1
         Collisions 1,2,2,2
      Next
   Next
   
End Function
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

Krischan

BeitragMi, Nov 25, 2009 18:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Mein BlitzTiles z.B. ist ein reines Meshterrain (aus mehreren Einzelterrains zusammengefügt), allerdings ein sehr fortgeschrittenes. Aber sowas geht z.B. in B3D - und noch mehr.

Ich habe bestimmt irgendwo in meinem Archiv auch noch einfachere Beispiele liegen, wenn Du selbst herumbauen magst. Hab ja auch mal damit angefangen... Embarassed

Archangel

BeitragMi, Nov 25, 2009 19:09
Antworten mit Zitat
Benutzer-Profile anzeigen
@systhern:
ich will ein Terrain erstellen können, ungefähr so wie das aus Age of Empires 3, allerdings will ich als "Kameramann" dann durch die Map latschen könne und nicht dise isomethrische sicht .. aber das ist auch ein anderes thema, .. mir geht es um flüssige übergänge und verschidene texturen

@Krischan:
werde mich da mal in deinen Editor reinarbeiten =)

@ Hectic:
danke für den Code Wink Exclamation

thx @ all

SYSThern

BeitragMi, Nov 25, 2009 23:25
Antworten mit Zitat
Benutzer-Profile anzeigen
ich kann dir diese editoren empfehlen

http://www.blitzbasic.com/tool....php?cat=7
Tools and Programms
--------------------
www.systhern.de
 

Krischan

BeitragFr, Nov 27, 2009 12:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab zwar AOE3 nie gespielt, aber Screenshots zufolge benötigst Du nur evt. ein Meshterrain mit Texture Splatting. In B3D geht das so: man nimmt eine Heightmap und erstellt daraus ein Mesh und versieht dieses mit der Colormap. Pro Textur (z.B. Gras, Fels, Schnee) braucht man jetzt noch eine Kopie des Meshes, allerdings nur die Triangles die zur Alphamap des Texturlayers passen. Die Alphawerte der Vertices entsprechen dabei den Grauwerten der Alphamap (schwarz = 100% transparent, weiss = 100% Deckung). Der Trick dabei ist, dass das Basismesh nur FX2 und die Alphameshes FX2+32 bekommen.

Ist zwar keine besonders perfekte Lösung, zeigt aber wie man es machen kann (in meiner Demo klappt das nur weil ich die Alphaübergänge sehr weich gestaltet habe, für härtere Kanten müsste man jeweils die anliegenden Vertices direkt weich überblenden).

Mit Taste 1-4 kann man das Basismesh und die Schnee/Fels/Gras Layer ein/ausblenden. Space = Wireframe, Steuerung über Maus / Pfeiltasten.

Screenshot
user posted image

Download Source+Media:
http://www.christianhart.de/bb...atting.zip

Code: [AUSKLAPPEN]
Graphics3D 800,600,32,2


Global sl1=1         ; Basislayer immer an
Global sl2=1         ; Schneelayer aus
Global sl3=1         ; Felslayer aus
Global sl4=1         ; Graslayer aus
Global PlayerSpeed#=10   ; Spielergeschwindigkeit


; Frametween (immer gleiche Geschwindigkeit, hardwareunabhängig)
Global GameSpeed%=60
Global Screenwidth%=GraphicsWidth()
Global Screenheight%=GraphicsHeight()
Global FramePeriod%=1000/GameSpeed
Global FrameTime%=MilliSecs()-FramePeriod


; Steuerungsvariablen
Global Camera,SpeedMultiplicator%,DeltaTimeOld


; Kamera
Camera=CreateCamera()
PositionEntity Camera,0,1000,0
CameraZoom Camera,1
CameraRange Camera,1,10000
CameraFogMode Camera,True
CameraFogRange Camera,2500,7500
CameraFogColor Camera,155,174,206
CameraClsColor Camera,155,174,206


; Licht
Licht=CreateLight(2)
PositionEntity Licht,10000,10000,10000
LightRange Licht,20000
AmbientLight 64,64,64


; einzelne Terrainteile laden
TERRAIN1=LoadMeshTerrain(128,16.0,128,128,128,1.0,"maps/heightmap.png","maps/colormap.png",False,False)      ; Basislayer
TERRAIN2=LoadMeshTerrain(128,16.0,255,255,255,1.0,"maps/heightmap.png",False,False,"maps/alpha_schnee.png")   ; Alphalayer Schnee
TERRAIN3=LoadMeshTerrain(128,16.0,255,255,255,1.0,"maps/heightmap.png",False,False,"maps/alpha_fels.png")   ; Alphalayer Fels
TERRAIN4=LoadMeshTerrain(128,16.0,255,255,255,1.0,"maps/heightmap.png",False,False,"maps/alpha_gras.png")   ; Alphalayer Gras

; Terrainteile skalieren
FitMesh TERRAIN1,-5000,0.00000,-5000,10000,1500,10000
FitMesh TERRAIN2,-5000,0.00001,-5000,10000,1500,10000
FitMesh TERRAIN3,-5000,0.00002,-5000,10000,1500,10000
FitMesh TERRAIN4,-5000,0.00003,-5000,10000,1500,10000

; FX
EntityFX TERRAIN1,2         ; 1. Layer nur FX 2, WICHTIG! Ohne Basislayer gibt es seltsame Alphaeffekte!
EntityFX TERRAIN2,2+32      ; alle weiteren Layer FX 2+32 für Transparenz
EntityFX TERRAIN3,2+32
EntityFX TERRAIN4,2+32


; Detailtextur laden
detail=LoadTexture("texturen/detail.jpg")
TextureBlend detail,5
ScaleTexture detail,1.0/256.0,1.0/256.0
EntityTexture TERRAIN1,detail


; Schneetextur laden
schnee=LoadTexture("texturen/schnee.jpg")
TextureBlend schnee,5
ScaleTexture schnee,1.0/16.0,1.0/16.0
EntityTexture TERRAIN2,schnee


; Felstextur laden
fels=LoadTexture("texturen/fels.jpg")
TextureBlend fels,5
ScaleTexture fels,1.0/16.0,1.0/16.0
EntityTexture TERRAIN3,fels


; Grastextur laden
gras=LoadTexture("texturen/gras.jpg")
TextureBlend gras,5
ScaleTexture gras,1.0/32.0,1.0/32.0
EntityTexture TERRAIN4,gras


; bisschen Wasser dazu
wasser=CreatePlane()
PositionEntity wasser,0,250,0
EntityColor wasser,0,0,128
EntityBlend wasser,3
EntityFX wasser,1+8


; Mauszeiger in die Mitte
MoveMouse GraphicsWidth()/2,GraphicsHeight()/2


; checken welche Layer gezeigt werden sollen
If sl1=1 Then ShowEntity TERRAIN1 Else HideEntity TERRAIN1
If sl2=1 Then ShowEntity TERRAIN2 Else HideEntity TERRAIN2
If sl3=1 Then ShowEntity TERRAIN3 Else HideEntity TERRAIN3
If sl4=1 Then ShowEntity TERRAIN4 Else HideEntity TERRAIN4


; Hauptschleife
While Not KeyHit(1)
   
   Cls
   
   ; Frametween Berechnungen
   Local FrameElapsed%,FrameTicks%,FrameTween#,t%
   Repeat FrameElapsed=MilliSecs()-FrameTime Until FrameElapsed
   FrameTicks=FrameElapsed/FramePeriod
   FrameTween=Float(FrameElapsed Mod FramePeriod)/Float(FramePeriod)
   
   
   ; Frametween Schleife
   For t=1 To FrameTicks
      
      ; Frametween Captureworld
      FrameTime=FrameTime+FramePeriod : If t=FrameTicks Then CaptureWorld
   
      ; Taste 1-4 = Texturayer an/aus
      If KeyHit(2) Then sl1=1-sl1 : If sl1=1 Then ShowEntity TERRAIN1 Else HideEntity TERRAIN1
      If KeyHit(3) Then sl2=1-sl2 : If sl2=1 Then ShowEntity TERRAIN2 Else HideEntity TERRAIN2
      If KeyHit(4) Then sl3=1-sl3 : If sl3=1 Then ShowEntity TERRAIN3 Else HideEntity TERRAIN3
      If KeyHit(5) Then sl4=1-sl4 : If sl4=1 Then ShowEntity TERRAIN4 Else HideEntity TERRAIN4
   
      ; Space = Wireframe an/aus
      If KeyHit(57) Then wf=1-wf : WireFrame wf
   
      ; Maussteuerung
      FreeCam()
      
      UpdateWorld
      
   Next
   
   
   ; Frametween Render
   RenderWorld FrameTween
   
   
   ; Bufferflip
   Flip 0
   
   
Wend


End


; Freecam Steuerung
Function FreeCam()
   
   Local movex#,movez#,dx#,dy#,dk#,dt%,s#,t%
   Local movespeed#,pitch#
   Local up%=0
   
   ShowPointer()
   
   SpeedMultiplicator=1
   
   ; Linke/Rechte Maustaste = Aufwärts / 2 schneller
   If MouseDown(1) Then up=1
   If MouseDown(2) Then SpeedMultiplicator=2
   
   ; Pfeiltasten = Move
   movex=KeyDown(205)-KeyDown(203)
   movez=KeyDown(200)-KeyDown(208)
   
   movespeed=PlayerSpeed*SpeedMultiplicator
   
   ; weiche Bewegung
   t=MilliSecs()
   dt=t-DeltaTimeOld
   DeltaTimeOld=t
   dk=Float(dt)/16.666
   s=0.1*dk
   dx=(Screenwidth/2-MouseX())*0.01*dk
   dy=(Screenheight/2-MouseY())*0.01*dk
   TurnEntity Camera,-dy,dx*s*8,0
   
   ; Pitchbegrenzung
   pitch=EntityPitch(Camera,1) : If pitch>85 Then pitch=85 Else If pitch<-85 Then pitch=-85
   
   ; drehen und bewegen
   RotateEntity Camera,pitch,EntityYaw(Camera,1),0,1   
   MoveEntity Camera,movex*movespeed,up*movespeed,movez*movespeed
   
End Function


; Meshterrain einlesen
Function LoadMeshTerrain(size%=128,height#=16.0,r1%=0,g1%=0,b1%=0,a1#=0.5,heightmap$,colormap$="",lightmap$="",alphamap$="")
   
   Local h#,lx%,ly%,xx%,yy%,index%,min%,max%,div#
   Local nx#,ny#,nz#,v0%,v1%,v2%,v3%,v4%,v5%,n#
   
   Local r%,g%,b%,a#
   
   Local hmap%,cmap%,lmap%,amap%
   Local hbuf%,cbuf%,lbuf%,abuf%
   Local mesh%,surf%
   
   xx=size-1
   yy=size-1
   
   ; Bilder einlesen
   hmap = LoadImage(heightmap)
   cmap = LoadImage(colormap)
   lmap = LoadImage(lightmap)
   amap = LoadImage(alphamap)
   
   If hmap Then hbuf = ImageBuffer(hmap) : LockBuffer hbuf
   If cmap Then cbuf = ImageBuffer(cmap) : LockBuffer cbuf
   If lmap Then lbuf = ImageBuffer(lmap) : LockBuffer lbuf
   If amap Then abuf = ImageBuffer(amap) : LockBuffer abuf
   
   ; Mesh erstellen
   mesh = CreateMesh()
   surf = CreateSurface(mesh)
   
   ; Bilder auslesen
   For ly = 0 To yy
      For lx = 0 To xx
         
         ; Höhe auslesen
         h=(ReadPixelFast(lx,yy-ly,ImageBuffer(hmap)) And $ff0000)/$10000
         
         ; Höhe normalisieren
         h=Normalisieren(h,0.0,255.0,0.0,height#)
         
         ; Vertexindex berechnen
         index = lx + ((xx+1)*ly)
         
         ; Vertex erstellen, Texturkoordinaten berechnen
         AddVertex surf,lx,0,ly,1.0/lx,1.0/ly
         VertexCoords surf,index,VertexX(surf,index),h,VertexZ(surf,index)
         VertexTexCoords surf,index,(lx/(xx*1.0))+(1-1),((yy-ly)/(yy*1.0))+(1-1)
         
         ; Standardfarben und Alphawert festsetzen
         r=r1
         g=g1
         b=b1
         a=a1
         
         ; Alphamap vorhanden? Dann diesen Alphawert nehmen
         If abuf Then
            a=(ReadPixelFast(lx,yy-ly,abuf) And $ff0000)/$10000
            a=Normalisieren(a,0.0,255.0,0.0,0.5)
         EndIf
         
         ; Farbe und Alpha hinzufügen, Vertex einfärben
         If cbuf Then r=(ReadPixelFast(lx,yy-ly,cbuf) And $ff0000)/$10000
         If cbuf Then g=(ReadPixelFast(lx,yy-ly,cbuf) And $ff00)/$100
         If cbuf Then b=(ReadPixelFast(lx,yy-ly,cbuf) And $ff)
         VertexColor surf,index,r,g,b,a
            
         ; Vertices zu Dreiecken verbinden
         If ly<yy And lx<xx And a>0 Then   
            
            v0=lx+((xx+1)*ly)
            v1=lx+((xx+1)*ly)+(xx+1)
            v2=(lx+1)+((xx+1)*ly)
            v3=(lx+1)+((xx+1)*ly)
            v4=lx+((xx+1)*ly)+(xx+1)
            v5=(lx+1)+((xx+1)*ly)+(xx+1)
            
            AddTriangle surf,v0,v1,v2
            AddTriangle surf,v3,v4,v5
            
         EndIf
         
      Next
   Next
   
   ; Buffer entsperren
   If hbuf Then UnlockBuffer hbuf
   If cbuf Then UnlockBuffer cbuf
   If lbuf Then UnlockBuffer lbuf
   If abuf Then UnlockBuffer abuf
   
   ; Normals aktualisieren
   UpdateNormals mesh
   
   Return mesh
   
End Function


; Normalisiert einen Wert
Function Normalisieren#(value#=128.0,value_min#=0.0,value_max#=255.0,norm_min#=0.0,norm_max#=1.0)
   
   Return ((value-value_min)/(value_max-value_min))*(norm_max-norm_min)+norm_min
   
End Function

ozzi789

BeitragFr, Nov 27, 2009 13:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Den Code würd ich im Codearchiv posten Smile
Ist echt zu gebrauchen!
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5
 

Krischan

BeitragSo, Nov 29, 2009 13:22
Antworten mit Zitat
Benutzer-Profile anzeigen
ozzi789 hat Folgendes geschrieben:
Den Code würd ich im Codearchiv posten Smile

Nee, dazu ist es viel zu unausgereift. Ich habe die Demo noch einmal dahingehend erweitert, dass man auch "scharfe" Texturübergänge hat, allerdings bin ich gar nicht glücklich mit der Lösung, da jeder Layer die volle (!) Anzahl Tris/Verts hat, auch wenn ein Großteil davon nicht sichtbar ist (Vertex Alphawert=0 wird trotzdem mitgerendert) - und das geht böse auf die FPS.

Ich verstehe auch nicht vollständig, wie man so richtig schöne Übergänge hinbekommt, vor allem bei Strassen - die muss man wohl anders über das Terrain "kleben", also nicht die Matrix des Terrains benutzen. Ausserdem scheint die Reihenfolge des Einzeichnens wichtig zu sein, siehe in der Demo der Effekt bei Taste 5, der verschwindet plötzlich was von einem anderen Mesh mit... *haarerauf* Evil or Very Mad

user posted image

Download: http://www.christianhart.de/bb...tting2.zip

ozzi789

BeitragSo, Nov 29, 2009 13:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Ahso, alles wird mitgerendert.. und das zwar ein paar mal ^^
hmm mal überlegen wie man den Effekt weg bringt..
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5
 

Krischan

BeitragMo, Nov 30, 2009 16:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe noch ein daran herumgespielt, wen es interessiert:

user posted image

http://www.christianhart.de/bb...tting3.zip

Zu den überflüssigen Vertices: man müsste das Mesh dahingehend scannen, welche Triangles nur aus Alphawert=0 Vertices bestehen und -wichtig - dass keines dieser Vertices von einem anderen Triangle mitverwendet wird, bei dem auch nur ein einziger Alphawert>0 ist, am Besten gleich bei der Erstellung, also alle überflüssigen einfach weglassen.

Bin dabei aber auf noch keinen grünen Zweig gekommen.
 

Krischan

BeitragMo, Nov 30, 2009 19:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Heureka! (ich laufe jetzt aber nicht nackt durch die Strassen). Hier die (finale?) Variante, die die Triangles von 161.290 auf 59.059 reduziert hat, also um 63%). Ich habe ein Type eingeführt, in dem die Vertices der zu zeichnenden Triangles zunächst gespeichert werden und in einem Blitzarray werden parallel dazu alle Alphawerte der gesetzten Vertices abgelegt. Im nächsten Durchlauf werden die zusammenaddierten Triangles-Vertices-Alphawerte zum Field alpha hinzugefügt. Zuletzt werden die Triangles gezeichnet, die alpha>0 sind, der Rest wird ignoriert weil volldurchsichtig.

Und es funktioniert:

user posted image

http://www.christianhart.de/bb...tting4.zip

ozzi789

BeitragMo, Nov 30, 2009 19:32
Antworten mit Zitat
Benutzer-Profile anzeigen
EPIC WIN
mehr gibts da nicht zu sagen Cool
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5

Archangel

BeitragDi, Dez 01, 2009 15:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, das finde ich auch =)

Danke an dich Krischan *zwinker* ^^

FET - Editor bringt immer eine MAV wenn ich auf "File" klicken will!

Der Code von Krischan sind aber auf den zwiten Blick garnimmmer so kompliziert aus wie am Anfang =)

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group