Update 4/16/2024:
Hi Developers,
We are thrilled to announce Aerodynamics is now available in Studio Beta! The first step in our vision for fluid dynamics, this new fundamental system is integrated into the Roblox physics engine.
You can now bring realistic aerodynamic forces like lift and drag into your creations, taking your experiences to new heights (literally!).
Building upon the success of our previous Wind beta, and thanks to the feedback from the creator community, this release enables you to add Aerodynamic forces to all parts in your experiences (even avatars!).
Before we dive into the details, a few quick caveats:
-
The Aerodynamic force model included in this Studio-only Beta is still experimental and subject to change until the final release. When the force model is updated it could cause slight differences in the way your creations react to the forces and you might need to re-tune your experiences. While we may expand the API later in the beta, we expect the current API elements to be final so any scripts should not require tweaking.
-
Aerodynamics currently runs locally in Studio (edit, play, and test on a local server). It can’t be used in production experiences during the Studio Beta. We plan to have an Open Beta soon that will allow you to publish experiences. We’d like to incorporate your early feedback before releasing this to production.
With that out of the way, let’s get to the fun!
Enabling the beta
To get started with the Aerodynamics beta in Roblox Studio, follow these simple steps:
-
Open Roblox Studio and navigate to the “File” menu.
-
Click on “Beta Features”
-
Enable the “Aerodynamics” studio beta by checking the corresponding checkbox. (see screenshot below) and press Save
-
If you are prompted to restart Studio, go ahead and restart Roblox Studio
New APIs and Properties
To harness the power of Aerodynamics, we have introduced several new APIs and properties. Here’s a breakdown of what you can expect:
1. FluidForces
(Workspace enum):
-
Set the Workspace >
FluidForces
property toExperimental
to activate aerodynamic forces globally throughout your place. -
All parts will start experiencing aerodynamic drag and lift when they move.
-
Parts will also respond to any global wind specified by the
Workspace.GlobalWind
Vector3 property.
2. EnableFluidForces
(Part property):
-
This property is found under any Part instance and is set to
True
by default. -
You can disable it for specific parts to prevent them from being affected by aerodynamic forces.
-
[Studio Beta only] You may need to toggle this property off and then on again for pre-existing
MeshParts
andPartOperations
(e.g. Unions). See the Known Issues section below for more details.
3. AirDensity
(Workspace property):
-
Aerodynamic forces scale with the local air density.
-
The Workspace >
AirDensity
property allows you to modify this density in an experience. -
This property represents the air density at
y=0
, and its default corresponds to realistic sea-level air density at standard temperature and pressure. -
Note: The
AirDensity
property is expressed inRMU/stud^3
and you can use this handy units conversion guide to convert between real world and Roblox units -
The aerodynamics model also includes a decay of air density with altitude, similar to the real world. This decay is tuned so that the local air density is 5% of the Workspace >
AirDensity
at an altitude of 100,000 studs (or 28,000 meters). Belowy=0
we assume a constant density value of Workspace >AirDensity
.
Example usage:
workspace.AirDensity = 10 * workspace.AirDensity -- Modifies AirDensity to be 10x the original value
Wind Profile
In the real world, wind generally transitions from a “low” speed near the ground, where the surface slows the wind down, to a “higher” speed at several hundred to thousands of meters. The average velocity through this transition (or boundary) layer looks something like the following diagrams.
To balance simplicity with realism, the Roblox Aerodynamic system has a wind profile that automatically scales the horizontal (x-z) wind speed relative to altitude. We chose a profile that is fairly realistic for a wide variety of conditions, with the top of the transition layer at 1000 studs (or 280 meters). If you have already started playing around with the globalWind
property to get realistic looking grass / clouds / particle visuals, you might have noticed that the clouds move at a different speed from the grass. Our aerodynamic wind profile matches this behavior.
With this release, when you set workspace.globalWind
, the system interprets that as the required wind speed at a common Avatar’s head height (y=5
studs). The default wind profile automatically scales the wind according to a realistic profile such that at y=0
, the wind speed is ~10% of the globalWind
property and at y=1000
, the wind speed is ~3x the globalWind
property.
Examples
We are sure you will come up with some incredible experiences with Aerodynamics. To provide some inspiration as well as some best practices, here are some examples of how you could use Aerodynamics.
Example 1: Spinning Things
spinnything 240410.rbxl (50.3 KB)
(Updated on 4/16/2024 and re-tuned for the improved force model)
The geometry of a part affects the aerodynamic forces it experiences. This example place has a simple spinner with blades.
Instructions:
-
Try hitting run (F8) with
workspace.FluidForces
set toDefault
. Notice that the spinner simply falls to the ground without any aerodynamic forces that act on it -
Try enabling fluid forces on the spinner by setting
workspace.FluidForces
toExperimental
and ensuringPart.EnableFluidForces = true
for all the parts underspinnything
. Now, when you hit Run (F8), you should notice the spinner gracefully fall to the ground while it spins due to the aerodynamic forces on the blades. -
You have just created your first Aerodynamic experience!
-
Next, try playing around with the angles of the spinner blades (or duplicating
spinnything
and changing the angle of the blades in each copy). You should notice the angle of the blades make the spinner fall at different rates due to the realistic aerodynamic forces. -
Finally, try adding in some global wind by modifying the
workspace.globalWind
property. (Or by using the View > Wind Direction widget) You should see the spinner get blown around in the direction of the wind you introduced.
Example 2: An Airplane
F15 240416.rbxl (291.1 KB)
(Updated on 4/16/2024 and re-tuned for the improved force model)
In this example, you will find a fully functional model of an F15 airplane.
Notes:
- The wings of the plane have articulating ailerons, the tail has an articulated rudder, and the elevators rotate.
- You can control the plane’s roll, yaw, and pitch by actuating these control surfaces while the plane is moving.
- (Update 4/16//2024) This F15 model has been updated. It now has a much more realistic mass and can fly with a more realistic air density now that the force model has been improved.
Instructions:
-
Hit
Play
to try flying the airplane. -
You should be able to run up to the airplane and press and hold the
E
button to get into the cockpit. -
Start by increasing the throttle slightly (
R
) and then pitching the plane up (S
) to take off. -
Once you are flying, you can use the following controls to move the control surfaces which in turn can fly the plane.
Throttle: `R` (Increase) / `F` (decrease)
Pitch: `W` (Down) / `S` (Up)
Roll: `A` (Left) / `D` (Right)
Yaw: `Q` (Left) / `E` (Right)
Example 3: Controllable Glider
glider 240410.rbxl (259.7 KB)
(Updated on 4/16/2024 and re-tuned for the improved force model)
Note: This example requires enabling the New Character Controller beta.
In this example, your avatar can equip a glider, jump off a ledge and deploy it to gracefully glide down.
Instructions:
-
Ensure you have the new Character Controller beta enabled
-
Run and jump off the cliff
-
Equip the glider by pressing
1
-
Use the
U/J/H/K
keys to control the glider as you fall
Notes:
-
Take a look at StarterPack > PanelGlider to see how the glider is set up.
-
You will notice that it is made up of three very simple panels and some rope constraints.
-
Take a look at StarterPack > PanelGlider > LocalScript script
-
All the script does is to change the length of the various rope constraints when the U, H, J and K keys are pressed
-
The aerodynamics of the panels then change allowing your avatar to experience the joy of gliding!
-
Try swapping out outfits on your avatar to get different aerodynamic interactions. For example, an avatar with wings on its back will react differently because of the extra surface area of the wings
Example 4: Maple Trees and leaves
mapletree.rbxl (680.9 KB)
This, rather chill, example contains some maple trees in the workspace as well as some sample maple leaves and maple seeds in ReplicatedStorage
Instructions:
- Hit Run (F8) and enjoy the maple leaves and seeds falling realistically in the gusting wind
Notes:
-
The Workspace >
GustingScript
script shows how you can script theworkspace.globalWind
property to create realistic gusts of wind -
Under each Workspace > Tree, you will also notice a
FallingThings
script that clones in maple seeds and maple leaves at random locations within thetree.LeafBox
and then drops them -
Notice how the maple seeds spin instead of just falling like the leaves. This is due to their different geometry
-
Finally, notice how any piled up leaves and seeds also move around in a realistic way as the wind gusts
Performance
The aerodynamic force system was engineered to scale across your experience and range of devices. Our vision is for fluid forces (like Aerodynamics) to be as fundamental as gravity or collision forces on the platform. With that vision in mind, the team has spent a great deal of effort optimizing various aspects of the engine so Aerodynamic forces can be ON for everything in your experience. In fact, this is why the per-part EnableFluidForces
property is set to true
by default.
Enabling aerodynamic forces adds a small performance overhead to your place depending on the complexity of mechanisms in your place. For already complex mechanisms with many constraints, you shouldn’t see much additional overhead when enabling aerodynamics.
Some things to consider if you find performance issues:
-
Reach out to us, we’d like to diagnose and fix the problem!
-
Complex assemblies (many complex individual parts welded together) require more up-front pre-processing; simplifying the assemblies to just the parts that need to be aerodynamic can mitigate this.
-
Many simple parts, whose dynamics primarily involve aerodynamics, simulated on a single client may impact performance. This happens even now, but you might see the performance impact a little sooner with aerodynamics. Again, turning off aerodynamics on parts that don’t really need it mitigates this issue.
-
We don’t have wind occlusion yet (see the Known Issues section below), so turning off aerodynamics on parts inside buildings and vehicles can improve both performance and realism.
Best practices
Aerodynamic simulation provides a pretty powerful new tool to create immersive experiences. In order to get the most out of it, here are some best practices we have found through internal testing:
-
Closed meshes with outward pointing normal vectors work best for Aerodynamic parts
-
If you have trouble getting a visible aerodynamic response on your parts, try reducing gravity or increasing the
workspace.AirDensity
property. -
MeshParts and CSG operations (e.g. union) should have their collision fidelity set to
Default
,Hull
, orPreciseConvexDecomposition
. (see Known issues below for a caveat on unpublished CSG assets) -
As you explore this new system, feel free to drop in other Best Practices in the forum below so the entire community can benefit from this!
Known Issues
These are early days with the aerodynamic model, and we know we have improvements to make. Here are some things to watch out for, especially in this experimental release:
-
Studio-only beta (for now)! Since this is a Studio-only beta for now, you will not be able to publish experiences with Aerodynamics on. We are still working out some bugs and hope to switch to an Open beta (with publishing) soon. Stay tuned!
-
The force (lift/drag) model may change during the beta phase! While we have tested and tuned the model over a variety of test cases, we know there are still some areas we’d like to improve. Creator testing in the beta phase will help us prioritize improvements to behavior and performance. We don’t expect dramatic changes, but some tweaks may happen before our full release.
-
Wind is not occluded by objects, terrain, or water! Wind affects aerodynamic forces on parts, but it is not occluded by parts, so wind is present even inside buildings and vehicles. You may have noticed this if you played around with the
GlobalWind
property and had grass or particles inside buildings too. We plan to work on this as we develop the model further. Until then, you may want to turn off aerodynamics on objects inside buildings and vehicles.Code snippet to automatically disable Aero on an avatar when in a vehicle
You can use the following script to turn off aerodynamics when avatars become seated within a
vehicle.
Usage: Place this script inStarterPlayer.StarterCharacterScripts
local character = script.Parent -- the player character local humanoid = character:WaitForChild("Humanoid") function onSeated(isSeated, seat) -- when the player sits local descendants = humanoid.Parent:GetDescendants() for i = 1, #descendants do if descendants[i]:IsA("BasePart") then descendants[i].EnableFluidForces = not isSeated end end end humanoid.Seated:Connect(onSeated) -- when the player sits, run the function
-
The force model does not work in water - Yet! We plan to incorporate some of these changes into improvements to the behavior of objects in water.
-
Team create requires each team member to enable Aerodynamics! If you and your team use Team Create for collaboration, each member of the team will need to separately follow the Usage steps above to enable Aerodynamics while the feature is in Studio beta.
-
Existing places with
MeshParts
might not get Aerodynamic forces automatically (for now)! If you open an existing place with MeshParts and turn on Aerodynamics, some MeshParts may not react to the new forces automatically.
Workaround: Go to theMeshPart
and disable/re-enable theEnableFluidForces
property. This will re-trigger the appropriate process to generate Aerodynamic forces on that part. You can also use the script below to automatically trigger this process for all MeshParts in your place.Code snippet to automatically disable/re-enable EnableFluidForces on all MeshParts
This snippet can be copied into and run directly in the Studio developer console or can be
incorporated into a script.
Note: This only needs to be run once on a placedescendants = game.Workspace:GetDescendants() for _, descendant in pairs(descendants) do if descendant:IsA('PartOperation') or descendant:IsA('MeshPart') then if not descendant.Anchored then descendant.EnableFluidForces = false descendant.EnableFluidForces = true end end end
Looking to the future
There are a lot of enhancements we would like to add, and we could use your feedback! Here are some areas we plan to improve:
-
Improved lift modeling: there are some situations where the aerodynamic force model generates unrealistically low lift forces, we’d like to improve that and get creator feedback during the Beta phase.
-
Wind occlusion: right now, the global wind exists everywhere, even inside buildings. We’d like to develop a system that automatically detects occlusion of the wind and incorporates that into the aerodynamic model.
-
Buoyancy: an air buoyancy model would allow us to create realistic balloons that interact with the wind! This is in progress so stay tuned!
-
Tooling and Usability: Designing stable flight vehicles and understanding what aerodynamic forces are doing can be challenging. Studio-based tooling that allows creators to visualize aerodynamic forces and torques would aid the development of interesting aerodynamic mechanisms and vehicles.
We can’t wait to see the incredible experiences you’ll create using Aerodynamics! Feel free to share your feedback, showcase your creations, and discuss any challenges you encounter below.
Happy developing and stay breezy,
@beastierpanda, @chefdeletat, @FGmm_r2, @kckhem, @miladrakhsha, @narheas, @SmithVonMars, @TheRabbitDeveloper, @vovoheli and @W_0DY