Verschiedene Tiles auf Terrain... [OK]

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

 

onkelz89

Betreff: Verschiedene Tiles auf Terrain... [OK]

BeitragDi, Dez 09, 2008 17:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

habe mich en wenig mit dieser Demo beschäftigt: Blitz 3D Samples\birdie\Brush Tiles

Das sieht soweit gut aus. Allerdings wird ja kein Blitzeigenes Terrain benutzt, sondern eines aus mehreren Meshes "zusammengesetzt". Gibt es eine Möglichkeit dies mit Blitz Terrain zu nutzen?

MfG
  • Zuletzt bearbeitet von onkelz89 am Fr, Dez 19, 2008 8:08, insgesamt einmal bearbeitet

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDi, Dez 09, 2008 20:34
Antworten mit Zitat
Benutzer-Profile anzeigen
So richtig abgrenzende Tiles nicht. Ich kann mir dieses auch nur schlecht bei einem LOD-System vorstellen, wie es aussehen sollte. Ansonsten - keine Ahnung ob es in der Blitz3D-Demo auch dabei ist - siehe mal das Insaner-Beispiel an. Da wird zumindest so etwas ähnliches gemacht.

Und im übrigen habe ich mal ein Code zu einem Meshterrain hier irgendwo mal gepostet. Dieser erstellt automatisch nachtlose Terrainblöche. Bei Terrains kleiner oder gleich 256x256 ist dieses sogar schneller als das LOD-Blitz3D-Terrain. Bereits bei 512x512 etwas langsamer und bei 1024x1024 ist ein Meshterrain ohne ausblenden weit entfernter Terrainblöcke nicht mehr zu gebrauchen.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

onkelz89

BeitragDo, Dez 18, 2008 8:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Hat ein wenig gedauert bis es jetzt so ist wie ich es möchte aber geht!! Very Happy

Vielen Dank !!!

EDIT:

habe jetzt nur folgenden "Grafikfehler"

user posted image

weiß Jemand wie man das weg bekommt?
Das Wasser ist eigentliche ein Cube...

Angelo

BeitragDo, Dez 18, 2008 10:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Sieht für mich wie ein Kamerafehler aus.
stelle mal CAMERARANGE Kamera, 0.1, 5000<die endmarke kannst du einstellen wie du willst.
Meist hängt das an der Rendertiefe, da Polygone nicht eingezeichnet werden
obwohl sie noch sichtbar sein sollten.
Alles was ich sagen kann, können auch andere ^^
 

onkelz89

BeitragDo, Dez 18, 2008 13:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]

CameraRange cam,.1,900


Habe ich schon... ist es leider nicht Sad

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDo, Dez 18, 2008 14:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Ohne Code nix los. Wenn du uns mal den besagten Code zukommen lässt, kann man dir auch gleich viel besser helfen. Denn für mich sehen die Bilder so aus, als würden selbst an extremen Schrägen noch Fehler auftauchen. Das kann ich mir irgendwie nicht so richtig vorstellen, wie so etwas passieren kann.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

onkelz89

BeitragDo, Dez 18, 2008 16:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Okay, hier die wichtigen Codeteile:

Code: [AUSKLAPPEN]


Dim tex(tiles)            
Load_Textures()

Type Map
 Field y#      
 Field brush      
End Type

Global ident=0
Dim map.Map(GridX,GridZ)   

;0 = Brush
;1 = High
Dim Planet#(SizeX,SizeZ,1)

For x=0 To SizeX
For z=0 To SizeZ

Planet(x,z,0)=Rand(tiles-4)+3
Planet(x,z,1)=Float(120+Rand(50))/255

Next
Next


water=CreateCube()
ScaleEntity water,250,.1,250
EntityColor water,0,120,220

Const world_scale=80;160
Global world_koord_x=1;*160 in diesem Fall
Global world_koord_z=1

PositionEntity cam,world_koord_x*world_scale+200,180,world_koord_z*world_scale+200

Welt.Welt = New Welt

Create_MapLayout();später world_koord_x & z
Welt\level=Create_Map()
ident=ident+1
ScaleMesh Welt\level,80,240,80
PositionEntity Welt\level,(world_koord_x)*world_scale,0,(world_koord_z)*world_scale
EntityType Welt\level,2



timer=CreateTimer(60)
While Not KeyDown(1)

mxs#=-MouseXSpeed()
mys#=MouseYSpeed()
If mxs#<>0 Then RotateEntity cam2,EntityPitch(cam2),EntityYaw(cam2)+mxs#,EntityRoll(cam2):RotateEntity cam,EntityPitch(cam),EntityYaw(cam)+mxs#,EntityRoll(cam)
   If mys#<>0 Then
      If mys#>0 Then
         If EntityPitch(cam)+mys#>70
            mys#=70-EntityPitch(cam)
         EndIf
     RotateEntity cam,EntityPitch(cam)+mys#,EntityYaw(cam),EntityRoll(cam)
   ElseIf mys#<0 Then
      If EntityPitch(cam)+mys#<-70
         mys#=-70-EntityPitch(cam)
      EndIf
   RotateEntity cam,EntityPitch(cam)+mys#,EntityYaw(cam),EntityRoll(cam)
   EndIf
EndIf
MoveMouse 320,240
If KeyDown(29) Then speed#=10 Else speed#=2   
If KeyDown( 30 ) Then speed1#=-speed# Else speed1#=0
If KeyDown( 31 ) Then speed4#=-speed# Else speed4#=0
If KeyDown( 32 ) Then speed3#=speed# Else speed3#=0
If KeyDown( 17 ) Then speed2#=speed# Else speed2#=0
   
MoveEntity cam,speed1#,0,speed2#
MoveEntity cam,speed3#,0,speed4#



PositionEntity water,EntityX(cam),130,EntityZ(cam)

   UpdateWorld
   RenderWorld
   
   Color 0,0,0
   Rect 0,0,100,90
   
   Color 255,255,255
   Text 0,10,FPS()+" FPS "
    Text 0,30,AvailVidMem()/1048576+"/"+TotalVidMem()/1048576+" MB"
   Text 0,50,"X: "+world_koord_x+" / Z: "+world_koord_z



   WaitTimer(timer)
   Flip
Wend



Function Create_Map()
   mesh=CreateMesh()
   u#=0
   v#=0
   stp#=1.0/Float(GridX)
   For z#=0 To GridZ
      u=0
      For x#=0 To GridX
      
         h1#=Planet(x+world_koord_x  ,z+world_koord_z  ,1)   ;top left height
         h2#=Planet(x+world_koord_x+1,z+world_koord_z  ,1)   ;top Right height
         h3#=Planet(x+world_koord_x+1,z+world_koord_z+1,1)   ;bot right height
         h4#=Planet(x+world_koord_x  ,z+world_koord_z+1,1)   ;bot left height
         
         br=map(x,z)\brush      ;this brush contains both tiles + mask + lightmap
         surf=FindSurface( mesh,br )            ;Find a surface in the mesh that contains the same brush
         If surf=0 surf=CreateSurface(mesh,br)    ;If it can't find one create a new surface
         cnt=CountVertices( surf )            ;Get count of vertices

         ;Add vertices including tile coords
         AddVertex surf,x,h1,z,0,0
         AddVertex surf,x+1.0,h2,z,1,0
         AddVertex surf,x+1.0,h3,z+1.0,1,1
         AddVertex surf,x,h4,z+1.0,0,1
         ;Add second set of tex coords to fit grid
         VertexTexCoords surf,cnt,u,v,0,1
         VertexTexCoords surf,cnt+1,u+stp,v,0,1
         VertexTexCoords surf,cnt+2,u+stp,v+stp,0,1
         VertexTexCoords surf,cnt+3,u,v+stp,0,1
         ;Finally add the two triangles
         AddTriangle surf,cnt,cnt+2,cnt+1
         AddTriangle surf,cnt,cnt+3,cnt+2
         u=u+stp
      Next
      v=v+stp
   Next
   Return mesh
End Function

Function Load_Textures()
   For a=0 To tiles-1
      b$="Tex/tex"+a+".bmp"
      tex(a+1)=LoadTexture(b$)
   Next
   Tile_mask=LoadTexture("mask.bmp")
   TextureCoords Tile_mask,1
   TextureBlend Tile_mask,3
End Function

Function Create_MapLayout()
   ;Cls
   ;DrawImage hmap,0,0
   For z=0 To GridZ
      For x=0 To GridX
         Map.Map(x,z) = New Map
         map(x,z)\brush=CreateBrush()

         save=Planet(world_koord_x+x,world_koord_z+z,0)
         
         BrushTexture map(x,z)\brush,tex(save),0,0   ;Bottom Tile
         If z=wahlz And x=wahlx Then   BrushTexture map(x,z)\brush,tex(2),0,2      ;Top Tile
         ;BrushTexture map(x,z)\brush,tex(2),0,2
         ;BrushTexture map(x,z)\brush,Tile_mask,0,1   ;Mask
      Next
   Next
End Function



Function LoadSkyBox( file$ )
   m=CreateMesh()
   ;front face
   b=LoadBrush( file$+"_FR.bmp",49 )
   s=CreateSurface( m,b )
   AddVertex s,-1,+1,-1,0,0:AddVertex s,+1,+1,-1,1,0
   AddVertex s,+1,-1,-1,1,1:AddVertex s,-1,-1,-1,0,1
   AddTriangle s,0,1,2:AddTriangle s,0,2,3
   FreeBrush b
   ;right face
   b=LoadBrush( file$+"_LF.bmp",49 )
   s=CreateSurface( m,b )
   AddVertex s,+1,+1,-1,0,0:AddVertex s,+1,+1,+1,1,0
   AddVertex s,+1,-1,+1,1,1:AddVertex s,+1,-1,-1,0,1
   AddTriangle s,0,1,2:AddTriangle s,0,2,3
   FreeBrush b
   ;back face
   b=LoadBrush( file$+"_BK.bmp",49 )
   s=CreateSurface( m,b )
   AddVertex s,+1,+1,+1,0,0:AddVertex s,-1,+1,+1,1,0
   AddVertex s,-1,-1,+1,1,1:AddVertex s,+1,-1,+1,0,1
   AddTriangle s,0,1,2:AddTriangle s,0,2,3
   FreeBrush b
   ;left face
   b=LoadBrush( file$+"_RT.bmp",49 )
   s=CreateSurface( m,b )
   AddVertex s,-1,+1,+1,0,0:AddVertex s,-1,+1,-1,1,0
   AddVertex s,-1,-1,-1,1,1:AddVertex s,-1,-1,+1,0,1
   AddTriangle s,0,1,2:AddTriangle s,0,2,3
   FreeBrush b
   ;top face
   b=LoadBrush( file$+"_UP.bmp",49 )
   s=CreateSurface( m,b )
   AddVertex s,-1,+1,+1,0,1:AddVertex s,+1,+1,+1,0,0
   AddVertex s,+1,+1,-1,1,0:AddVertex s,-1,+1,-1,1,1
   AddTriangle s,0,1,2:AddTriangle s,0,2,3
   FreeBrush b
   ScaleMesh m,500,500,500
   FlipMesh m
   EntityFX m,1
   Return m
End Function





Hoffentlich ist es wirklich kein "BlitzBug"

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDo, Dez 18, 2008 16:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Also dein Code ist schon fast eine Frechheit. Schon deshalb, weil dieser so in der Form nicht funktionsfähig ist. Wenn dir geholfen werden soll, dann ist es gerade für Leute die nicht an deinem Code arbeiten schon schwer genug sich in diesem zurecht zu finden. Da hättest du die Funktion LoadSkyBox schon komplett weg lassen können, denn diese wird nicht aufgerufen. Es fehlt Graphics3D und ganze Globalen- und Typedeklarationen die irgendwo im Code aufgerufen werden aber noch nicht stehen und bei mir Fehler verursachen. Ich mußte nun große Teile immer weiter reduzieren, bis es zumindest etwas lauffähig war.

Ganz grob: Dein Wasser erstellst du am besten mit CreatePlane und positionierst diesen dann auf gewünschte Wasseroberflächenhöhe. Vermeide absolut genau übereinander liegende Flächen zwischen Terrain und Wasser. Achte also immer daraus, dass das Terrain immer mit einem gewissen Mindestwinkel ins Wasser eingeht.

Folgender Code verursacht bei mir keine Fehler. Inwieweit du nun aus den ganzen auskommentierten Bereichen klar kommst, bleibt erstmal dir überlassen.

Code: [AUSKLAPPEN]
Graphics3D 800,600,0,2
SetBuffer BackBuffer()
Local Cam=CreateCamera()
Local Cam2=CreateCamera()
Global GridX%=8
Global GridZ%=8
Global SizeX%=80
Global SizeZ%=80
Global Tiles%=4




Dim tex(Tiles)           
Load_Textures()

Type Map
   Field y#     
   Field brush     
End Type

Global ident=0
Dim map.Map(GridX,GridZ)   

;0 = Brush
;1 = High
Dim Planet#(SizeX,SizeZ,1)

For x=0 To SizeX
   For z=0 To SizeZ
      Planet(x,z,0)=Rand(Tiles-4)+3
      Planet(x,z,1)=Float(120+Rand(50))/255
   Next
Next


Local Water=CreatePlane()
;ScaleEntity Water,250,1,250
EntityColor Water,0,120,220

Const world_scale=80;160
Global world_koord_x=1;*160 in diesem Fall
Global world_koord_z=1

PositionEntity Cam,world_koord_x*world_scale+200,180,world_koord_z*world_scale+200

;Welt.Welt = New Welt
Create_Map()
Create_MapLayout();später world_koord_x & z
;Welt\level=Create_Map()
ident=ident+1
;ScaleMesh Welt\level,80,240,80
;PositionEntity Welt\level,(world_koord_x)*world_scale,0,(world_koord_z)*world_scale
;EntityType Welt\level,2



timer=CreateTimer(60)
While Not KeyDown(1)
   
   mxs#=-MouseXSpeed()
   mys#=MouseYSpeed()
   If mxs#<>0 Then RotateEntity Cam2,EntityPitch(Cam2),EntityYaw(Cam2)+mxs#,EntityRoll(Cam2):RotateEntity Cam,EntityPitch(Cam),EntityYaw(Cam)+mxs#,EntityRoll(Cam)
   If mys#<>0 Then
      If mys#>0 Then
         If EntityPitch(Cam)+mys#>70
            mys#=70-EntityPitch(Cam)
         EndIf
         RotateEntity Cam,EntityPitch(Cam)+mys#,EntityYaw(Cam),EntityRoll(Cam)
      ElseIf mys#<0 Then
      If EntityPitch(Cam)+mys#<-70
            mys#=-70-EntityPitch(Cam)
      EndIf
         RotateEntity Cam,EntityPitch(Cam)+mys#,EntityYaw(Cam),EntityRoll(Cam)
      EndIf
   EndIf
   MoveMouse 400,300
   If KeyDown(29) Then speed#=10 Else speed#=2   
   If KeyDown( 30 ) Then speed1#=-speed# Else speed1#=0
   If KeyDown( 31 ) Then speed4#=-speed# Else speed4#=0
   If KeyDown( 32 ) Then speed3#=speed# Else speed3#=0
   If KeyDown( 17 ) Then speed2#=speed# Else speed2#=0
   
   MoveEntity Cam,speed1#,0,speed2#
   MoveEntity Cam,speed3#,0,speed4#
   
   PositionEntity Cam,0,2,0
   PositionEntity Cam2,0,2,0
   PositionEntity Water,EntityX(Cam),0.5,EntityZ(Cam)
   
   UpdateWorld
   RenderWorld
   
   Color 0,0,0
   Rect 0,0,100,90
   
   Color 255,255,255
;   Text 0,10,FPS()+" FPS "
   Text 0,30,AvailVidMem()/1048576+"/"+TotalVidMem()/1048576+" MB"
   Text 0,50,"X: "+world_koord_x+" / Z: "+world_koord_z
   
   
   
   WaitTimer(timer)
   Flip 0
Wend






Function Create_Map()
   Local Mesh%
   Local Surf%
   Local U#,V#
   Local STP#
   Local X#,Z#
   Local H1#,H2#,H3#,H4#
   
   
   
   Mesh=CreateMesh()
   U#=0
   V#=0
   STP#=1.0/Float(GridX)
   For Z#=0 To GridZ
      U=0
      For X#=0 To GridX
     
         H1#=Planet(X+world_koord_x  ,Z+world_koord_z  ,1)   ;top left height
         H2#=Planet(X+world_koord_x+1,Z+world_koord_z  ,1)   ;top Right height
         H3#=Planet(X+world_koord_x+1,Z+world_koord_z+1,1)   ;bot right height
         H4#=Planet(X+world_koord_x  ,Z+world_koord_z+1,1)   ;bot left height
         
;         br=map(X,Z)\brush      ;this brush contains both tiles + mask + lightmap
;         Surf=FindSurface( Mesh,br )            ;Find a surface in the mesh that contains the same brush
         If Surf=0 Surf=CreateSurface(Mesh,br)    ;If it can't find one create a new surface
            cnt=CountVertices( Surf )            ;Get count of vertices
            
         ;Add vertices including tile coords
            AddVertex Surf,X,H1,Z,0,0
            AddVertex Surf,X+1.0,H2,Z,1,0
            AddVertex Surf,X+1.0,H3,Z+1.0,1,1
            AddVertex Surf,X,H4,Z+1.0,0,1
         ;Add second set of tex coords to fit grid
            VertexTexCoords Surf,cnt,U,V,0,1
            VertexTexCoords Surf,cnt+1,U+STP,V,0,1
            VertexTexCoords Surf,cnt+2,U+STP,V+STP,0,1
            VertexTexCoords Surf,cnt+3,U,V+STP,0,1
         ;Finally add the two triangles
            AddTriangle Surf,cnt,cnt+2,cnt+1
            AddTriangle Surf,cnt,cnt+3,cnt+2
            U=U+STP
      Next
      V=V+STP
      Next
      Return Mesh
End Function

Function Load_Textures()
   For a=0 To Tiles-1
      b$="Tex/tex"+a+".bmp"
      tex(a+1)=LoadTexture("e:\mond.png");b$)
   Next
   Tile_mask=LoadTexture("e:\mond.png");mask.bmp")
   TextureCoords Tile_mask,1
   TextureBlend Tile_mask,3
End Function

Function Create_MapLayout()
   ;Cls
   ;DrawImage hmap,0,0
   For z=0 To GridZ
      For x=0 To GridX
         map.Map(x,z) = New Map
         map(x,z)\brush=CreateBrush()
         
;         save=Planet(world_koord_x+x,world_koord_z+z,0)
         
;         BrushTexture map(x,z)\brush,tex(save),0,0   ;Bottom Tile
;         If z=wahlz And x=wahlx Then   BrushTexture map(x,z)\brush,tex(2),0,2      ;Top Tile
         ;BrushTexture map(x,z)\brush,tex(2),0,2
         ;BrushTexture map(x,z)\brush,Tile_mask,0,1   ;Mask
      Next
   Next
End Function


Noch was, Funktionen die zum Beispiel Sachen laden aber kein Rückgabewert liefern, sollten vermieden werden. Oder zumindest so erstellt - wenn es in globalen Variablen gespeichert wird - das sie eventuell zuvor geladenes auch wieder löschen. Denn sonst hast du immer größeren Platzverbrauch des Speichers. Ich persönlich würde versuchen das ganze so zu gestallten, dass kein ewiges Funktionsjonglieren statt findet. Also versuche das Terrain mithilfe einer Funktion zu laden und ein Handle dazu weiter zu geben.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

onkelz89

BeitragDo, Dez 18, 2008 17:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Sorry für den Code,

musste "schnell schnell" gehen, bin nicht zuhause...

Danke für die Mühe, werde es mir nochmal mit Plane anschauen nachher und dann noch was dazu schreiben.

EDIT:

*gelöst*

Das mit Plane hat nicht geklappt - selbes Problem...

Habe mir gedacht mal mit CameraRange zu "spielen"...
Habe es auf 2 gesetzt (CameraRange cam,2,900) und jetzt geht es... Smile

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group