Oblivion style Detail Lowdetail map help.
Blitz3D Forums/Blitz3D Programming/Oblivion style Detail Lowdetail map help.
| ||
Hi everybody.. iam back :) Here is a fun problem that iam working on. 1) Create a detailmesh 2) Create a lod mesh 3) Join em together using blitz3d vertexX and vertexY 4) Have a command that Rerender em both. But LOD detail must sustain stable. Question: Iam trying to do above. but always run into difirent problems. What do you all other think. here is some code iam using.. not working propper (Planing to scrap it) [CODE] ;Lod experment 2006-12-31 22:16 ;********* Treemodels *************************** Type tree Field root ;Nunber of root tree usaly 1 Field leaf[128] ;Pointer to branch mesh Field light[128] Field leafs Field anim End Type Global tree,t_sprite,t_light Global t_anim,t_leaf ;*********************************************** ;LodVerts 8x Type lodverts8x Field vert8x End Type ;Lodverts 1x Type lodverts1x Field vert1x ;Nev vertices på LOD mesh som ska flyttas till detail verts. Field detailvert ;Den vertices som den joinar på detail meshen End Type ;Camera thins Global camera ;Datas. Dim verts1(64,64) ;Detail mesh Dim verts2(64,64) ;Lod mesh Dim verts3(64,2) ;Över kopplings pungt på lod. Dim verts4(2,64) ;Vänster kopplings punger på lod. Dim verts5(64,2) ;Nedre kopplings pungt på lod. Dim verts6(2,64) ;Högre kopplings pungter på lod. Dim wd#(1025,1025) ; World array height data Global wx=1024,wz=1024 Graphics3D 1024,768,32,2 SetBuffer BackBuffer() Cls camera=CreateCamera() CameraViewport camera,0,0,1024,768 PositionEntity camera,256,120,256-16 CameraClsColor camera,127,128,255 CameraFogColor camera,127,128,255 CameraFogRange camera,32,250 CameraFogMode camera,1 CameraRange camera,0.1,500 ;TurnEntity camera,90,0,0 light=CreateLight() ;------- Detail mesh -------------- mesh=CreateMesh() surf1=CreateSurface(mesh) ;Skapar pungterna för detail mapen For x=0 To 64 For z=0 To 64 verts1(x,z)=AddVertex (surf1,x+224,0,z+224,x,z) Next Next ;Kopplar polygonerna i meshen For x=0 To 63 For z=0 To 63 AddTriangle surf1,verts1(x,z),verts1(x,z+1),verts1(x+1,z+1) AddTriangle surf1,verts1(x,z),verts1(x+1,z+1),verts1(x+1,z) Next Next ;--------------------------------- ;--------- LOD mesh ------------------ ;Skapar LOD mesh som ska kopplas runt detail meshen lodmesh=CreateMesh() surf2=CreateSurface(lodmesh) ;Skapar lagret som ska vara Högst upp. Aka 512 till 64 For x=1 To 63 For z=36 To 64 verts2(x,z)=AddVertex (surf2,x*8,0,z*8+8,x*8,z*8) tmp_v8.lodverts8x = New lodverts8x tmp_v8\vert8x=verts2(x,z) Next Next For x=1 To 62 For z=36 To 63 AddTriangle surf2,verts2(x,z),verts2(x,z+1),verts2(x+1,z+1) AddTriangle surf2,verts2(x,z),verts2(x+1,z+1),verts2(x+1,z) Next Next ;Skapar Kopplings pungt 1 vertikal överts For x=0 To 64 verts3(x,1)=AddVertex (surf2,x+224,0,1+228+59) verts3(x,2)=AddVertex (surf2,x+224,0,2+228+66) tmp_v1.lodverts1x = New lodverts1x tmp_v1\vert1x=verts3(x,1) tmp_v1\detailvert = verts1(x,64) ;***** Debug code ************************ Goto holycraphigh sphere=CreateSphere() ScaleEntity sphere,0.2,0.2,0.2 tx=VertexX(surf1,tmp_v1\detailvert) tz=VertexZ(surf1,tmp_v1\detailvert) PositionEntity sphere,tx,0,tz EntityColor sphere,0,255,0 cube=CreateCube() ScaleEntity cube,0.3,0.3,0.3 tx=VertexX(surf2,tmp_v1\vert1x) tz=VertexZ(surf2,tmp_v1\vert1x) PositionEntity cube,tx,0,tz EntityColor cube,255,0,0 prerender .holycraphigh ;***************************************** tmp_v1.lodverts1x = New lodverts1x tmp_v1\vert1x=verts3(x,2) Next For x=0 To 63 Step 8 z=1 AddTriangle surf2,verts3(x,z),verts3(x,z+1),verts3(x+1,z) AddTriangle surf2,verts3(x+1,z),verts3(x,z+1),verts3(x+1+1,z) AddTriangle surf2,verts3(x+2,z),verts3(x,z+1),verts3(x+1+2,z) AddTriangle surf2,verts3(x+3,z),verts3(x,z+1),verts3(x+1+3,z) AddTriangle surf2,verts3(x+4,z),verts3(x+8,z+1),verts3(x+1+4,z) AddTriangle surf2,verts3(x+5,z),verts3(x+8,z+1),verts3(x+1+5,z) AddTriangle surf2,verts3(x+6,z),verts3(x+8,z+1),verts3(x+1+6,z) AddTriangle surf2,verts3(x+7,z),verts3(x+8,z+1),verts3(x+1+7,z) AddTriangle surf2,verts3(x+4,z),verts3(x,z+1),verts3(x+8,z+1) ;AddTriangle surf2,verts3(x,z),verts3(x+1,z+1),verts3(x+1,z) Next ;Skapar vänster övere hörn bit AddTriangle surf2,verts2(27,36),verts2(28,36),verts3(0,1) ;Skapar Höger övre bit AddTriangle surf2,verts2(36,36),verts2(37,36),verts3(64,1) ;-------------------------------------- ;Skapar Resten av Vänster kant For x=0 To 27 For z=0 To 35 verts2(x,z)=AddVertex (surf2,x*8,0,z*8+8) tmp_v8.lodverts8x = New lodverts8x tmp_v8\vert8x=verts2(x,z) Next Next For x=1 To 26 For z=1 To 35 AddTriangle surf2,verts2(x,z),verts2(x,z+1),verts2(x+1,z+1) AddTriangle surf2,verts2(x,z),verts2(x+1,z+1),verts2(x+1,z) Next Next ;Vänster kopplings pungter For z=0 To 64 x=0 verts4(1,z)=AddVertex (surf2,216,0,z+224) verts4(2,z)=AddVertex (surf2,224,0,z+224) tmp_v1.lodverts1x = New lodverts1x tmp_v1\vert1x=verts4(1,z) tmp_v1.lodverts1x = New lodverts1x tmp_v1\vert1x=verts4(2,z) Next For z=0 To 63 Step 8 x=1 ;AddTriangle surf2,verts4(x,z),verts4(x,z+1),verts4(x+1,z+1) AddTriangle surf2,verts4(x,z),verts4(x+1,z+1),verts4(x+1,z) AddTriangle surf2,verts4(x,z),verts4(x+1,z+1+1),verts4(x+1,z+1) AddTriangle surf2,verts4(x,z),verts4(x+1,z+1+2),verts4(x+1,z+2) AddTriangle surf2,verts4(x,z),verts4(x+1,z+1+3),verts4(x+1,z+3) AddTriangle surf2,verts4(x,z+8),verts4(x+1,z+1+4),verts4(x+1,z+4) AddTriangle surf2,verts4(x,z+8),verts4(x+1,z+1+5),verts4(x+1,z+5) AddTriangle surf2,verts4(x,z+8),verts4(x+1,z+1+6),verts4(x+1,z+6) AddTriangle surf2,verts4(x,z+8),verts4(x+1,z+1+7),verts4(x+1,z+7) AddTriangle surf2,verts4(x,z),verts4(x,z+8),verts4(x+1,z+4) Next ;Skapar vänster övere bit 2 AddTriangle surf2,verts2(27,36),verts4(2,64),verts2(27,35) ;Skapar resten av nedre lod ;Skapar lagret som ska vara längst ned. For x=1 To 63 For z=1 To 26 verts2(x,z)=AddVertex (surf2,x*8,0,z*8+8) tmp_v8.lodverts8x = New lodverts8x tmp_v8\vert8x=verts2(x,z) Next Next For x=1 To 62 For z=1 To 25 AddTriangle surf2,verts2(x,z),verts2(x,z+1),verts2(x+1,z+1) AddTriangle surf2,verts2(x,z),verts2(x+1,z+1),verts2(x+1,z) Next Next ;Skapar Kopplings pungt 1 vertikal överts For x=0 To 64 verts5(x,1)=AddVertex (surf2,x+224,0,1+215) verts5(x,2)=AddVertex (surf2,x+224,0,2+215+7) tmp_v1.lodverts1x = New lodverts1x tmp_v1\vert1x=verts5(x,1) tmp_v1.lodverts1x = New lodverts1x tmp_v1\vert1x=verts5(x,2) Next For x=0 To 63 Step 8 z=1 AddTriangle surf2,verts5(x,z),verts5(x,z+1),verts5(x+1,z+1) AddTriangle surf2,verts5(x,z),verts5(x+1,z+1),verts5(x+1+1,z+1) AddTriangle surf2,verts5(x,z),verts5(x+2,z+1),verts5(x+1+2,z+1) AddTriangle surf2,verts5(x,z),verts5(x+3,z+1),verts5(x+1+3,z+1) AddTriangle surf2,verts5(x+8,z),verts5(x+4,z+1),verts5(x+1+4,z+1) AddTriangle surf2,verts5(x+8,z),verts5(x+5,z+1),verts5(x+1+5,z+1) AddTriangle surf2,verts5(x+8,z),verts5(x+6,z+1),verts5(x+1+6,z+1) AddTriangle surf2,verts5(x+8,z),verts5(x+7,z+1),verts5(x+1+7,z+1) AddTriangle surf2,verts5(x,z),verts5(x+4,z+1),verts5(x+8,z) ;AddTriangle surf2,verts5(x,z),verts5(x+1,z+1),verts5(x+1,z) Next ;Kopplar höger nedre kopplings hörn AddTriangle surf2,verts2(27,27),verts4(2,0),verts2(27,26) AddTriangle surf2,verts2(27,26),verts4(2,0),verts2(28,26) ;Skapar resten av högerlod For x=37 To 63 For z=27 To 35 verts2(x,z)=AddVertex (surf2,x*8,0,z*8+8) tmp_v8.lodverts8x = New lodverts8x tmp_v8\vert8x=verts2(x,z) Next Next For x=37 To 62 For z=26 To 35 AddTriangle surf2,verts2(x,z),verts2(x,z+1),verts2(x+1,z+1) AddTriangle surf2,verts2(x,z),verts2(x+1,z+1),verts2(x+1,z) Next Next ;Höger kopplings pungter For z=0 To 64 x=0 verts6(1,z)=AddVertex (surf2,288,0,z+224) verts6(2,z)=AddVertex (surf2,296,0,z+224) tmp_v1.lodverts1x = New lodverts1x tmp_v1\vert1x=verts6(1,z) tmp_v1.lodverts1x = New lodverts1x tmp_v1\vert1x=verts6(1,z) Next For z=0 To 63 Step 8 x=1 AddTriangle surf2,verts6(x,z),verts6(x,z+1),verts6(x+1,z) AddTriangle surf2,verts6(x,z+1),verts6(x,z+1+1),verts6(x+1,z) AddTriangle surf2,verts6(x,z+2),verts6(x,z+1+2),verts6(x+1,z) AddTriangle surf2,verts6(x,z+3),verts6(x,z+1+3),verts6(x+1,z) AddTriangle surf2,verts6(x,z+4),verts6(x,z+1+4),verts6(x+1,z+8) AddTriangle surf2,verts6(x,z+5),verts6(x,z+1+5),verts6(x+1,z+8) AddTriangle surf2,verts6(x,z+6),verts6(x,z+1+6),verts6(x+1,z+8) AddTriangle surf2,verts6(x,z+7),verts6(x,z+1+7),verts6(x+1,z+8) AddTriangle surf2,verts6(x,z+4),verts6(x+1,z+8),verts6(x+1,z) ;AddTriangle surf2,verts6(x,z),verts6(x+1,z+1),verts6(x+1,z) Next ;Höger övre kopplings hörn andra tri AddTriangle surf2,verts6(1,64),verts2(37,36),verts2(37,35) ;Höger nedre kopplings hörn första tri AddTriangle surf2,verts6(1,0),verts2(37,27),verts2(37,26) ;Höger nedre kopplings hörn andra tri AddTriangle surf2,verts6(1,0),verts2(37,26),verts2(36,26) ;Load the height map filein=ReadFile("world.map") sizex=ReadFloat#(filein) sizez=ReadFloat#(filein) For xx=0 To 1023 For zz=0 To 1023 wd#(xx,zz)=Float(ReadFloat#(filein))/2 Next Next CloseFile filein ;Global hmap=LoadImage("startworld.bmp") ;If Not hmap Then Print "Failed to find bigworld.bmp" : Delay 3000 : End ;load total height map ;For xx=0 To 1023 ;For zz=0 To 1023 ; yz#=0 ; For x1=0 To 5 ; For z1=0 To 5 ; y1#=ReadPixel (x1+xx,z1+zz,ImageBuffer(hmap)) And 255 ; yz#=yz#+y1# ; Next ; Next ;y#=yz#/36.0 ;y1#=ReadPixel (xx,zz,ImageBuffer(hmap)) And 255 ; yz#=yz#+y1# ; y#=y1#/36.0 ; wd#(xx,zz)=y1# ;If maxy#<y# Then maxy#=y# ;Next ;Print xx ;Next ;Set lod heightmap. For i=0 To CountVertices ( surf2 )-1 x=VertexX#(surf2,i) z=VertexZ#(surf2,i) ;yz#=0 ;For x1=0 To 5 ; For z2=0 To 5 ; y1#=ReadPixel (x+x1,z+z1,ImageBuffer(hmap)) And 255 ; yz#=yz#+y1# ; Next ;Next ;y#=yz#/36.0 y#=wd#(x,z) VertexCoords surf2,i,VertexX#(surf2,i),y#,VertexZ#(surf2,i) VertexTexCoords surf2,i,VertexX#(surf2,i),VertexZ#(surf2,i) Next ;Set detail height data For i=0 To CountVertices ( surf1 )-1 x=VertexX#(surf1,i) z=VertexZ#(surf1,i) ;yz#=0 ;For x1=0 To 5 ; For z2=0 To 5 ; y1#=ReadPixel (x+x1,z+z1,ImageBuffer(hmap)) And 255 ; yz#=yz#+y1# ; Next ;Next y#=yz#/36.0 y#=wd#(x,z) VertexCoords surf1,i,VertexX#(surf1,i),y#,VertexZ#(surf1,i) Next MESHnormals( mesh ) texture=LoadTexture("grass.jpg") ScaleTexture texture,2,2 EntityTexture mesh,texture texture2=LoadTexture("Moss.bmp") ScaleTexture texture2,512,512 EntityTexture lodmesh,texture2 ;WireFrame True player=CreateSphere() PositionEntity player,EntityX(camera),0,EntityZ(camera) ScaleEntity player,0.5,0.5,0.5 ;whater plane=CreatePlane() EntityColor plane,50,50,255 PositionEntity plane,0,5,0 ;************* Initziate tree *************************** tree=LoadMesh("tree06.b3d") t_SPRITE=LoadSprite("leaf01_256.tga",1+4) ScaleSprite t_sprite,1,1 MoveEntity t_sprite,5,10,5 SpriteViewMode t_SPRITE,1 t_light=25 ; Default Blade lighnes demo_wood() While Not KeyHit(1) ; MoveEntity camera,0,0,-1 If KeyDown(17) MoveEntity camera,0,0,0.1 End If If KeyDown(31) MoveEntity camera,0,0,-0.1 End If smx#=MouseXSpeed()/15 smy#=MouseYSpeed()/15 TurnEntity camera,smy#,-smx#,0 RotateEntity camera,EntityPitch(camera),EntityYaw(camera),0 TranslateEntity camera,0,-1,0 y#=BilinearInterpValue# ( Float(EntityX(camera)) ,Float(EntityZ(camera)) ) ;If y#<>0 Then Stop If y#+0.5>EntityY#(camera) PositionEntity camera,EntityX(camera),y#+0.5,EntityZ(camera) jumps=0 yspeed#=0 End If If KeyDown(200) Then MoveEntity player,0,0,1 If KeyDown(208) Then MoveEntity player,0,0,-1 If KeyDown(203) Then MoveEntity player,-1,0,0 If KeyDown(205) Then MoveEntity player,1,0,0 MoveEntity player,0,-1,0 ;Justera Y y#=BilinearInterpValue# ( Float(EntityX(player)) ,Float(EntityZ(player)) ) ;If y#<>0 Then Stop If y#+0.5>EntityY#(player) PositionEntity player,EntityX(player),y#+1,EntityZ(player) jumps=0 yspeed#=0 End If ;move lod and detail map cords. If MilliSecs()-oldupd > 2000 And KeyHit(57) oldupd=MilliSecs() ;If KeyHit(57) TMP_X=Int(EntityX(camera)-228-32) TMP_Z=Int(EntityZ(camera)-228-32) PositionEntity lodmesh,TMP_X,0,TMP_Z For tmp_v1.lodverts1x = Each lodverts1x If tmp_v1\detailvert <>0 i=tmp_v1\vert1x e_tx#=VertexX(surf1,tmp_v1\detailvert);Readxpos of connected detail vertex e_tz#=VertexZ(surf1,tmp_v1\detailvert);readzpos of connected detail vertex e_y#=VertexY(surf1,tmp_v1\detailvert) ;x=VertexX(surf2,i)+ox ;z=VertexZ(surf2,i)+oz ;If z<0 Or z>1023 Then z=0 ;If x<0 Or x>1023 Then x=0 ;y#=wd#(x,z) ;VertexCoords surf2,i,VertexX#(surf2,i),y#,VertexZ#(surf2,i) VertexCoords surf2,i,e_tx#,e_y#,e_tz# VertexTexCoords surf2,i,x,z End If Next TMP_X=Int(EntityX(camera)/8) TMP_X=TMP_X*8-228-32 TMP_Z=Int(EntityZ(camera)/8) TMP_Z=TMP_z*8-228-32 PositionEntity lodmesh,TMP_X,0,TMP_Z ox=EntityX(lodmesh) oz=EntityZ(lodmesh) ;Set lod heightmap. For tmp_v8.lodverts8x = Each lodverts8x i=tmp_v8\vert8x x=VertexX(surf2,i)+ox z=VertexZ(surf2,i)+oz If z<0 Or z>1023 Then z=0 If x<0 Or x>1023 Then x=0 y#=wd#(x,z) VertexCoords surf2,i,VertexX#(surf2,i),y#,VertexZ#(surf2,i) VertexTexCoords surf2,i,x,z Next ;For i=0 To CountVertices ( surf2 )-1 ; x=VertexX(surf2,i)+ox ; z=VertexZ(surf2,i)+oz ; If z<0 Or z>1023 Then z=0 ; If x<0 Or x>1023 Then x=0 ; y#=wd#(x,z) ; VertexCoords surf2,i,VertexX#(surf2,i),y#,VertexZ#(surf2,i) ; VertexTexCoords surf2,i,x,z ;Next PositionEntity mesh,Int(EntityX(camera)-228-32),0,Int(EntityZ(camera)-228-32) ox=EntityX(mesh) oz=EntityZ(mesh) ;Set detail height data For i=0 To CountVertices ( surf1 )-1 x=VertexX(surf1,i)+ox z=VertexZ(surf1,i)+oz If z<0 Or z>1023 Then z=0 If x<0 Or x>1023 Then x=0 y#=yz#/36.0 y#=wd#(x,z) VertexCoords surf1,i,VertexX#(surf1,i),y#,VertexZ#(surf1,i) VertexTexCoords surf1,i,x,z Next MESHnormals( mesh ) ;HideEntity lodmesh End If animate_leafs() oldms=MilliSecs() UpdateWorld() RenderWorld() MoveMouse 400,300 Text 0,0,MilliSecs()-oldms Text 0,20,y# Text 0,30,EntityX(player) Text 50,30,EntityY(player) Text 100,30,EntityZ(player) Text 0,50,maxy# Flip Wend Function MESHnormals( tmesh ) For l = 1 To CountSurfaces(tmesh ) s = GetSurface( tmesh , l ) For t = 0 To CountTriangles( s )-1 v0 = TriangleVertex( s, t, 0 ) v1 = TriangleVertex( s, t, 1 ) v2 = TriangleVertex( s, t, 2 ) ax# = VertexX( s, v1 ) - VertexX( s, v0 ) ay# = VertexY( s, v1 ) - VertexY( s, v0 ) az# = VertexZ( s, v1 ) - VertexZ( s, v0 ) bx# = VertexX( s, v2 ) - VertexX( s, v1 ) by# = VertexY( s, v2 ) - VertexY( s, v1 ) bz# = VertexZ( s, v2 ) - VertexZ( s, v1 ) Nx# = ( ay * bz ) - ( az * by ) Ny# = ( az * bx ) - ( ax * bz ) Nz# = ( ax * by ) - ( ay * bx ) Ns# = Sqr( Nx * Nx + Ny*Ny + Nz*Nz ) Nx = Nx / Ns Ny = Ny / Ns Nz = Nz / Ns For v = v0 To v2 VertexNormal s, v, Nx, Ny, Nz Next Next Next End Function ;Usefull functions. Function BilinearInterpValue# ( x1# , y1# ) X_low = Int ( Floor(x1) ) X_hi = Int ( Ceil (x1) ) Y_low = Int ( Floor(y1) ) Y_hi = Int ( Ceil (y1) ) ;Kepp things in bound :) If X_low < 0 Or X_low > WX Then x_low=0 If X_hi < 0 Or X_hi > WX Then x_hi=0 If Y_low < 0 Or Y_low > WZ Then Y_low=0 If Y_hi < 0 Or Y_hi > WZ Then Y_hi=0 x_per# = x1 - x_low y_per# = y1 - y_low p00# = WD# ( x_low , y_low ) p10# = WD# ( x_hi , y_low ) p01# = WD# ( x_low , y_hi ) p11# = WD# ( x_hi , y_hi ) i1# = LinearInterpolate#(p00#,p10#,x_per#) i2# = LinearInterpolate#(p01#,p11#,x_per#) Return LinearInterpolate#(i1#,i2#,y_per#) End Function ;thanks too gabrielknight74. philings2@... Function LinearInterpolate#(a#,b#,x#) Return a#+(b#-a#)*x# End Function Function animate_leafs() For t_tr.tree=Each tree t_tr\anim=t_tr\anim+1 t_a#=Sin(t_tr\anim)*5 For i=1 To t_tr\leafs RotateSprite t_tr\leaf[i],t_a# Next Next End Function Function demo_wood() t_area=64 For it=1 To 40 t_t=CopyEntity(tree) t_x2#=Rnd(t_area) +228 t_z2#=Rnd(t_area)+228 t_yy2#=wd#(t_x2,t_z2) PositionEntity t_t,t_x2,t_yy2,t_z2 t_tr.tree = New tree t_tr\root=1 t_r=Rnd(3)+1 t_filein=ReadFile("tree0"+Str$(t_r)+".t") t_tr\root=ReadInt(t_filein) t_leaf=ReadByte(t_filein) t_tr\leafs=t_leaf For i=1 To t_leaf t_obj=ReadInt(t_filein) t_x#=ReadFloat#(t_filein) t_y#=ReadFloat#(t_filein) t_z#=ReadFloat#(t_filein) t_tr\leaf[i]=CopyEntity(t_sprite,t_t) EntityColor t_tr\leaf[i],255,128+Rnd(128),255 PositionEntity t_tr\leaf[i],t_x#,t_y#,t_z# Next RotateEntity t_t,Rnd(30)-15,Rnd(360),0 ;rad#=Rnd(20)/20.0+0.7 rad#=0.15 ScaleEntity t_t,rad#,rad#,rad# CloseFile t_filein Next End Function ;******************************** Pre render ********************* Function prerender() WireFrame True CameraClsColor camera,0,0,0 PositionEntity camera,250,45,300 RotateEntity camera,90,0,0 UpdateWorld RenderWorld Flip WaitKey End Function ;***************************************************************** [/CODE] |
| ||
I know English isn't your first language but your issue is as clear as mud .. at least to me ;) If your code didn't require external files then it'd make more sense once I'd run it. Can you do a shortened version without this requirement? Stevie |
| ||
you right.. i restart project.. i do a better next time :) |
| ||
Now its next time.. its going well. using entityorder 10 on lod to make it draw on screen first.. thoe got me into trouble. some times LOD map dosent clip on right spot. making LOD apear in Air.. verry uggly.. this is common problem.. i thinking of a sollution but never came up with any right now. ;Lodworld example v2 Graphics3D 800,600,16,2 SetBuffer BackBuffer() camera = CreateCamera() CameraRange camera,0.1,1000 light = CreateLight() Dim verts1(64,64) ; Detail mesh Dim verts2(64,64) ; Lod mesh (Used to display far far landscape) ;------- Detail mesh -------------- mesh=CreateMesh() surf1=CreateSurface(mesh) ;Skapar pungterna för detail mapen For x=0 To 64 For z=0 To 64 verts1(x,z)=AddVertex (surf1,x,0,z,x,z) Next Next ;Kopplar polygonerna i meshen For x=0 To 63 For z=0 To 63 AddTriangle surf1,verts1(x,z),verts1(x,z+1),verts1(x+1,z+1) AddTriangle surf1,verts1(x,z),verts1(x+1,z+1),verts1(x+1,z) Next Next ;--------------------------------- ;------- Lod mesh -------------- Lodmesh=CreateMesh() surf2=CreateSurface(Lodmesh) ;Skapar punkterna för detail mapen For x=0 To 64 For z=0 To 64 verts2(x,z)=AddVertex (surf2,x*10,0,z*10,x,z) Next Next ;Kopplar polygonerna i meshen For x=0 To 63 For z=0 To 63 AddTriangle surf2,verts2(x,z),verts2(x,z+1),verts2(x+1,z+1) AddTriangle surf2,verts2(x,z),verts2(x+1,z+1),verts2(x+1,z) Next Next ;--------------------------------- ;Loading height map heightmap=LoadImage("heightmap.bmp") For x=0 To 64 For z=0 To 64 y=ReadPixel (x,z,ImageBuffer(heightmap)) And 255 y=y/3 VertexCoords(surf1,verts1(x,z),x,y,z) Next Next ;Set height map on LOD 10x of detail For x=0 To 64 For z=0 To 64 y=ReadPixel (x*10,z*10,ImageBuffer(heightmap)) And 255 y=y/3 VertexCoords(surf2,verts2(x,z),x*10,y,z*10) Next Next PositionEntity camera,32,50,32 ;RotateEntity camera,45,0,0 MESHnormals( mesh ) tex_detail0=LoadTexture("grass.jpg") EntityTexture mesh,tex_detail0 PositionEntity light,-50000,50000,-50000 EntityOrder lodmesh,10 While Not KeyHit(1) If KeyDown(17) MoveEntity camera,0,0,0.1 End If If KeyDown(31) MoveEntity camera,0,0,-0.1 End If smx#=MouseXSpeed()/15 smy#=MouseYSpeed()/15 TurnEntity camera,smy#,-smx#,0 RotateEntity camera,EntityPitch(camera),EntityYaw(camera),0 MoveMouse 400,300 UpdateWorld() RenderWorld() Flip Wend Function MESHnormals( tmesh ) For l = 1 To CountSurfaces(tmesh ) s = GetSurface( tmesh , l ) For t = 0 To CountTriangles( s )-1 v0 = TriangleVertex( s, t, 0 ) v1 = TriangleVertex( s, t, 1 ) v2 = TriangleVertex( s, t, 2 ) ax# = VertexX( s, v1 ) - VertexX( s, v0 ) ay# = VertexY( s, v1 ) - VertexY( s, v0 ) az# = VertexZ( s, v1 ) - VertexZ( s, v0 ) bx# = VertexX( s, v2 ) - VertexX( s, v1 ) by# = VertexY( s, v2 ) - VertexY( s, v1 ) bz# = VertexZ( s, v2 ) - VertexZ( s, v1 ) Nx# = ( ay * bz ) - ( az * by ) Ny# = ( az * bx ) - ( ax * bz ) Nz# = ( ax * by ) - ( ay * bx ) Ns# = Sqr( Nx * Nx + Ny*Ny + Nz*Nz ) Nx = Nx / Ns Ny = Ny / Ns Nz = Nz / Ns For v = v0 To v2 VertexNormal s, v, Nx, Ny, Nz Next Next Next End Function |
| ||
(so heightmap.bmp must be 640*640 pixels?) I think you should not use EntityOrder 10, nor should you render both. Instead I'd try to use EntityAutofade with both, or if this doesn't work I'd implement a by-vertex entityautofade, based on vertex distance and Vertex Alpha. (altering only vertices alpha that are overlapping detail/LOD areas, noless make sure it's not a bottleneck). Basicly I'd suggest to cut huge meshes in pieces. A huge heightmap of say 2560*2560 may render very fast when you make it a grid of individual mesh patches, each one of a few thousand tris. Have a look at the ClusterizeMesh sample in the archives. |
| ||
what the hell is this? i tested the code and discovered that there are missing external files! and [CODE] or [CoDe] is no tag here. if you need webspace uploaders i have one |
| ||
yes ignore this post. i have sen through oblivion trick of lod now. they accaly have a kind of entity order trick. to solve my above problem was easy. just lower the vertex that is under the Detail Mesh. and it shall look just fine.. stay tooned for another post on this matter later.. |
| ||
Hey i have ben wrong maby or maby not... cause maby i cold just make al vertices of the lod mesh stay under the detail mesh. it can work. :) |
| ||
Ther will be no updates. i have terminted this idea for a while. I build gigantic mesh instead. |