Aktuelle Zeit: 20.04.2024, 13:43

Alle Zeiten sind UTC + 1 Stunde




Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Eigene Particle Engine
BeitragVerfasst: 23.04.2008, 22:16 
Offline

Registriert: 22.04.2007, 13:12
Beiträge: 53
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 :P
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 Particle

PartikelInfo 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.

_________________
Progammiersprache: VB.NET 2005
Irrlichtversion: Irrlicht.Net CP 0.8


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Eigene Particle Engine
BeitragVerfasst: 24.04.2008, 17:44 
Offline
Moderator
Benutzeravatar

Registriert: 15.04.2007, 20:20
Beiträge: 505
Wohnort: Reelsen
Auf JEDEN Fall müssen die Partikel in einem Stück an die Grafikkarte gesendet werden, und zwar mit so viel Hardwarebeschleunigung wie geht (zB bei ner konstanten Partikelzahl Indizes als IBO von der Graka verwalten lassen).

Ansonsten hab ich da zu wenig Ahnung, um da was dazu sagen zu können.

_________________
Meine Gameengine :)
Bild


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Eigene Particle Engine
BeitragVerfasst: 25.04.2008, 20:52 
Offline

Registriert: 22.04.2007, 13:12
Beiträge: 53
Danke Danke ;) Finde das Forum hier immer besser!! Man wird hier nicht dumm angemacht und bekommt eigendlich immer hilfreiche Antworten.

Wegen den Particlen...
Hab gehört das man auch seinen eigenen Emitter schreiben kann ?
Hat da vieleicht jemand erfahrungen mit und kann mir dabei helfen..
Mir geht es jetzt nicht darum ne eigene ParticleEngine zu schreiben sondern vielmehr die vorhandenen so anzupassen das sie dynamischer sind :D.

_________________
Progammiersprache: VB.NET 2005
Irrlichtversion: Irrlicht.Net CP 0.8


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de