[B3D] Real-Time Fluid Dynamics for Games ala Jos Stam

Übersicht BlitzBasic Codearchiv

Gehe zu Seite Zurück  1, 2

Neue Antwort erstellen

rctuner

BeitragMo, Feb 12, 2007 19:56
Antworten mit Zitat
Benutzer-Profile anzeigen
HI,

nein ich meine, dass der Fluid die dahinter liegenden Objekte verdecken sollte. Die 3d Objekte sind immer im fordergrund als hätte man EntityOrder eingestellt.
[Y[our Film, Game ]M[akers and more [F]un!
www.Master-Entertainment.de.vu

[AMD 6000+ X2 @ 6400+][2GB RAM][NVidia 8800GT 512 MB]
 

Krümel

BeitragDi, Feb 13, 2007 0:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Einfach die Objekte nach hinten schieben.

Wenn du in der Funktion "MakeMesh"
EntityFX mesh , 1 + 2 + 32 verwendest, ist der Rauch Alpha-geblendet.

Probier mal diese Version aus:


Code: [AUSKLAPPEN]

;REAL-TIME FLUID
;--------------------------------------------
;instructions: press mousebutton , move mouse

Const FLOWSPEED# = 1.5
Const PRECISION% = 15
Const SIZE = 5
Const GRW = 600 , GRH = 400
Const GRX = (GRW / SIZE)
Const GRY = (GRH / SIZE)

Graphics3D GRW , GRH , 32 , 2
SetBuffer BackBuffer()

Global Camera = CreateCamera()
PositionEntity Camera , 0 , 0 , - (GRW * 0.5) / (SIZE) + 1

Dim VelX#(GRX  , GRY  , 2)
Dim VelY#(GRX  , GRY  , 2)

Dim Red#(GRX  , GRY  , 2)
Dim Grn#(GRX  , GRY  , 2)
Dim Blu#(GRX  , GRY  , 2)

Dim Vertex%(GRX  , GRY)

Global Mesh = makeMesh()

Function AddVelocity(x , y , vx# , vy#)
   Local xx,yy
   
   For yy = y - 2 To y + 2
   For xx = x - 2 To x + 2
      If xx > 0 And xx < grx - 1 And yy > 0 And yy < gry - 1
         VelX(xx , yy , 0) = VelX(xx , yy , 0) + vx
         VelY(xx , yy , 0) = VelY(xx , yy , 0) + vy
      EndIf
   Next
   Next   
End Function

Function AddColor(x , y , r , g , b)
   Local xx,yy
   
   For yy = y - 2 To y + 2
   For xx = x - 2 To x + 2
      If xx > 0 And xx < grx - 1 And yy > 0 And yy < gry - 1
         Red(xx , yy , 0) = Red(xx , yy , 0) + r
         Grn(xx , yy , 0) = Grn(xx , yy , 0) + g
         Blu(xx , yy , 0) = Blu(xx , yy , 0) + b
      EndIf
   Next
   Next      
End Function

Function Animation( d# )
   Local h = (GRX-1) * (GRY-1) , hh# = 1.0 / h
   Local speed# = d * h * FLOWSPEED
   Local k , x , y , x0 , y0 , x1 , y1
   Local xx# , yy# , s0# , s1# , t0# , t1#

   ;Advect
   For y = 0 To GRY - 1
      For x = 0 To GRX - 1
         xx# = x - speed * VelX(x , y , 1)   
         yy# = y - speed * VelY(x , y , 1)
      
         If xx < 0 xx = 0 Else If xx > GRX-1 xx = GRX-1
         If yy < 0 yy = 0 Else If yy > GRY-1 yy = GRY-1
      
         x0 = Floor(xx) : x1 = x0 + 1
         y0 = Floor(yy) : y1 = y0 + 1
      
         s1# = xx - x0 : s0# = 1.0 - s1
         t1# = yy - y0 : t0# = 1.0 - t1
      
         VelX(x , y , 1) = s0 * (t0 * VelX(x0 , y0 , 0) + t1 * VelX(x0 , y1 , 0)) + s1 * (t0 * VelX(x1 , y0 , 0) + t1 * VelX(x1 , y1 , 0))
         VelY(x , y , 1) = s0 * (t0 * VelY(x0 , y0 , 0) + t1 * VelY(x0 , y1 , 0)) + s1 * (t0 * VelY(x1 , y0 , 0) + t1 * VelY(x1 , y1 , 0))

         Red(x , y , 1) = s0 * (t0 * Red(x0 , y0 , 0) + t1 * Red(x0 , y1 , 0)) + s1 * (t0 * Red(x1 , y0 , 0) + t1 * Red(x1 , y1 , 0))
         Grn(x , y , 1) = s0 * (t0 * Grn(x0 , y0 , 0) + t1 * Grn(x0 , y1 , 0)) + s1 * (t0 * Grn(x1 , y0 , 0) + t1 * Grn(x1 , y1 , 0))
         Blu(x , y , 1) = s0 * (t0 * Blu(x0 , y0 , 0) + t1 * Blu(x0 , y1 , 0)) + s1 * (t0 * Blu(x1 , y0 , 0) + t1 * Blu(x1 , y1 , 0))            
      Next
   Next

   ;Project
   For y = 1 To GRY - 2
      For x = 1 To GRX - 2
         VelY(x , y , 0) =  - 0.5 * h * (VelX(x + 1 , y , 1) - VelX(x - 1 , y , 1) + VelY(x , y + 1 , 1) - VelY(x , y - 1 , 1))
         VelX(x , y , 0) = 0
      Next
   Next   
   For k = 1 To PRECISION
      For y = 1 To GRY - 2
         For x = 1 To GRX - 2
            VelX(x , y , 0) = (VelY(x , y , 0) + VelX(x - 1 , y , 0) + VelX(x + 1 , y , 0) + VelX(x , y - 1 , 0) + VelX(x , y + 1 , 0)) * 0.25
         Next
      Next
   Next
   For y = 1 To GRY - 2
      For x = 1 To GRX - 2
         VelX(x , y , 1) = VelX(x , y , 1) - 0.5 * (VelX(x + 1 , y , 0) - VelX(x - 1 , y , 0)) * hh
         VelY(x , y , 1) = VelY(x , y , 1) - 0.5 * (Velx(x , y + 1 , 0) - Velx(x , y - 1 , 0)) * hh
      Next
   Next

   ;Diffuse
   For y = 1 To GRY - 2
      For x = 1 To GRX - 2
         VelX(x , y , 0) = VelX(x , y , 1);* 0.98 + (VelX(x - 1 , y , 1) + VelX(x + 1 , y , 1) + VelX(x , y - 1 , 1) + VelX(x , y + 1 , 1)) * (0.25 * 0.02)
         VelY(x , y , 0) = VelY(x , y , 1);* 0.98 + (VelY(x - 1 , y , 1) + VelY(x + 1 , y , 1) + VelY(x , y - 1 , 1) + VelY(x , y + 1 , 1)) * (0.25 * 0.02)
         
         Red(x , y , 0) = Red(x , y , 1)
         Grn(x , y , 0) = Grn(x , y , 1)
         Blu(x , y , 0) = Blu(x , y , 1)                  
      Next
   Next


   ;Test bounds
   For x = 1 To GRX-2
      VelY(x , 1       , 1) =  Abs(VelY(x , 2       , 1))
      VelY(x , GRY - 2 , 1) = -Abs(VelY(x , GRY - 3 , 1))
   Next
   For y = 1 To GRY-2
      VelX(1       , y , 1) =  Abs(VelX(2       , y , 1))
      VelX(GRX - 2 , y , 1) = -Abs(VelX(GRX - 3 , y , 1))
   Next
End Function

Function MakeMesh()
   Local x , y
   Local mesh = CreateMesh()
   Local surf = CreateSurface(Mesh)
   
   EntityFX mesh , 1 + 2 ; + 32
   PositionEntity mesh , 0.5 - GRX * 0.5 , 0.5 - GRY * 0.5, 0

   For y = 0 To GRY - 1
      For x = 0 To GRX - 1
         Vertex(x , y) = AddVertex(surf , x  ,  GRY - y - 1  , 0 , x / Float(GRX) , 1.0 - y / Float(GRY))
      Next
   Next
   For y = 0 To GRY - 2
      For x = 0 To GRX - 2
         AddTriangle surf , Vertex(x , y) , Vertex(x + 1 , y) , Vertex(x + 1 , y + 1)
         AddTriangle surf , Vertex(x + 1 , y + 1) , Vertex(x , y + 1) , Vertex(x , y)
      Next
   Next
   
   Return mesh
End Function

Function DrawMesh()
   Local surface = GetSurface(Mesh , 1)
   Local x , y
   
   For y = 0 To GRY - 1
      For x = 0 To GRX - 1
         VertexColor surface , Vertex(x , y) , Red(x , y , 0) , Grn(x , y , 0) , Blu(x , y , 0) , (Blu(x , y , 0) *0.004)
      Next
   Next
End Function

Function Clear()
   Local x , y
   
   For y = 0 To GRY - 1
      For x = 0 To GRX - 1
         VelX(x , y , 0) = 0
         VelY(x , y , 0) = 0
         Red(x , y , 0) = 0
         Grn(x , y , 0) = 0
         Blu(x , y , 0) = 0            
      Next
   Next
End Function

Obj = CreateCube()
ScaleEntity Obj,5,5,10
PositionEntity Obj,0,0,5

Light = CreateLight(2)
PositionEntity Light , -800,500,-500

MoveMouse GRW * 0.5 , GRH * 0.5
While (GetKey() = 0)
   TurnEntity Obj , 0.5,0,0.3

   timeStep# = (MilliSecs() - oldTime) / 5000.0
   oldTime = MilliSecs()

   x = MouseX() / SIZE
   y = MouseY() / SIZE
   mxs# = MouseXSpeed() * timeStep
   mys# = MouseYSpeed() * timeStep

   If mxs <> 0 Or mys <> 0 AddVelocity(x , y , mxs , mys)

   If MouseHit(1) Color Rnd(255) , Rnd(255) , Rnd(255)
   If MouseDown(1)   AddColor (x , y , ColorRed() , ColorGreen() , ColorBlue())
   If MouseDown(2) Clear()
   
   Animation(timeStep)

   drawMesh()

   RenderWorld
   Flip 0
Wend

Gehe zu Seite Zurück  1, 2

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group