Hi
Hab mal ne Frage in bezug auf ein eigenes Particlesystem.
Ich finde das dieses Irrlicht Particlesystem schon recht gut ist, mir aber nicht genug freiheiten lässt.
Also was macht man in solch einem Fall .. ne eigene schreiben

Jetzt mein eigendliches Problem.
Sie ist zu langsam...
Hab mal im vergleich en Particlesystem von Irrlicht erstellt und Maximal 10 Particel eingestellt.
Dann habe ich meine genommen... auch 10 Particle generieren lassen.. und Da bricht dann auch die FPS schon gewaltig ein.
Das Klassensystem ist eigendlich recht einfach...
Zuerst ist da die Particlesystem Klasse.
In Ihr werden die Werte wie
ParticleSystem Klasse
Code:
Public MaxParticles As Integer
Dim Particles As New ArrayList
Public ParticleImage As String
Public ParticleSize As Single
Public StartPosition As Vector3D
Public Direction As Vector3D
Public maxToleranz_X As Integer
Public maxToleranz_y As Integer
Public maxToleranz_Z As Integer
Public Lifespan As Integer
Dim Toleranz As New Random(Environment.TickCount)
Dann kommt die Methode für das Erstellen der Particle.
ParticleSystem Klasse | Create()
Code:
Public Sub Create()
If Particles.Count < MaxParticles Then
Dim OneParticle As IrrlichtNETCP.SceneNode
Dim PMesh As AnimatedMesh = eng.SceneManager.GetMesh(My.Application.Info.DirectoryPath & "\PMesh.x")
Dim MyMesh As Mesh = PMesh.GetMesh(0, 0, 0, 100)
eng.SceneManager.MeshManipulator.SetVertexColors(MyMesh, New Color(0, 255, 255, 255))
Dim tol_X As Single = toleranz.NextDouble() * maxToleranz_X
Dim tol_Y As Single = toleranz.NextDouble() * maxToleranz_y
Dim tol_Z As Single = toleranz.NextDouble() * maxToleranz_Z
Dim wert = toleranz.NextDouble
If wert < 0.5 Then
tol_X = -tol_X
End If
wert = toleranz.NextDouble
If wert < 0.5 Then
tol_Y = -tol_Y
End If
wert = toleranz.NextDouble
If wert < 0.5 Then
tol_Z = -tol_Z
End If
Dim MaxSize As Single = toleranz.NextDouble() * ParticleSize
OneParticle = eng.SceneManager.AddMeshSceneNode(MyMesh, Nothing, -1)
OneParticle.Position = StartPosition
Dim mytexture As Texture = eng.VideoDriver.GetTexture(ParticleImage)
OneParticle.Scale = New Vector3D(0, 0, 0)
OneParticle.SetMaterialTexture(0, mytexture)
OneParticle.SetMaterialFlag(MaterialFlag.Lighting, False)
OneParticle.SetMaterialFlag(MaterialFlag.BackFaceCulling, True)
OneParticle.SetMaterialType(MaterialType.TransparentVertexAlpha)
OneParticle.SetMaterialFlag(MaterialFlag.ZWriteEnable, False)
Dim Info As New PartikelInfo
Info.Partikelobject = OneParticle
Info.Toleranz_X = tol_X
Info.Toleranz_Y = tol_Y
Info.Toleranz_Z = tol_Z
Info.MyMAxSize = MaxSize
Info.Livespan = lifespan
Info.isMAX = False
Info.isAlive = True
Particles.Add(Info)
End If
End Sub
Dann Noch die Methode Zum Positionieren usw der Particle
ParticleSystem Klasse | Strahler
Code:
Public Sub Strahler()
For i As Integer = 0 To Particles.Count - 1
Dim item As PartikelInfo = Particles.Item(i)
If item.isAlive = True Then
If item.Livespan > 0 Then
Dim part As SceneNode = item.Partikelobject
LookAtTarget(part, eng.SceneManager.ActiveCamera)
part.Position = New Vector3D(part.Position.X + Direction.X + item.Toleranz_X, part.Position.Y + Direction.Y + item.Toleranz_Y, part.Position.Z + Direction.Z + item.Toleranz_Z)
If item.isMAX = False Then
If part.Scale.X < item.MyMAxSize Then
part.Scale = New Vector3D(part.Scale.X + 0.001, part.Scale.Y + 0.001, part.Scale.Z + 0.001)
Else
item.isMAX = True
End If
Else
If part.Scale.X > 0.01 Then
part.Scale = New Vector3D(part.Scale.X - 0.001, part.Scale.Y - 0.001, part.Scale.Z - 0.001)
Else
item.isAlive = False
End If
End If
End If
Else
'Hier wird das Object dann gelöscht da es TOD ist.
End If
Next
Create()
End Sub
Und Das Ausrichten des Objectes zur Kamera.
ParticleSystem Klasse | LookAtTarget
Code:
Private Sub LookAtTarget(ByVal Part As SceneNode, ByVal Target As SceneNode)
Part.UpdateAbsolutePosition()
Dim vect As Vector3D = (Target.AbsolutePosition) - (Part.AbsolutePosition)
vect = vect.HorizontalAngle
Part.Rotation = vect
End Sub
Klasse für ParticlePartikelInfo Klasse
Code:
Public Position As Vector3D
Public Velocity As Vector3D
Public Density As Single
Public Mass As Single
Public Size As Single
Public Livespan As Integer
Public Age As Integer
Public MyMAxSize As Single
Public isMAX As Boolean
Public isAlive As Boolean
Public Partikelobject As SceneNode
Public Toleranz_X As Single
Public Toleranz_Y As Single
Public Toleranz_Z As Single
So das ist soweit alles was man dafür braucht... ist momentan nur der Anfang und auch nur ein Test...
Wie gesagt ist das alles sehr sehr Langsam.
Wie würdet Ihr die Sache angehen ??
Ps. Ich Benutze deshalb ein Modell für den Partikel, weil bei mir die Billboards nicht richtig funktionieren.
(Wenn ich eine Textur darüber spanne und VertexAlpha anschalte wird das Billboard nicht Transparent gezeichnet.
Puh war mal wieder mehr als ich schreiben wollte.