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.