Rauchpartikel als SingleSurface behandeln
Übersicht

![]() |
hecticSieger des IS Talentwettbewerb 2006Betreff: Rauchpartikel als SingleSurface behandeln |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
/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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@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... ![]() |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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. |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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...)...
![]() |
||
Coming soon:
http://img132.imageshack.us/im...im2ab6.gif |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
ok, danke erstmal für eure Antworten. Jeder hat mir ein kleines Puzzlestück zum Verstäntnis des gesammten dazu gegeben. ![]() 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. |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group