Heightmap als Meshterrain

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

N0X

Betreff: Heightmap als Meshterrain

BeitragDi, Jul 06, 2010 11:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey!
Ich habe eine Heightmap in ein Meshtterrain übergeben und möchte jetzt aber noch zwei andere Texturlayer mit in das Meshterrain legen.
Wie mache ich das?
(Beispiel texture_splatting von Krischan)

Habe es mit 3 Returns hintereinander versucht, erfolglos...

Code: [AUSKLAPPEN]
mesh = TLoadMesh("maps\file001.TMF",0,0,0,1,1,1)

Function TLoadMesh(mesh$,x_pos,y_pos,z_pos,x_size,y_size,z_size)
   file = ReadFile(mesh$)
      hm_dir$     = ReadLine(file)
      lm_dir$     = ReadLine(file)
      cm_dir$     = ReadLine(file)
      am1_dir$    = ReadLine(file)
      am2_dir$    = ReadLine(file)
      am3_dir$    = ReadLine(file)
      tex1_dir$   = ReadLine(file)
      tex2_dir$   = ReadLine(file)
      tex3_dir$   = ReadLine(file)
      detail_dir$ = ReadLine(file)

      ;-------------------------|
      hm = LoadImage(hm_dir$):MaskImage hm,255,0,255
      lm = LoadImage(lm_dir$)
      cm = LoadImage(cm_dir$)
      alpha_snow=LoadImage(am1_dir$)
      alpha_rock=LoadImage(am2_dir$)
      alpha_grass=LoadImage(am3_dir$)
      
      Terrain1=LoadMeshTerrain(hm,16,cm   ,1.0,alpha_grass,False,False,False,True)    : EntityFX Terrain1,2
      Terrain2=LoadMeshTerrain(hm,16,lm   ,1.0,alpha_rock)                     : EntityFX Terrain2,2+32
      Terrain3=LoadMeshTerrain(hm,16,False,0.0,alpha_snow ,255,255,255)            : EntityFX Terrain3,2+32
      
      PositionEntity Terrain1,x_pos,y_pos,z_pos
      PositionEntity Terrain2,x_pos,y_pos,z_pos
      PositionEntity Terrain3,x_pos,y_pos,z_pos
      
      ScaleEntity Terrain1,x_size,y_size,z_size
      ScaleEntity Terrain2,x_size,y_size,z_size
      ScaleEntity Terrain3,x_size,y_size,z_size
      
      EntityType Terrain1,MAP
      EntityType Terrain2,MAP
      EntityType Terrain3,MAP
      
      tex1=MyLoadTexture(tex1_dir$  ,0,2.0/ 32,1.0/ 32,5,Terrain1)
      tex2=MyLoadTexture(tex2_dir$   ,0,1.0/ 32,1.0/ 32,2,Terrain2)
      tex3=MyLoadTexture(tex3_dir$   ,0,1.0/ 16,1.0/ 16,2,Terrain3)
      
      detail=MyLoadTexture(detail_dir$ ,0,1.0/ 64,1.0/ 64,5)
      EntityTexture Terrain1,detail,0,2
      EntityTexture Terrain2,detail,0,2
      EntityTexture Terrain3,detail,0,2
   CloseFile(file)
   
   Return Terrain1
   Return Terrain2
   Return Terrain3
End Function

Function MyLoadTexture(filename$,flags%,uscale#=1.0,vscale#=1.0,blendmode%=False,entity%=False,layer%=0,frame%=0)
   Local tex%=LoadTexture(filename$,flags)
   ScaleTexture tex,uscale,vscale
   If blendmode Then TextureBlend tex,blendmode
   If entity Then EntityTexture entity,tex,frame,layer
   
   Return tex
End Function


Mfg,
N0X
Confused
Projekte: |Tibario| http://www.blitzforum.de/worklogs/325/ | 5%

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDi, Jul 06, 2010 13:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Geiler Versuch mit:
Code: [AUSKLAPPEN]
Return Terrain1
Return Terrain2
Return Terrain3
Laughing

Ich hab mal ein Meshterrain gemacht. Dieses erstellt entsprechend große nahtlose Blöcke mit 2 Texturlayern. Die erste Textur ist die Highmap selbst, dann folge eine über das ganze Terrain gezogene Colormap, und zuletzt eine Detailmap die in diesem Beispiel hardcoded auf 1/16 gestellt ist.

Der erste Parameter gibt an, wie viele Quads^2 pro Block in gebraucht genommen werden.

Die Funktion selbst ist nur ein Versuch von mir gewesen. Sie gibt kein Handle zurück mit welcher man das Terrain zum Beispiel wieder löschen könnte. Im Grunde kein Problem, da es ausreichen würde eine Bank zurück zu geben wo die ganzen Werte drin stehen.
Code: [AUSKLAPPEN]
;PUBLIC/DOMAIN
;CODE/BY/HECTIC
Graphics3D 800,600,0,2
SetBuffer BackBuffer()

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

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

TerrainLoad(32,"Data\highmap.png","Data\colormap.png","Data\Texture\004.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,-.5
   If MouseDown(2) Then MoveEntity Camera,0,0,+.5
   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,280,280
         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

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group