Cube-Octree

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

 

BIG BUG

Betreff: Cube-Octree

BeitragSo, Jun 10, 2007 13:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Fange gerade an, mich ein bisschen mit dem Prinzip von Octrees auseinanderzusetzen und habe mir aus Cubes das mal visualisiert.

Irgendwie schauts ganz lustig aus, deswegen stelle ich das hier mal vor:

Code: [AUSKLAPPEN]

;Mit Enter kann man einen neuen Mesh generieren lassen
;Mit der Konstante cDepth wird die Größe eingestellt. Eine Stufe entspricht
;hier der 8-fachen Größe, also vorsichtig hantieren!
;Mit + & - auf dem Numpad kann gezoomed werden, mit den Pfeiltasten gedreht

Graphics3D 700,700,32,2

SeedRnd MilliSecs()

Const cDepth          = 6
Const cCubesPerMesh      = 2000



Const KEY_ESC      = 1
Const KEY_RETURN   = 28   ;generate new mesh
Const KEY_SPACE      = 57   ;toggle wireframe

Const KEY_UP         = 200
Const KEY_DOWN      = 208
Const KEY_LEFT      = 203
Const KEY_RIGHT      = 205

Const KEY_NUMPLUS   = 78   ;zoom in
Const KEY_NUMMINUS  = 74   ;zoom out

Const KEY_F12      = 88   ;screenshot


Global gOctCnt, gCubeCnt, gMeshCnt
Global gMap  = CreatePivot()
Global gMesh.tMesh

Type tMesh

   Field mesh
   Field cubes
   
End Type

buildCube(0)



;Create Camera
cam_base=CreatePivot()
cam_ctrl=CreatePivot(cam_base)

camera=CreateCamera(cam_ctrl)
CameraRange camera, 1, 5000
CameraClsColor camera, 0, 0, 0
RotateEntity camera, 0,0,0
PositionEntity camera,0,0,-140


;Create Light
light=CreateLight()
RotateEntity light,70,20,45

;Create Light
light=CreateLight()
RotateEntity light,-70,50,-45
LightColor light, 90, 90, 90

SetBuffer BackBuffer()

time_old = MilliSecs()
While Not KeyHit(1)

;  Tweening
   time_new   = MilliSecs()
   time_diff# = (time_new - time_old) / 1000.0
   time_old   = time_new

;  Animation
   If KeyHit(KEY_SPACE) Then
      wframe = 1-wframe
      WireFrame wframe
   EndIf

   If KeyHit(KEY_RETURN) Then

      For m.tMesh = Each tMesh
         FreeEntity m\mesh
      Next
      Delete Each tMesh
      
      gOctCnt = 0: gCubeCnt = 0: gMeshCnt = 0
      buildCube(0)

   EndIf


;  Camera Movement
   TurnEntity cam_base,0,(KeyDown(KEY_LEFT)-KeyDown(KEY_RIGHT))*time_diff#*120,0
   TurnEntity cam_ctrl, (KeyDown(KEY_UP)-KeyDown(KEY_DOWN))*time_diff#*120,0,0
   MoveEntity camera, 0,0,(KeyDown(KEY_NUMPLUS)-KeyDown(KEY_NUMMINUS))*time_diff#*100   ;ZOOM


   UpdateWorld time_diff#
   RenderWorld

;  Frames Per Second
   fps_fpscnt% = fps_fpscnt% + 1     
   fps_new_sec% = MilliSecs()
   If (fps_new_sec% => fps_old_sec% + 1000)
      fps_fps% = fps_fpscnt%
      fps_fpscnt% = 0
      fps_old_sec% = fps_new_sec%
   EndIf
   Text 0,0, fps_fps%
   Text 0,20, "VCubeCnt: " + gOctCnt
   Text 0,40, "CubeCnt:  " + gCubeCnt
   Text 0,60, "MeshCnt:  " + gMeshCnt
   Text 0,80, "TrisRend: " + TrisRendered()

   Flip 0

   If KeyHit(KEY_F12) Then MakeScreenShot$()

Wend
End



Function buildCube(pLevel,x=0,y=0,z=0)

   Local i
   Local lCube, lSize
   Local lx, ly, lz
   Local hCreateMesh
   
   ;calculate size of cube
   lSize = 1 Shl (cDepth - pLevel)

   gOctCnt = gOctCnt + 1
   
   ;create new mesh if necessary
   If gMesh = Null Then gMesh = NewMesh()
   If gMesh\cubes > cCubesPerMesh Then gMesh = NewMesh()
   


   If (pLevel < cDepth And Rand(2) = 1) Or pLevel = 0

      For i = 0 To 7
         
         lx = lSize * 0.5 * ((i And 1) * 2 - 1)
         ly = lSize * 0.5 * ((i And 2)     - 1)
         lz = lSize * 0.5 * ((i And 4) *.5 - 1)
                  
         buildCube(pLevel + 1, x+lx, y+ly, z+lz)

       Next
   
   Else
         
      If Rand(2) = 1 Then
      
         lCube = CreateCube()
         gCubeCnt    = gCubeCnt    + 1
         gMesh\cubes = gMesh\cubes + 1
         
         ScaleMesh lCube, lSize, lSize, lSize
         PositionMesh lCube, x, y, z
         AddMesh lCube, gMesh\mesh
         FreeEntity lCube

         
       EndIf
         
   EndIf

End Function


Function NewMesh.tMesh()

   Local me.tMesh
   
   me = New tMesh
   gMeshCnt = gMeshCnt + 1   
   
   me\mesh = CreateMesh(gMap)
   ;EntityColor me\mesh, Rand(128)+128,Rand(128)+128,Rand(128)+128

   Return me

End Function


Function MakeScreenShot$()

   Local lPicCnt, lFile$
 
   Repeat   
      lFile$  = "shot" + lPicCnt + ".bmp"
      lPicCnt = lPicCnt + 1
   Until Not FileType (lFile$)
   SaveBuffer FrontBuffer(), File$
   Return lFile$

End Function


[edit] Stimmt, es heisst Octree anstatt Octtree... habs mal korrigiert
B3D-Exporter für Cinema4D!(V1.4)
MD2-Exporter für Cinema4D!(final)
  • Zuletzt bearbeitet von BIG BUG am Do, Jun 14, 2007 19:48, insgesamt einmal bearbeitet
 

gigi

Betreff: Wow

BeitragSo, Jun 10, 2007 16:12
Antworten mit Zitat
Benutzer-Profile anzeigen
nicht schlecht,sieht geil aus.Hast du da noch Effekte geaddet die auch noch bei Spielen auftauchen könnten?
Anfänger Tut von mir:
http://www.blitzforum.de/forum...hp?t=26185

Kernle 32DLL

BeitragMi, Jun 13, 2007 21:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Sieht geil aus xD
erinnert mich irgentwie an die Außenhaut des unfertigen Todesstern II
aus Star Wars Ep. 6 xD
Mein PC: "Bluelight" - Xtreme Gamer PC [Video]
Meine Projekte: Cube-Wars 2010 [Worklog]
Anerkennungen: 1. Platz BCC #7 , 1. Platz BCC #22 , 3. Platz BAC #89
Ich war dabei: NRW Treff III, IV ; Frankfurter BB Treffen 2009

Dottakopf

BeitragDo, Jun 14, 2007 10:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja stimmt sieht echt sehr interessant aus !

Aber wozu braucht man dieses Prinzip ? Was ermöglicht es einem ?

mfg Dottakopf
Rechtschreibfehler gelten der allgemeinen Belustigung!

Kernle 32DLL

BeitragDo, Jun 14, 2007 13:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Man könnte daraus bestimmt ein interessantes Knobelspiel machen ^^
Mein PC: "Bluelight" - Xtreme Gamer PC [Video]
Meine Projekte: Cube-Wars 2010 [Worklog]
Anerkennungen: 1. Platz BCC #7 , 1. Platz BCC #22 , 3. Platz BAC #89
Ich war dabei: NRW Treff III, IV ; Frankfurter BB Treffen 2009

Goodjee

BeitragDo, Jun 14, 2007 13:46
Antworten mit Zitat
Benutzer-Profile anzeigen
man könnte zum beipiel einen zerstörbaren würgfel machen, in den man löcher bomben kann, wei in ein wormsterrain...

BladeRunner

Moderator

BeitragDo, Jun 14, 2007 14:25
Antworten mit Zitat
Benutzer-Profile anzeigen
http://de.wikipedia.org/wiki/Octree
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group