Multiply or Release is a popular physics-based simulation genre originally created by
MIKAN in 2021 that combines marble racing with strategic
territory warfare. The concept is simple but addictively watchable: marbles fall through a Plinko board,
landing on either a Multiply zone (which doubles the ammunition) or a Release zone (which fires
all accumulated bullets at enemy territory). The tension builds with each multiplication: will a
team release early with a weak attack, or risk waiting to multiply into the hundreds for a game-changing
assault?
Since MIKAN's original videos popularized the format, countless creators have built their own
variations using tools like Algodoo, Unity and Physion. The genre has exploded across YouTube thanks
to its perfect blend of unpredictability, strategic depth, and satisfying visual payoffs when hundreds of
bullets fire simultaneously to capture enemy territory.
Four-Color Territory Battle in Physion
This Physion simulation brings the Multiply or Release concept to life with four competing teams
(red, yellow, green, and blue) battling for territorial dominance. Each team controls a constantly
rotating cannon positioned in the center of their colored territory. As marbles fall through individual
Plinko boards, they accumulate ammunition through the multiply zones or trigger attacks through the
release zones.
When bullets are released, they fire continuously across the battlefield grid, converting enemy cells
to the attacker's color on contact. The simulation features smooth physics, particle trail effects
for bullets and marbles, and dynamic territory conversion that creates intense battles where even
losing teams can stage dramatic comebacks. The winner is the last team standing after all others have
been eliminated.
The original Multiply or Release scene created by Box
showed how much creativity the Physion community could bring to the genre, and it inspired many of
the experiments that followed. This new version continues in that spirit: building on past ideas while
opening the door for new twists, strategies, and visual styles. Whether revisiting Box’s classic
scene or trying out the updated one, there’s plenty to explore and remix in the world of Multiply or Release.
We're super excited to bring you Particle Life in Physion: a mesmerizing simulation where particles
interact through simple attraction and repulsion forces, creating surprisingly organic patterns and behaviors.
It's a beautiful demonstration of how complexity emerges from simplicity and it's really fun to play with.
Particle Life is a fascinating artificial life simulation that creates surprisingly organic behavior
from simple rules. Different colored particles are scattered across space, each following attraction
or repulsion rules toward other colors. Red particles might attract blues while repelling greens,
creating an asymmetric web of interactions that leads to unexpected complexity.
Each particle has just three properties: a type (color), a position, and a velocity.
From these simple ingredients and basic force rules, you get intricate, sometimes unexpected patterns
that look almost alive. Particles cluster, spiral, orbit, and form dynamic structures.
It's like watching microscopic organisms under a digital microscope!
Particle Life belongs to a family of simulations that demonstrate emergent behavior where complexity
arises from the interaction of individual agents following simple rules. This concept has inspired
some of the most influential work in artificial life, including Craig Reynolds' Boids, which simulated
flocking behavior, and Conway's Game of Life,
which showed how four simple rules could create astonishing complexity.
The concept traces back to John Von Neumann's 1948 work on automata, where he explored whether we
could build aggregates that could self-reproduce. Particle Life answers this question in its own way:
while particles don't reproduce, they do organize, adapt, and create patterns that mirror phenomena
we see in living systems.
What makes these simulations so compelling is their unpredictability. Through simple rules, researchers
explore how emergent behavior creates systems that evolve and adapt over time. You might set up
identical initial conditions except for one particle in a slightly different position, and watch
entirely different patterns emerge—much like how tiny changes in nature can lead to vastly different outcomes.
At its core, Particle Life is beautifully simple. Here's what makes it tick:
The Interaction Rules: Each color of particle has a relationship with every other color; it either
attracts or repels them. These relationships are stored in a simple grid called an interaction matrix.
For example, red might attract blue with a strength of +0.8, while blue repels red with -0.3. These
asymmetric relationships create the magic: particles can chase each other in circles, form clusters,
or flow like rivers.
The Force Calculation: Every frame, each particle looks at its neighbors and calculates forces
based on their colors and distances. Particles that are too close always push apart, while particles
at medium distances follow the attraction/repulsion rules. Particles far away ignore each other completely.
The Movement: Based on all these forces, each particle accelerates in a direction, moves to a new
position, and gradually slows down due to friction. Without friction, they'd speed up forever; with
too much, they'd stop moving entirely. The balance creates fluid, organic motion.
The Wrapping World: When a particle reaches the edge of the world, it wraps around to the opposite
side—like the classic game Pac-Man. This creates an infinite, seamless space where patterns can flow
continuously without hitting walls.
The Performance Trick: To simulate thousands of particles efficiently, the world is divided into
a grid. Each particle only checks for neighbors in nearby grid cells rather than checking every single
particle. This clever optimization makes real-time simulation possible without melting your computer.
Now comes the fun part: experimentation! Select the Particle Life node and open the
Property Editor. You'll find
all the adjustable properties that control how particles behave. The simulation updates instantly as
you make changes, allowing you to explore different patterns in real-time.
Here are the main settings you can adjust:
Setting
Default
What it means
seed
1
The "random start" number. Change it for a different interaction matrix and starting pattern. Same seed = same behavior.
worldWidth / Height
8 × 6
Size of the world the particles live in. Larger worlds allow for more sprawling patterns.
particleCount
2000
How many particles are in the simulation. More = denser, more complex visuals but requires more CPU power.
colorCount
4
How many different particle types (colors) there are. More types = more potential interaction rules = more complex patterns.
forceStrength
10
How strongly particles push or pull each other. Higher values = more energetic motion.
frictionFactor
0.5
How quickly particles slow down (0-1). Higher = slower, more fluid motion. Lower = faster, more chaotic behavior.
beta
0.4
The transition point between repulsion and attraction (0-1). Lower values = particles want more personal space. Higher values = particles tolerate closer proximity.
particleSize
10
How big each dot looks on screen. Purely visual—doesn't affect physics.
Start simple: Try changing just colorCount first (3-10 colors work well). Then adjust
forceStrength and beta—these have dramatic effects.
The seed is your time machine: Found something amazing? Note the seed value and you can
recreate it exactly. Want something new? Change the seed.
Balance is key: Too much force strength or too little friction creates chaos. Too much
friction or too little force creates boring, static patterns. The sweet spot is somewhere in between.
Give it time: Some patterns take 30-60 seconds to fully develop. What looks random at first
might evolve into beautiful structures.
Try extremes: Set beta to 0.1 or 0.9. Set friction to 0.1 or 0.9. Extreme values often produce
the most surprising results.
Stable lattices: Crystalline arrangements that barely move
Chase patterns: One color perpetually chasing another in endless loops
Each pattern emerges from the same underlying rules—only the parameters and random seed differ.
This is the beauty of emergent systems: infinite variety from finite rules.
Particle Life is all about play, exploration, and seeing what emerges. You don't need to understand
advanced mathematics or computer science—just try things, see what happens, and enjoy the visuals.
It's fast, accessible, and filled with surprises.
The remarkable thing about Particle Life—and emergent systems in general—is that no one programmed
the spirals, clusters, or orbits you'll see. These patterns emerge naturally from the interaction
of simple rules. In a way, you're not just running a simulation; you're creating conditions for
artificial life to evolve and organize itself.
So fire up Physion, add a Particle Life node, and start experimenting. Who knows what patterns you'll
discover? The only limit is your curiosity.
Have fun messing around, and let us know if you discover something wild, beautiful, or totally unexpected!
Physion is now equipped with audio support, thanks to the integration of the Tone.js library. In
this blog post, we'll briefly explain what Tone.js is and how you can use it to enhance your Physion
projects with audio.
While most of Physion's features are easily accessible through a user-friendly graphical interface,
audio support, at least for now, is accessible exclusively through scripting. This means that you
won't find a convenient UI tool for adding an "audio component" to your scenes. Instead, you'll need
to import the audio library into your scripts and use it to create various sounds and audio effects.
Let's dive into the process.
Before we explore how to use Tone.js in your scripts, let's briefly introduce the library.
Tone.js is a JavaScript library designed for audio and music creation on the web. It offers a
framework for synthesizing and processing sound, making it easier for developers to build interactive
music and audio applications directly in the browser.
As with all NodeScripts, the constructor is called with one argument: the Node that the script is
going to be attached to. It's the responsibility of the script to store a reference to this Node so
that a later time it can reference it. Also, in the constructor we're initializing a data member named
initialized to false to denote that the script hasn't yet initialized.
As the name suggests, the initialize method is responsible for initializing the NodeScript. In this
particular case, we need to import the Tone.js library and when this is done then create our synth
object. Later on we'll use the synth object to play our sounds.
In the update method, we simply check if we have already initialized and if not then we call our
initialize method.
Finally, in the onBeginContact method we check if the contact is touching and if we have already
created our synth and if both of these conditions are true then we go ahead and play a note via
our synth object. In this example we're playing the C4 note but any other note could be used instead.
The above example serves as a foundation for understanding how Tone.js can be integrated into your
projects, allowing you to create diverse audio experiences within your scenes. As you explore audio
support in Physion further, you'll discover many more possibilities for enhancing your creations with
audio.
In Tone.js page you can find many more examples on how this library can
be used in order to produce various sound effects.
Stay tuned for more in-depth tutorials and creative use cases for audio support in Physion with Tone.js!
A feature that up until now was missing from Physion was the ability to create graphs.
With graphs we can easily interpret data and better understand how properties of objects
participating in our simulation change over time.
You can create graphs using the graph tool.
Once the tool is selected, you can click on any body in your scene to create a graph for.
After you select a body using the graph tool, a new panel will appear in your Scene:
The header of this panel contains the title of the graph (e.g. "Linear Velocity") and two buttons
on its right side. This panel will contain the graph of the selected body.
By defult the Linear Velocity vs Time will be plotted.
At the top right of the graph panel you can find two buttons; the select button will select
the graph and make it available for changes in the property editor
and the close button will remove the graph from the Scene.
The underlying node for graphs is the GraphNode.
As with all other types of nodes, you can edit its properties via the Property Editor.
These properties are the following:
Property
Description
Default Value
bodyNodeId
The id of the BodyNode of the graph. Data for the graph is acquired from this body
""
property
The property of the BodyNode to be used in the graph. Note tha currently only the following properties are available: x position, y position, linear velocity x, linear velocity y, linear velocity, angular velocity
Up until now, the physics engine used by Physion was Box2D.
Box2D is an open source 2D physics engine written in C++ and it is used in many games and apps.
Although Box2D is a mature physics engine with many features, it doesn't "natively" support fluid simulation.
After some research on the web, I came across LiquidFun.
As mentioned in LiquidFun's website:
LiquidFun is an extension of Box2D. It adds a particle based fluid and soft body simulation to the rigid body functionality of Box2D.
As it turns out, transitioning from Box2D to LiquidFun is quite easy.
All the features supported in Box2D are also supported in LiquidFun so there's no need for any major code changes when switching to LiquidFun.
Although LiquidFun supports a rich set of features, we will start simple;
the transition to LiquidFun will have one simple goal:
Allow the user to convert a rigid body into a liquid or an elastic (soft) body.
When a rigid body is "liquified" or "elastified" it will be removed from the Scene and in its place
a new node will be added.
This new node will contain all the particles representing the liquified or elastified body.
They will remove the selected body (and its dependencies) from the Scene.
They will insert the new LiquidNode or ElasticNode in the Scene.
Note that in contrast with most commands that append new nodes in the Scene, these commands will
insert the new Node instead. The reason this is done is to have all liquids and soft bodies
stacked behind rigid bodies (which looks more realistic).
The main change in the Scene node is the addition of a particle system.
This means that when a new Scene is constructed a new particle system will be constructed with it.
All liquids and elastic bodies that will be created by the user will belong to this particle system.
A particle system has many options that can be defined but for the time being these options will
not be exposed to the user nor they will be saved in the Scene (this might be done in the future).
Also, a new property was added in the Scene.
Its name is particleIterations and its default value is 3.
The higher this value is the better (more accurate) the particle simulation will be.
The ParticleGroupNode serves as the base class for both LiquidNode and ElasticNode.
As the name suggests, this node represents a group of particles.
Each particle is round, has a fixed rotation and has the following properties:
Position
Velocity
Color
Because both of the liquify and elastify commands produce lots of particles (typically in the range of thousands)
we need to better handle how the ParticleGroupNode is saved. In order to solve this it was decided to use
(lz) compression when packing the Scene.
Some general key points for the ParticleGroupNode are:
Its x, y and angle properties are always zero and cannot be changed.
Its bounding rectangle is defined by the positions of the particles it contains.
As mentioned above, the ParticleGroupNode is a group of particles.
For the time being, the user can only select the group as a whole and individual particles within the group cannot be selected.
Ideally, for rendering the particles we would use shaders but since shaders are not yet supported in Physion
we will use a simpler approach. To render each particle a single sprite will be used.
A new (BodyNode) property was recently added in Physion.
Its name: Gravity Scale (gravityScale).
As the name suggests, the gravityScale property of a body can be used to "scale" the gravitational attraction applied to it.
In other words, the gravityScale allows you to specify a different gravity for each body.
By default, the value of this new property is 1.0 meaning that the Scene's gravity will be applied to the body.
If you change this value to say 0.5 then only half of the Scene's gravitational force will be applied to the body.
If you want to make a body float (i.e ignore gravity) you can set a gravity scale of 0.
To make a balloon-like body you can set its gravityScale to a negative number.
In the video below you can see the gravity scale in action:
Note that the minimum value of this property is -1 and its maximum value is +1.
Using this new property and some minimal scripting, the user can easily create gravity pads which are very useful in marble races and other similar simulations.
Recently, a feature request was made in Physion's Discord Server: "Add the ability to visualize the trajectory of an object".
This functionality was already implemented in the old version of Physion as you can see in the video below:
Unfortunately (and for the time being) the web version of Physion doesn't natively support tracers. The goods news is that we can implement the tracer functionality using scripting.
First, we use our initialized data member to perform a 'one-off' initialization task:
Add our graphics to the foreground layer of the scene (that our node belongs to).
In order to retrieve the scene that our node belongs to, we use the findscenenode method.
After initialization is performed, the script keeps repeating the following:
Updates the trajectory array
Draws the tracer
The updateTrajectory() method is responsible to update our trajectory array in each update. It does that by pushing the latest position of our node to the array. It also makes sure that this array doesn't grow infinetely: If the size of the trajectory array gets bigger than maxTrajectorySize then old positions will get removed.