[B3D] Partikelengine
Übersicht

MatthiasBetreff: [B3D] Partikelengine |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hay. Vor einigen Tagen hab ich hier auf diesen Thread geantwortet. Es ging um Patikel. Naja um es kurz zu machen, hab ich mich hingesetzt und ein Beispiel gemacht. Es hat einige Stunden gedauert, und damit die Zeit nicht ganz so umsonst war habe ich mir gedacht vieliecht kann jemand diese Patikelengine gebrauchen.
Es kommt ganz ohne Types aus, da ich der Meinung bin das Types langsammer sind als Eindimensionale Dim Felder. Natürlich hätte ich den Code noch weiter auf Speed optiemieren können, aber dadurch wird der Code so komplieziert das gereade die Beginner ihn nicht mehr verstehen würden. https://www.blitzforum.de/foru...p;start=20 Code: [AUSKLAPPEN] Graphics3D 800,600,32,2 Global MaxPatikel=16000 Global IstPatikel Global MaxQuellPat Global PatikelUpdateTakt Global MaxPatikelStep=40 Global PatikelMesh Dim Patikel#(MaxPatikel*8) Dim QPatikel#(5000*16) Dim PatFarbe(MaxPatikelStep*4+4) SeedRnd(MilliSecs()) ;Patikel Eigenschafften ;0=QuellID ;1=XPos ;2=YPos ;3=ZPos ;4=XMove ;5=YMove ;6=ZMove ;7=MaxZyklus For I=MaxPatikelStep To 0 Step -1 R=255-J*2 R=R*(R>0) PatFarbe(I*4+0)=R ;Rot G=255-J*4 G=G*(G>0) PatFarbe(I*4+1)=G ;Grün B=0 B=B*(B>0) PatFarbe(I*4+2)=0 ;Blau J=J+1 Next InitPatikelMesh() InitCamera() CreateQuellPatikel() SetBuffer BackBuffer() Repeat MS=MilliSecs():FPSz=FPSz+1 If MS>FPSt Then FPSt=MS+999:FPS=FPSz:FPSz=0 If KeyDown(57) And MS>TastTimer Then TastTimer=MS+9:CreatePatikel(200) End If UpdatePatikel(20) ;UpdatePatikel(-1):CreatePatikel(300):TastTimer=MS ;VolleBelastung RenderWorld Text 10,10,"FPS:"+FPS+" Patikel:"+IstPatikel+" Drücke Space" Flip 0 Until KeyDown(1)=1 End Function UpdatePatikel(Takt) If MilliSecs()<PatikelUpdateTakt Then Return PatikelUpdateTakt=MilliSecs()+Takt Surf=GetSurface(PatikelMesh,1) V1=0:V2=1:V3=2:LastP=IstPatikel Shl 3 While I<IstPatikel Q=Patikel(P) Zyk=Patikel(P+7)-1:Patikel(P+7)=Zyk If Zyk<1 Then ;---ToterPatikel tauschen mit Letzten--- For K=0 To 15 Patikel(P+K)=Patikel(LastP+K) Next Q=Patikel(P) V=IstPatikel*3 ;----Den Letzten löschen---- VertexCoords Surf,V,0,0,0:Zyk=0 VertexCoords Surf,V+1,0,0,0 VertexCoords Surf,V+2,0,0,0 IstPatikel=IstPatikel-1:LastP=IstPatikel Shl 3 End If FarbWert=Zyk Shl 2 R=PatFarbe(FarbWert+0):G=PatFarbe(FarbWert+1):B=PatFarbe(FarbWert+2) X#=Patikel(P+1)+Patikel(P+4):Patikel(P+1)=X:VertexColor Surf,V1,R,G,B Y#=Patikel(P+2)+Patikel(P+5):Patikel(P+2)=Y:VertexColor Surf,V2,R,G,B Z#=Patikel(P+3)+Patikel(P+6):Patikel(P+3)=Z:VertexColor Surf,V3,R,G,B VertexCoords Surf,V1,X+QPatikel(Q+3),Y+QPatikel(Q+4),Z+QPatikel(Q+5) VertexCoords Surf,V2,X+QPatikel(Q+6),Y+QPatikel(Q+7),Z+QPatikel(Q+8) VertexCoords Surf,V3,X+QPatikel(Q+9),Y+QPatikel(Q+10),Z+QPatikel(Q+11) V1=V1+3:V2=V2+3:V3=V3+3:I=I+1:P=P+8 Wend If IstPatikel<1 Then HideEntity PatikelMesh End Function Function InitCamera() CameraPivot=CreatePivot() CamRollPiv=CreatePivot(CameraPivot) Camera=CreateCamera(CamRollPiv) MoveEntity Camera,0,0,-5 ;CameraClsColor Camera,0,0,200 Licht=CreateLight():TurnEntity Licht,45,45,0 End Function Function CreateQuellPatikel() Spalt#=0:Gr#=.02 Sphere=CreateSphere(50):Surf=GetSurface(Sphere,1) MaxV=CountVertices(Surf)-1:RotateMesh Sphere,0,0,45 For I=0 To MaxV:X#=VertexX(Surf,I) Y#=VertexY(Surf,I):Z#=VertexZ(Surf,I) If X<-Spalt Or X>Spalt Then If Y<-Spalt Or Y>Spalt Then If Z<-Spalt Or Z>Spalt Then ;-----Zum Mittlepunkt drehen TFormVector Gr#,-Gr#,0,Piv,0 QPatikel(J+3) = TFormedX#() QPatikel(J+4) = TFormedY#() QPatikel(J+5) = TFormedZ#() TFormVector -Gr#,-Gr#,0,Piv,0 QPatikel(J+6) = TFormedX#() QPatikel(J+7) = TFormedY#() QPatikel(J+8) = TFormedZ#() TFormVector 0,0,0,Piv,0 QPatikel(J+9) = TFormedX#() QPatikel(J+10) = TFormedY#() QPatikel(J+11) = TFormedZ#() MaxQuellPat=MaxQuellPat+1:QPatikel(J+0)=X QPatikel(J+1)=Y:QPatikel(J+2)=Z::J=J+16 End If End If End If Next FreeEntity Sphere End Function Function CreatePatikel(AddMaxPat) If IstPatikel=>MaxPatikel Then Return For I=0 To AddMaxPat Speed#=Rnd(.02,.1) J=Rand(MaxQuellPat)*16 PID=IstPatikel Shl 3 Patikel(PID)=J:Patikel(PID+1)=0 Patikel(PID+2)=0:Patikel(PID+3)=0 Patikel(PID+4)=QPatikel(J)*Speed Patikel(PID+5)=QPatikel(J+1)*Speed Patikel(PID+6)=QPatikel(J+2)*Speed Patikel(PID+7)=Rand(MaxPatikelStep*.75,MaxPatikelStep) IstPatikel=IstPatikel+1 If IstPatikel=>MaxPatikel Then Exit Next ShowEntity PatikelMesh End Function Function InitPatikelMesh() PatikelMesh=CreateMesh() Surf=CreateSurface(PatikelMesh):EntityFX PatikelMesh,19 For Tri=0 To MaxPatikel-1 v1 = AddVertex(surf,0,0,0,1,1) v2 = AddVertex(surf,0,0,0,0,1) v3 = AddVertex(surf,0,0,0,1,0) AddTriangle(surf,v1,v2,v3) Next End Function |
||
- Zuletzt bearbeitet von Matthias am Do, Jan 31, 2008 15:08, insgesamt 4-mal bearbeitet
gigi |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Bei mir kommt:"Array index out of bounds" | ||
Anfänger Tut von mir:
http://www.blitzforum.de/forum...hp?t=26185 |
Matthias |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Upss hatte nicht mit Debugger getestet. Habe aber jetzt den kleinen Fehler behoben. | ||
![]() |
Hip Teen |
![]() Antworten mit Zitat ![]() |
---|---|---|
Nur so: Es heißt Partikel Engine und nicht Patik Enagie. Außer du meinst was anderes ![]() |
||
Spruch der Woche: "Ahh, ein neues Gesicht?!" - "Nein, das hab ich schon länger" |
![]() |
Travis |
![]() Antworten mit Zitat ![]() |
---|---|---|
An dem Ausblenden der Partikel solltest du noch arbeiten. Das sieht etwas ruckelig aus. Ansonsten läuft's aber schön flott. | ||
www.funforge.org
Ich hasse WASD-Steuerung. Man kann alles sagen, man muss es nur vernünftig begründen können. |
![]() |
mabox |
![]() Antworten mit Zitat ![]() |
---|---|---|
Nicht schlecht, bei mir läuft es auch wenn ich dauerhaft auf der Leertaste bleibe mit ca. 400 FPS | ||
Fujitsu-Siemens Laptop, 2Ghz Intel Core2Duo Prozessor, 2GB Ram, 120GB Festplatte, ATI Mobility Radeon X1400, Windows Vista Ultimate
www.mausoft.de.tl Dönerfresser Homepage |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group