VortexFX | V1.0.55 - A 3D Particle system for all your 3D Particle needs

Current Version: 1.0.55 - Pure Performance

Github - Documentation - Creator Hub - DevForum

Introduction

Hello Developers and welcome to the VortexFX DevForum post!

VortexFX is highly versatile and optimized to a good degree, this system contains every capable property that regular 2D particles contain, but many MANY more features and additions, such as smart collision for each particle that allows bouncing particles or particles that move out of the way of players, like bouncy balls or fire flies

You can change every single property to your hearts content, as each property has been stress tested with pairing of other properties, including emitters that have no other properties.


Expectations

VortexFX is a 3D Particle system that is subjectively better than the other 3D particle systems youā€™ll find around in the DevForum.

Model Emission:

VortexFX is completely compatible with emitting Models and MeshParts, every single property should be fully working with Models and MeshParts, if not, please let me know here or using the report feature in the documentation.

Collision Detection:

Particles donā€™t need to just float through everything. They can bounce off surfaces, avoid obstacles, or even react to players and the environment. Imagine fireflies moving around players or debris realistically bouncing off the ground.

React to Sound:

Particles can sync up with audio, responding to the loudness or beat of your music or sounds, which is perfect for things like rhythm games or musical environments, VortexFX audio implementation is unmatched with other systems, while color, speed, and size can be found across the DevForum, VortexFX includes independency and automatic beat detection (A way that VortexFX tries to find out when a beat happens in the audio if youā€™re using music.)

Trajectorial Paths:

This lets particles follow specific paths. You can create effects like a stream of particles flowing along a river or fireflies following a smooth, pre-determined flight path around an area. Or if you really know how to use it, you can simulate orbit or a black hole.

Interaction with the environment:

VortexFX is fully integrated into 3D space and the environment. Particles can be affected by wind, inherit velocity from moving objects, or follow custom paths, making them feel like a natural part of your environment.

Instability:

You can add some randomness to your particles with the instability feature, which gives particles a jittery, natural look. Perfect for effects like flickering fire, smoke, or anything that shouldnā€™t look perfectly smooth.

Flipbooks:

Add animated textures to your particles using flipbook animations. This lets you create effects like swirling smoke, evolving magical orbs, or any animation that needs to play out across multiple frames.


Installation

  1. Get VortexFX from the Roblox library or download it from the documentation.
  2. Add the module into your game, preferably in ReplicatedStorage.
  3. Make sure you have the ObjectCache module installed as well, you donā€™t fully need to worry about this as it comes preinstalled with the module.

Usage

local ParticleEmitter3D = require(path.to.ParticleEmitter3D)

local emitter = ParticleEmitter3D.new(adornee)
emitter:Create({
    -- Place particle properties here
})
emitter:Start()

Documentation

This system has itā€™s own full documentation where you can see tutorials, examples, how to use every property, and even a few free templates to use.

Visit the documentation here


Installation

To install the system and use it for yourself, head to the documentation installation page or go to the Roblox Creator Hub, both work perfectly fine for setup.
Once youā€™ve downloaded or gotten the module, head into a studio game and drag and drop the module into the game from the Toolbar or from your File Explorer into the studio viewport.
After you have it in your game, simply drag it into ReplicatedStorage, or ServerScriptService.

Keep in mind the module is strongly recommended to be used in ReplicatedStorage and for all particles to be client-sided, as running mass amounts of particles on the server can lag the game for all players.


Video Examples

These are videos taken from the free templates that are provided on the given documentation.
You may need to Fullscreen some of them to fully see the detail.

Click the expand video examples





Q&A

This Q&A will expand the longer this page is up, as for now there are a few questions Iā€™ve received while testing.

Q: What can I expect from using VortexFX

A: You can expect to have more interactive particles than pretty looking, this system has plenty of uses, but more of the properties and ways youā€™ll end up using this are for interaction with the world.

Q: What would this be used for in a regular game

A: Iā€™ve gotten this question a few times, and I can say that this system is in no way meant to replace 2D particles, as 2D particles look better on occasion and are much more performant, as for what you would use it for, it would probably be used for an extra effect, like when a player destroys an object, 3D particles could emit.
The things you can use this system for are limitless, it just matters what your imagination can think up.

Q: How optimized is this?

A: Iā€™ve spent hours, hours, and a few more hours optimizing this system as much as I could without making it look bad, there are a few spikes here and there when lots of particles, but the only time youā€™ll be using hundreds of particles is quite rare.

Thatā€™s all folks

This page will continue to expand with more features, properties, Q&A, and much more the longer it exists, Iā€™ll try to respond to every request and issue in this post, however if you really want a guaranteed response, write a report in the documentation.


License

This project is licensed under a Custom Provision License. Please read the license terms before using this system in your projects to be aware of what you can and canā€™t do.


Created entirely by Aeresei/Fancy Ducc
Special thanks to the Roblox developer community for their support and feedback.

55 Likes

Finally someone did this :0 nice job

3 Likes

Amazing resource! Thank you for your contribution to the forum, best wishes with maintenance of the resource if you still decide to do it. :smile:

2 Likes

This is so BEAUTIFUL!!!
You did so great with this resource, and Iā€™d happily use it :slight_smile:

Your future is bright!

3 Likes

Although I havenā€™t tested it out yet, it seems very promising.

I have a few questions: First, is there any possibility of developing a plugin for visualizing particles to simplify the process? Also, will you add support for flipbook meshes? what i by mean this is like cycling a lot of textures through a mesh so it looks animated. Finally, do you have any intention to use ObjectCache instead of PartCache? Thank you.

Edit: Correct me if Iā€™m wrong, but am i supposed to use ā€˜ConstantFunctionā€™ to make flipbooks meshes?

2 Likes

A plugin to add onto the system is actually a high possibility, Iā€™ve got experience in creating custom made plugins and I believe that a plugin might be sooner than youā€™d think!

As for a custom flipbook property, that as well could be possible to create, however the MeshID option is deprecated and replaced with a reference object, I could bring only part of it back that changes the texture and mesh of the particle.

Iā€™m not actually familiar with ObjectCache so Iā€™ll have to check it out, if itā€™s more performant than PartCache then you best believe itā€™ll be added.

In the meantime of flipbook options, I believe that ConstantFunction would be your best choice, as it runs independently from each particle.

2 Likes

Update 1.0.1 - Flipbooks

Module Changes:

  • Added ObjectCache
  • Removed PartCache
  • Removed FastCastRedux
  • Changed PartCacheFolder > ParticleCache

Property Changes:

  • Added Custom Particle Flipbook

Documentation Changes:

  • Added Update Log
  • Added Advanced Properties > Flipbook
  • Added ObjectCache Prerequisite
  • Removed PartCache Prerequisite

Github Changes:

  • Added ObjectCache Note
  • Removed PartCache Note
  • Fixed Creator Hub linking to random roblox game
3 Likes

Damn that was crazy fast, now we only need the plugin :fire: :fire: :fire: :fire:

1 Like

Plugin in progress
It could be in development for a while so donā€™t expect anything too soon.

2 Likes

Update 1.0.2 - Stuff I forgot to do

  • Added New Page Particle Commands
  • Added Function FreezeParticle
  • Added Function UnfreezeParticle
  • Added Function GetActiveParticlesCount
  • Added Function ChangeParticleProperty
  • Added Function DestroyParticle
  • Added Function SetParticlePosition
  • Added Function SetParticleOrientation
  • Added Function ResetRotation
  • Added Property VelocityInheritance
  • Added Free Template Falling Leaves
  • Added Feature Vector3 can now be used with Size
  • Removed Property LockedToPart
  • Removed Obsolete functions and code
  • Changed Property Rotation
  • Changed Property RotationSpeed
  • Fixed False flipbook warning
  • Fixed SpreadAngle Y axis not doing anything
1 Like

Can you fix the link to creator hub?

Also can you make an example place that is editable that shows some of the cool features ?

Thanks

2 Likes

Sorry about the access bug, forgot to update the creator hub links.
As for the example place, I could likely work on that pretty soon but Iā€™ts already 11 pm and I am very tired.

Update 1.0.3 - Gun

  • Added Free Template Gun
  • Bunch of fixes

Hello! First off, I wanted to say fantastic work on the module, it looks great. Iā€™m using it right now to try and create a basic ā€˜afterimageā€™ effect using the characterā€™s model as the emitterā€™s ReferenceObject, but I run into this issue in the output.

image

Here is my code. This is inside a local script

local ReplicatedStorage = game:GetService("ReplicatedStorage")

local player = game.Players.LocalPlayer
local character : Model = player.Character or player.CharacterAdded:Wait()
local humanoidRootPart : Part = character:WaitForChild("HumanoidRootPart")
local torso : Part = character:WaitForChild("Torso")

local ParticleEmitter3D = require(ReplicatedStorage.ParticleEmitter3D)

local emitter = ParticleEmitter3D.new(humanoidRootPart)

character.PrimaryPart = humanoidRootPart

emitter:Create({
	Color = torso.Color,
	EmissionDirection = Enum.NormalId.Back,
	Rate = 2,
	ReferenceObject = character,
})

emitter:Start()

task.wait(5)

emitter:Kill()

The error traces back to this line in the module.

if self.referenceObject and self.referenceObject ~= self.adornee then
		if self.referenceObject:IsA("Model") then
			part = self.referenceObject:Clone()
			originalSize = part.PrimaryPart.Size
		else
			part = self.referenceObject:Clone()
			originalSize = part.Size
		end
-- continue rest of script

Itā€™s especially weird because earlier in the script thereā€™s a warn statement against not having a PrimaryPart.

	if self.referenceObject then
		if self.referenceObject:IsA("Model") then
			if not self.referenceObject.PrimaryPart then
				warn("āš ļø ParticleEmitter3D: ReferenceObject Model must have a PrimaryPart set. āš ļø")
				self.referenceObject = nil
			end
		elseif not self.referenceObject:IsA("BasePart") then
			warn("āš ļø ParticleEmitter3D: ReferenceObject must be either a BasePart or a Model with a PrimaryPart. āš ļø")
			self.referenceObject = nil
		end
	end

Thanks in advance!

1 Like

Excellentā€¦ are you also going to create an editable test demo place?

thanks

1 Like

Gun? where is the gun?

image

1 Like

Have you tried using any other object instead of the character?

1 Like

this seems pretty cool! nice job :slight_smile:

1 Like

I tried using the Bouncy Balls template in the documentation, along with the basic code in the Usage tab of the documentation, but I get met with this in the output.

image

1 Like

Woah my notifications completely broke

Sorry for the lack of responses everyone

Hello! First off, I wanted to say fantastic work on the module, it looks great. Iā€™m using it right now to try and create a basic ā€˜afterimageā€™ effect using the characterā€™s model as the emitterā€™s ReferenceObject, but I run into this issue in the output.

Yeah I did some stuff with changing the way the module handles models.
I completely forgot a few things with models and Iā€™ll be releasing a fix asap.

Excellentā€¦ are you also going to create an editable test demo place?

I most likely will actually but recently my keyboard broke a few keys and Iā€™ve been preoccupied with trying to fix it (comma key. windows key. F9. and the key between H and K for those of you who care)

I tried using the Bouncy Balls template in the documentation, along with the basic code in the Usage tab of the documentation, but I get met with this in the output.

I also forgot that I changed the Vector2 of spread angle to a Vector3 as for some reason the Y axis was causing a LOT of issues

Once again I am VERY sorry for not responding. my notifications broke along with my keyboard and I WILL be releasing a fix for all of this today.

1 Like