Mesh Terrain
Übersicht

![]() |
ArchangelBetreff: Mesh Terrain |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() Gruß |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
... 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
ok, danke =))
Falls noch fragen auftreten werden, werde ich mich per PN mal kurz an dich melden! Gruß Archangel |
||
![]() |
SYSThern |
![]() Antworten mit Zitat ![]() |
---|---|---|
möchtest du ein simples mesh terrain oder geht es dir um die verschiedenen texturen?
mfg SYSThern |
||
Tools and Programms
-------------------- www.systhern.de |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Sorry, ich hatte zuerst einen falschen Link gepostet. ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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... ![]() |
||
![]() |
Archangel |
![]() Antworten mit Zitat ![]() |
---|---|---|
@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 ![]() ![]() thx @ all |
||
![]() |
SYSThern |
![]() Antworten mit Zitat ![]() |
---|---|---|
ich kann dir diese editoren empfehlen
http://www.blitzbasic.com/tool....php?cat=7 |
||
Tools and Programms
-------------------- www.systhern.de |
Krischan |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Den Code würd ich im Codearchiv posten ![]() Ist echt zu gebrauchen! |
||
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5 |
Krischan |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
ozzi789 hat Folgendes geschrieben: Den Code würd ich im Codearchiv posten
![]() 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* ![]() ![]() Download: http://www.christianhart.de/bb...tting2.zip |
||
![]() |
ozzi789 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich habe noch ein daran herumgespielt, wen es interessiert:
![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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: ![]() http://www.christianhart.de/bb...tting4.zip |
||
![]() |
ozzi789 |
![]() Antworten mit Zitat ![]() |
---|---|---|
EPIC WIN
mehr gibts da nicht zu sagen ![]() |
||
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5 |
![]() |
Archangel |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 =) |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group