Rauchpartikel als SingleSurface behandeln

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

hectic

Sieger des IS Talentwettbewerb 2006

Betreff: Rauchpartikel als SingleSurface behandeln

BeitragDo, Apr 06, 2006 20:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo, kann mir hierbei einer weiterhelfen? Ich möchte für mein Spiel Rauchpartikel als Singlesurface anzeigen lassen. Bisher habe ich es in meinem Testprogramm auch soweit hinbekommen (noch nichtmal sicher ob es wirklich Singlesurface ist?). Nun möchte ich aber auch EntityColor und EntityAlpha mit einbeziehen (auskommentierter Befehl). Dann kommt aber eine Fehlermeldung (Entity ist not a model). Weiß einer wie man sonst Singlesurface anwenden könnte und denoch auf Alpha und Color nicht zu verzichten?

Das Programm ist selbständig lauffähig:

Code: [AUSKLAPPEN]
Graphics3D 800,600,0,2
SetBuffer BackBuffer()

camera=CreateCamera()
PositionEntity camera,19.5,14.5,-21

referenz=CreateMesh()
face=CreateSurface(referenz)
v0=AddVertex(face,4.3,-2.5,0)
v1=AddVertex(face,-4.3,-2.5,0)
v2=AddVertex(face,0,5,0)
AddTriangle(face,v0,v1,v2)
ScaleMesh referenz,.1,.1,1
UpdateNormals referenz
HideEntity referenz

Dim pivot(1199)
For m=0 To 1199
 pivot(m)=CreatePivot()
 CopyEntity(referenz,pivot(m))
Next




While Not KeyHit(1)
 w=w+1

 For y=0 To 29
  For x=0 To 39
   PositionEntity pivot(x+y*40),x,y,0
   RotateEntity pivot(x+y*40),0,0,w
   ;EntityColor pivot(x+y*40),Rand(255),Rand(255),Rand(255)
  Next
 Next

 RenderWorld
 Flip
Wend
End

Danke im vorraus...

TheProgrammer

BeitragDo, Apr 06, 2006 21:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Benutz einfach für dein Mesh EntityFX mesh,2, um Vertex-Color zu aktivieren. Dann kannste mit VertexColor Farbe und Alphawert für jeden Vertex einstellen.

Achtung: In diesem Modus setzt der Z-Buffer bei diesem Mesh aus.

edit: Für Singlesurfaces musst du in jedem Frame dein Mesh löschen, neu erstellen und die Position für die einzelnen Particles neu berechnen.
aktuelles Projekt: The last day of human being

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDo, Apr 06, 2006 21:37
Antworten mit Zitat
Benutzer-Profile anzeigen
/EDIT2: Kannst du das ein bisschen besser erläutern?

/EDIT1: Das mit Z-Buffer ist egal, da ich die Partikel eh in eine eigene EntityOrder unter bringe...

s_m_w

BeitragFr, Apr 07, 2006 10:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Macht zwar augenkrebs aber funktioniert:

Code: [AUSKLAPPEN]
Graphics3D 800,600,0,2
SetBuffer BackBuffer()
SeedRnd MilliSecs()
camera=CreateCamera()
PositionEntity camera,19.5,14.5,-21

referenz=CreateMesh()
EntityFX referenz,2
face=CreateSurface(referenz)
v0=AddVertex(face,4.3,-2.5,0)
v1=AddVertex(face,-4.3,-2.5,0)
v2=AddVertex(face,0,5,0)
AddTriangle(face,v0,v1,v2)
ScaleMesh referenz,.1,.1,1
UpdateNormals referenz
HideEntity referenz

Dim pivot(1199)
For m=0 To 1199
 pivot(m)=CreatePivot()
 CopyEntity(referenz,pivot(m))
Next


While Not KeyHit(1)
 w=w+1

 For y=0 To 29
  For x=0 To 39
   PositionEntity pivot(x+y*40),x,y,0
   RotateEntity pivot(x+y*40),0,0,w
   VertexColor face,v0,Rand(255),Rand(255),Rand(255)
   VertexColor face,v1,Rand(255),Rand(255),Rand(255)
   VertexColor face,v2,Rand(255),Rand(255),Rand(255)
  Next
 Next

 RenderWorld
 Flip
Wend
End
Sheep Happens

hectic

Sieger des IS Talentwettbewerb 2006

BeitragFr, Apr 07, 2006 12:45
Antworten mit Zitat
Benutzer-Profile anzeigen
@s_m_w, hmmm. Es funktioniert, nur leider für das gesammte Mesh. Da es Rauchpartikel sein sollen, muß ja jedes einzelnd eingefärbt werden können. Jetzt wird zwar bei jedem zeichnen eines Triangle die Einfärbung durchgeführt, aber dieses gild dann für das gesammte Mesh. Kann man das nicht separatisieren?

Habe allein gestern mich 6 Stunden wieder mit dem Thema aussereinander gesetzt. Leider ohne Erfolg. Beispiele im Internet haben auch alle nicht die Einzelbehandlung jedes Triangles berücksichtigt, sondern nur so, wie es bei mir auch ist... Confused
 

Dreamora

BeitragFr, Apr 07, 2006 14:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Dafür dass du dich stundenlang damit auseinander gesetzt hast, ist die Antwort lachhaft, sorry. Wenn du das nächste Mal was versuchst vorzulügen, dann doch bitte etwas glaubhafteres.

VertexColor setzt nämlich Vertexfarbe wie auch Alpha.

-> www.blitzbase.de
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

hectic

Sieger des IS Talentwettbewerb 2006

BeitragFr, Apr 07, 2006 14:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Entschuldige mal, ob ich mich stundenlang damit beschäftigt habe oder nicht, weiß ich wohl am besten. Und gelogen war es nicht. Wenn du mir aber mal ein Link oder ein Beispiel zusenden könntest, so währe mir geholfen. Aber auf so was habe ich echt kein bok! Ich habe einige Beispiele gefunden, aber keines welches MEIN PROBLEM zu lösen vermag. Das Beispiel von s_m_w funktioniert nur in der Richtung, dass alle Triangles verändert werden, eine Einzelbehandlung einzelner Triangles ist so nicht möglich.

Also wenn du es weißt wie das geht, dann währe mal eine kleine Hilfestellung sehr nützlich.

Ich möchte (hier am Beispielcode) 1200 Triangles erstellen, wo jedes einzelne per VertexColor und Vertexalpha manipuliert werden kann. Das ganze soll als Singlesurface behandelt werden. Ob mein Beispiel wirklich Singlesurface ist, bin ich mir in diesem nichtmal sicher (habe ich auch im ersten Post so geschrieben).

Ich gehöre sicherlich nicht zu den Leuten die ständig mit irgendwelchen dummen Fragen aufkommen und mit ständigem "wie geht das?", "kannst du mal ein Code dazu schreiben? Wenn’s geht sofort!" und blaa, blaa, blaaa. Vielleicht mal das zu Gemüte führen.

Folgendes Beispiel http://www.blitzbasic.com/code...p?code=437 zB, hier im Forum ganz groß erwähnt, macht genau nicht das, was ich brauche.

Beispiele wie zB aus https://www.blitzforum.de/view...le+surface sind mehr als lachhaft. Da werden stolz Singlesurface -'Engines' vorgestellt, ohne Code! Zum download gibt es nur eine exe. Hoi, toll! Das sind echte Helden für mich.

Singlesurface Particleengines werden hier anscheinend wie wertvolle Güter behandelt. Keine Ahnung was das soll?..
 

Dreamora

BeitragFr, Apr 07, 2006 15:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Gibt auf Blitzbasic.com in der Toolbox - other libs mehrere freie SingleSurface Partikelsysteme, darunter auch das von Noel (Lotus Particle System), das ich nach Particle Candy als mächtigstes Partikelsystem für Blitz3D erachte.


Das ändern einzelner Vertices ist nicht möglich. Du musst bei jeder Änderung alles neu eintragen (wenn nur die Vertices Positionen sich ändern, die Triangles bzw. deren Anzahl aber nicht, dann reicht das beim clearen der Surface entsprechend anzugeben).
Auch Partikelsysteme wie Lotus und ParticleCandy tun dies.

Ich sagte auch net, dass du dich nicht prinzipiell damit beschäftigt hast, sondern auf jeden Fall nicht, wie man die Farbe eines einzelnen Vertices ändert. Solltest du noch die englische Hilfe haben, empfehle ich dir übrigens auch, direkt die Hilfe von Blitzbase.de zu ziehen. In der Docu sind vor allem auch "nicht dokumentierte" Befehle wie SetCubeMap und weitere drin, die nicht gerade unwichtig sind.

Und das du nicht mit "dummen Fragen" kommst, ist mir klar.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Black Spider

BeitragFr, Apr 07, 2006 16:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Du kannst EntityAlpha und EntityColor nur auf das gesamte Mesh´ anwenden.
Wenn du die Einzelnen Flächen willst, musst du mit VertexAlpha und VertexColor arbeiten...
Coming soon:
http://img132.imageshack.us/im...im2ab6.gif
 

BIG BUG

BeitragFr, Apr 07, 2006 18:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie TheProgrammer schon angedeutet hat, ist Dein Beispiel nicht das, was allgemein als SingleSurface verstanden wird. Es liegt zwar generell nur ein Surface im Speicher, aber jedes wird als einzelnes Entity behandelt, wodurch es für die Grafikkarte eben wieder mehrere Objekte sind und der Geschwindigkeitsvorteil flöten geht.

Da aber alle Entities genau auf Dein eines Surface verweisen, wirkt sich hier jede Änderung eben für alle Partikel aus.

Richtig wäre hier, einen einzigen Mesh zu erstellen, der aber für jedes Partikel eigene Vertexpunkte und Polygone enthält(z.B. mit AddMesh). Die Positionen der Vertexpunkte musst Du beim Animieren dann immer neu berechnen.
So klappt das dann auch mit den VertexColor/-Alphabefehlen...
B3D-Exporter für Cinema4D!(V1.4)
MD2-Exporter für Cinema4D!(final)
 

Dreamora

BeitragFr, Apr 07, 2006 20:18
Antworten mit Zitat
Benutzer-Profile anzeigen
VertexColor setzt alle 4 Farben, also Rot, Grün, Blau UND Alpha!

VertexAlpha gibt nur Alpha zurück, damit kann mans nicht setzen.
Aber eben, wenn du ein mächtiges Partikelsystem suchst: Lotus. Dazu sollte im englischen Forum auch ein Partikeleditor seine runden drehen, wenn er noch da ist.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Black Spider

BeitragSa, Apr 08, 2006 11:18
Antworten mit Zitat
Benutzer-Profile anzeigen
nee, ich hab ne Singlesurface PartikelEngine gecodet. Allerdings würde das was du sagst jetzt den Fehler mit VertexAlpha erklären (meine Rauchpartikel wurden nicht durchsichtiger...)...
Rolling Eyes man war das n dämlicher fehler...
Coming soon:
http://img132.imageshack.us/im...im2ab6.gif

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSa, Apr 08, 2006 13:26
Antworten mit Zitat
Benutzer-Profile anzeigen
ok, danke erstmal für eure Antworten. Jeder hat mir ein kleines Puzzlestück zum Verstäntnis des gesammten dazu gegeben. Very Happy zZ überlege ich mir, welche Methode von beiden unten genannten ich anwenden soll. Werde mal beide austesten und das Ergebnis der Geschwindigkeitsunterschiede hier posten.

1.) Möglichkeit:
Man erstellt zu Anfang die Maximalanzahl im Spiel einsetzbarer Partikel (Triangles) und recycled sie dann immer wieder. Die Bewegungen werden dann relativ mit VertexCoords manipuliert. Wird ein Partikel durch die Alphaausblendung 'so alt' das man es nicht mehr sehen kann, so verschiebt man es ein paar Kilometer vom Bildschirm weg, um sicher zu stellen das der Spieler nie diesen Ort der Müllhalde erreichen wird.

2.) Möglichkeit:
Man erstellt in jedem Schleifendurchlauf die Triangles neu. Vor jedem neuerstellen, wird das Surfaces per ClearSurface gelöscht. Beim erstellen können dann absolute Positionierungen angewand werden.

Ich neige eher zur zweiten Möglichkeit, da mir die 'Müllhalde' nicht so gefällt. Auch das mit dem Auslesen der Position und anschliessender Verschiebung, ist nicht grad das, was ich mir besoders gerne als Code vorstellen mag.

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMo, Apr 10, 2006 2:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Hier das Ergebnis meiner Singlesurface '-Maschine'. Bei mir mit ~232 FPS bei 2000 Triangles (Objekte).
Einzelbehandlung von: Rotations, Größen, Farb und Alpha -Änderung...
Mit ENTER kann man 'Schub' geben...

Code: [AUSKLAPPEN]
Graphics3D 800,600,0,1
SetBuffer BackBuffer()

Global camera=CreateCamera()
PositionEntity camera,0,0,-40
CameraClsColor camera,32,32,64

Const anzahl=2000

Type flare
 Field xp#
 Field yp#
 Field xg#
 Field yg#
 Field rp#
 Field rg#
 Field pa#
End Type

Global wkc#[90]
Global wks#[90]
For wk=0 To 90
 wkc[wk]=Cos(wk*4)*3
 wks[wk]=Sin(wk*4)*3
Next

brush=CreateBrush()   
BrushFX brush,35
mesh=CreateMesh()
face=CreateSurface(mesh,brush)

For q=1 To anzahl
 v0=AddVertex(face,0,32767,0)
 v1=AddVertex(face,0,32767,0)
 v2=AddVertex(face,0,32767,0)
 AddTriangle face,v0,v1,v2
Next

FreeBrush brush




;HAUPTSCHLEIFE
While Not KeyHit(1)

 ;Partikel erzeugen
 If KeyDown(28);ENTER
  f.flare=New flare
  f\xp=0
  f\yp=0
  s#=20.0/anzahl
  f\xg=Rnd(-s,s)+Rnd(-s,s)
  f\yg=Rnd(-s,s)+Rnd(-s,s)
  f\rg=Rnd(-.2,.2)
  f\rp=0
  f\pa=1
 End If

 zaehler=0

 ;Partikel animieren
 For f.flare=Each flare
  f\xp=f\xp+f\xg
  f\yp=f\yp+f\yg
  f\rp=f\rp+f\rg
  If f\rp>30 f\rp=f\rp-30
  If f\rp<0 f\rp=f\rp+30

  s#=f\pa/anzahl*2222
  r=500-s/3
  g=400-s/2
  b=300-s

  VertexCoords face,zaehler*3,f\xp+wkc[f\rp]*f\pa/anzahl,f\yp+wks[f\rp]*f\pa/anzahl,0
  VertexCoords face,zaehler*3+1,f\xp+wkc[f\rp+60]*f\pa/anzahl,f\yp+wks[f\rp+60]*f\pa/anzahl,0
  VertexCoords face,zaehler*3+2,f\xp+wkc[f\rp+30]*f\pa/anzahl,f\yp+wks[f\rp+30]*f\pa/anzahl,0
  VertexColor face,zaehler*3,r,g,b,1-f\pa/anzahl
  VertexColor face,zaehler*3+1,r,g,b,1-f\pa/anzahl
  VertexColor face,zaehler*3+2,r,g,b,1-f\pa/anzahl
  If f\pa>anzahl-1 Delete f Else f\pa=f\pa+1
  zaehler=zaehler+1
 Next

 VertexCoords face,zaehler*3,0,32767,0
 VertexCoords face,zaehler*3+1,0,32767,0
 VertexCoords face,zaehler*3+2,0,32767,0

 frame=frame+1
 ms=MilliSecs()
 If ms>mt mt=ms+250:fps=frame*4:frame=0

 RenderWorld
 Text 0,0,fps
 Text 0,20,zaehler
 Flip 0
Wend
End

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group