Wind Shake: High performance wind effect for leaves and foliage


by boatbomber

I wanted to have massive forests full of moving leaves. Not for any project of mine, I just wanted to make it cuz it sounded like fun. So I did. And now you guys can have it!

This module handles 77,750 leaf meshes while the game runs at over 220 FPS on my machine. It’s pretty darn fast, all things considered. This is made possible by BulkMoveTo and a optimized version of @Quenty’s incredible octree module.

Note: the wind lines in this demo are a separate module, not related to the shake effect. The lines are open sourced as well in the uncopylocked place below!

Here’s some examples of people using this module!

by @DevForHire

by @BIackoutDev

by @DevForHire




Uncopylocked Demo:


Read the API


number WindShake.RenderDistance

Sets the render distance for active objects in studs. Default 150

number WindShake.MaxRefreshRate

Sets the maximum dynamic refresh rate for active objects in seconds. Default 1/60


function WindShake:Init(config: {
    MatchWorkspaceWind: boolean?,

Initializes the wind shake logic and adds shake to all tagged objects


  • config [Optional Dictionary]

    Configuration for the initialization

    • MatchWorkspaceWind [Optional Boolean]

      Whether to match the wind settings to the Workspace’s GlobalWind setting. Default false


  • void
function WindShake:Cleanup()

Halts and clears the wind shake logic and all object shakes


  • void
function WindShake:Pause()

Halts the wind shake logic without clearing


  • void
function WindShake:Resume()

Restarts the wind shake logic without clearing


  • void
function WindShake:AddObjectShake(Object, Settings)

Adds an object to be shaken


  • Object [BasePart]
    The Object to apply shaking to

  • Settings [Optional Dictionary]
    The settings to apply to this object’s shake (See below for Settings structure)


  • void
function WindShake:RemoveObjectShake(Object)

Removes shake from an object


  • Object [BasePart]
    The Object to remove shaking from


  • void
function WindShake:SetDefaultSettings(Settings) [DEPRECATED]

Deprecated in favor of setting the Attributes of the WindShake modulescript

Sets the default settings for future object shake additions


  • Settings [Dictionary]
    The settings to use as default (See below for Settings structure)


  • void
function WindShake:UpdateObjectSettings(Object, Settings) [DEPRECATED]

Deprecated in favor of setting the Attributes of the Object

Updates the shake settings of an object already added


  • Object [BasePart]
    The Object to apply shake settings to

  • Settings [Dictionary]
    The settings to apply to this object’s shake (See below for Settings structure)


  • void
function WindShake:UpdateAllObjectSettings(Settings)

Updates the shake settings of all active shakes


  • Settings [Dictionary]
    The settings to apply to all objects’ shake (See below for Settings structure)


  • void
function WindShake:MatchWorkspaceWind()

Sets the wind settings to match the current workspace GlobalWind

When :Init() is called with the MatchWorkspaceWind config set to true, this is called automatically


  • void


RBXScriptSignal WindShake.ObjectShakeAdded(Object)

Fires when an object is added to WindShake


  • Object [BasePart]
    The object that was added
RBXScriptSignal WindShake.ObjectShakeRemoved(Object)

Fires when an object is removed from WindShake


  • Object [BasePart]
    The object that was removed
RBXScriptSignal WindShake.ObjectShakeUpdated(Object)

Fires when an object’s settings are updated through the update APIs


  • Object [BasePart]
    The object that had its settings updated
RBXScriptSignal WindShake.Resumed()

Fires when WindShake begins shaking the objects

RBXScriptSignal WindShake.Paused()

Fires when WindShake stops shaking the objects


`Settings` tables are structured like so:
    WindDirection: Vector3 to shake towards (Initially 0.5,0,0.5)
    WindSpeed: Positive number that defines how fast to shake (Initially 20)
    WindPower: Positive number that defines how much to shake (Initially 0.5)
    --If one of these is not defined, it will use default for that one,
    --so you can pass a table with just one or two settings and the rest
    --will be default so you don't need to make the full table every time.

Usage Example:

local WindShake = require(script.WindShake)

    MatchWorkspaceWind = true, -- WindShake will use workspace.GlobalWind

-- Anything with the WindShake tag will now shake

WindShake Editor Plugin

No programming needed, no tag editor plugins, no more manual attribute creation. No more pressing play to see what a tweaked value looks like.
Everything WindShake, made simple.


  • Import
    Don’t know any programming, but want WindShake running in your game? Import brings in the latest WindShake module and a script that’ll get it up and running right away. One click is all it takes.

  • Preview
    Having to playtest your game just to see what WindPower value looks best is… annoying. Preview fixes that by allowing you to see your models shaking in a ViewportFrame! Rather than naively displaying only your selected leaves, it brings in the entire model so you get to see your leaves relative to the trunk and branches. It also has a direction display in the corner to keep you oriented.

  • Simplified Tools
    CollectionService tags that aren’t viewable without special plugins? Attributes that need to be manually created by you? No more! The plugin handles all that stuff internally, and exposes it in a familiar “properties” style that’ll get you working quickly and easily.

Get this plugin here!

Enjoying my work? I love to create and share with the community, for free.

I make loads of free and open source scripts and modules for you all to use in your projects!
You can find a lot of them listed for you in my portfolio. Enjoy!

If you’d like to help fund my work, check out my Patreon or BuyMeACoffee!

How can I Achive "Wild West" Type Grass?
How to fill gaps in between trees?
Decals glitching out
First showcase of mine
Whisperbit Attribution
How to add "Stylized Wind" to your game
How to Make a Part Sway?
Accessory shaking effect
How should I go about changing the color of thousands of parts multiple times per second?
Oscillating Wing Vortex Trail Effect
I need a less costly method to multiplying these CFrames
About Rainy Vibes
Feedback on my Stylized Map
Outside | Credits
No Title Game - Credits
How to animate foliage(plants)
How would I add a wind system to my plant
Little Lands Updates & Attribution
Breeze into Wind! [Fully Released]
Any methods to check distances between Character and multiple Parts?
Custom Grass Module Release
Help With Animation Script
BaseGrass - Custom Performant Grass System (Devlog)
Magic Fighting Simulator - Credits
Custom Grass Module
House in the Woods Update Log (Deprecated)
Animating leafs - How do you do it?
StreamingQueue - Queue changes to Instances that are affected by StreamingEnabled
How can I stop the lag from this raycasting rain script?
Foliage Sway Module
Map feels empty
How to make grass effects?
WarriorCatsRP Asset Attributions
What are you working on currently? (2021)
About Sad Hangout
Feedback on showcase
Grass System: looking for advice on how to lower script activity
Challenge: I map in one hour and here is the results
A tree model / render
Optimizing client-server rendering
RopeConstraint Wind Simulation (kind of)
ARFJ Asset Attributions
Doom Towers: Credits & Attributions
Tree swaying script
PB & Jay | Update-Log
Does anyone have/know how to create a foliage script?
Arcade Island Credits
Custom Grass System - How might I go about optimizing it?
How do i add grass on a PART?

Awesome, wind effect looks so neat at this game but im sure that effect can be used with some graphic changes


This is extremely useful for any developer trying to make their vegetation look more alive, thank you for releasing it!


Amazing work Boat! :clap:

After playing with it for a bit, I was curious if you had any plans on adding roof detection so that wind particles are not created inside buildings, I feel like that could be a pretty neat and useful touch!


One question I have is if you use WindShake:Cleanup(), is there another way to start it up again? I tried WindShake:Init() after cleaning it up but nothing happened.

Found the answer to my own question, just disable the WindController script. You can enable it again and it’ll start over.


I love weather effects used in games, it reminds me of ‘stormworks’ on steam which uses a very similar method to graphically simulate wind. Wonderfully cool resource :happy1:

Stormworks Wind reference (I’m really impressed how similar this could be recreated on Roblox) :heart:


This looks great however I have a question why is everything the wind touches shaked or is it a script for that?


Calling Init() again works, but you have to add your shake objects again because they were cleaned up! The reason disable works is because it adds the objects again when you re-enable.

I should probably add a Pause method that allows you to halt without cleaning. Thanks for bringing that up!



Added WindShake:Pause() and WindShake:Resume() so you can halt and restart your wind effect without needing to re-add all your object shakes.

cc: @VampiricCode


Thanks! This looks fantastic

I would say that you and @EgoMoose have the best open source projects


I’ve always wanted to try implementing octrees and quadtrees in some of my code as they’re way more performant, but didn’t quite understand them. I’ll look into these two resources and try learning, thank you! :pray:


Pretty beautiful and creative indeed. Thank you!
And it will be helpful if you can make for us a tutorial about octrees and quadtrees :smiley:


Oh no! I have only just made on of these! (and for a commision which probably won’t work out now :man_facepalming:)

This is really well done! Good job @boatbomber!

wish me luck…


Wow, thank you so much for including the API. This is a very handy resource as I was just starting to learn how to do these effects for my game.

1 Like

Hi, I just have one question you could help answer. How can you disable the gui’s?


You just… don’t put GUIs in. Those are not part of the module. The module does not put anything on your screen. It just moves BaseParts. Those GUIs are added via a LocalScript in the demo place.


I’m getting very ugly results with this module. Out of the box, the module seems to be updating things at only a fraction of the frequency that it should, leading to the shake looking extremely choppy. I definitely feel like something is wrong here, because the demo videos look buttery smooth. Not sure what I’m doing wrong, however.


You can edit the Hz parameter in the WindController>WindShake. Increasing the Hz to 60 might help.


Looks amazing but is it possible to like, prevent it from being in a building?


Restarting his machine fixed it, something was wrong on his end. We aren’t sure what though.