Verschiedene Tiles auf Terrain... [OK]
Übersicht

onkelz89Betreff: Verschiedene Tiles auf Terrain... [OK] |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hat ein wenig gedauert bis es jetzt so ist wie ich es möchte aber geht!! ![]() Vielen Dank !!! EDIT: habe jetzt nur folgenden "Grafikfehler" ![]() weiß Jemand wie man das weg bekommt? Das Wasser ist eigentliche ein Cube... |
||
![]() |
Angelo |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Code: [AUSKLAPPEN] CameraRange cam,.1,900 Habe ich schon... ist es leider nicht ![]() |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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" |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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... ![]() |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group