Wind for Your Content
Connect materials, foliage, cloth, Niagara, and Blueprint content to the resolved atmosphere wind
Wind for Your Content
Agentic Atmos resolves one wind per refresh through UAtmosWindModifier::Resolve. Set speed, direction, gustiness, and cloud drift on a look's Wind modifier. Weather can add its wind contribution, and every supported consumer reads the resulting state. You do not need a separate wind manager actor or a custom adapter.
This guide targets Unreal Engine 5.8. Choose the integration that matches what your content already reads. Parameter conversions belong in renderer binding rows, not duplicated wind controls.
Choose an integration
| Your content | Integration | Setup |
|---|---|---|
| Materials for grass, flags, ripples, or cloth world-position offset | MPC_AtmosParams or MF_Atmos_Wind | Read the collection or use the material function |
| A foliage pack with its own material parameter collection | UAtmosRenderer_WorldState | Create a renderer asset, bind parameters, and mount it on the cycle's render profile |
| SpeedTree, Chaos cloth, or AnimDynamics consumers of engine wind | The sky actor's WindDirectionalSourceComponent | Use the engine's supported wind path |
| Nanite skeletal foliage | Epic's experimental DynamicWind subsystem | Enable the plugin and assign the mesh's transform provider |
| Niagara used as weather | UAtmosEffectRenderer_Niagara on a weather effect | Map effect signals and shared channels to user parameters |
| Other Niagara or Blueprint content | AAtmosSkyActor::GetResolvedWind() | Read the Blueprint-pure node and apply the values |
1. Read wind in materials
/AgenticAtmosphere/Materials/MPC_AtmosParams publishes the shared wind values on refresh.
| Parameter | Units | Meaning |
|---|---|---|
WindSpeedMetresPerSecond | m/s | Instantaneous speed, including the current gust |
WindAngleDeg | Degrees | Direction the wind blows toward, clockwise from world +Y |
WindGust | 0–1 | Current gust fraction: zero at the mean and one at the strongest peak allowed by gustiness |
WindForce | Vector, m/s | XYZ wind velocity with magnitude in W |
WindOffset, MistWindOffset | Vector, world cm | Running wind displacement, wrapped within ±10 km; use it to pan tiled noise without a jump when velocity changes |
CloudWindOffset | Vector, world cm | Cloud displacement from mean speed multiplied by CloudDriftMultiplier |
CloudSpeed | m/s | Mean wind multiplied by the cloud settings' WindSpeedMultiplier; clouds do not gust with grass |
WindRippleAmount | 0–1 | Wind response multiplied by wetness for standing-water ripples |
The material function /AgenticAtmosphere/Materials/Functions/MF_Atmos_Wind supplies a world-space wind vector and per-vertex flutter scaled by speed and gust. Reading the shared collection directly requires no renderer pack.
2. Bind a pack's own collection
Do not edit another pack's material graphs simply to synchronize its wind. Create a UAtmosRenderer_WorldState data asset targeting its collection, then add one binding row per parameter:
Agentic Atmos channel → destination parameter → Scale and Bias in destination unitsFor example, a collection expecting a compass from direction may need WindAngleDeg with scale -1 and bias 90. A pack-specific strength control might use WindSpeedMetresPerSecond with scale 0.35, while a separate animation-speed control uses scale 0.05. These are example conversions, not universal calibration values: inspect the destination pack's units first.
Register your chosen gameplay tag and add a tag-to-renderer entry to the active cycle's UAtmosRenderProfile. World-state renderer tags use the Atmos.Renderer.Sky.WorldState namespace. Preserve the profile's other entries. The plugin registers DT_AtmosphereTags; if you maintain a CSV-backed tag table, reimport it after editing rows. Your project can maintain its own tag registration rather than editing shared plugin content.
For agent authoring, discover AtmosAuthor.CreateRenderer, AddRendererRow, and SetProfileEntry. Creating a renderer alone does not mount it. It must be referenced by the active profile before its collection receives updates.
3. Use the engine's directional wind source
The sky actor owns a WindDirectionalSourceComponent. UAtmosWindModifier::Apply updates its speed, direction, and gust bounds on refresh. Content that uses the engine's aggregated wind source, including supported SpeedTree, Chaos cloth, and AnimDynamics paths, can consume it without another actor.
Niagara, volumetric clouds, and SimpleGrassWind do not automatically read this component. Use the other integrations for those consumers.
Do not place a second directional wind source to synchronize content. The scene aggregates sources, so engine-driven foliage would read their combined wind rather than the atmosphere's resolved wind.
4. Connect Nanite skeletal foliage
Enable Epic's experimental DynamicWind plugin. For leafy Nanite assemblies, enable r.Nanite.Foliage=1. Give each InstancedSkinnedMeshComponent a DynamicWindData transform provider; the supplied /AgenticAtmosphere/Core/Wind/DA_DynamicWind_Default is a starting point.
The wind modifier publishes to UDynamicWindSubsystem through reflection, so Agentic Atmos does not require a build dependency on that experimental module. Its reference calibration maps 7 m/s to Epic's default sway, evaluated with an English Oak foliage example. If the plugin is absent, no values are pushed and the missing integration is logged once.
5. Bind weather Niagara
Weather phenomena are instanced effects in a UAtmosWeatherType.Effects list. A UAtmosEffectRenderer_Niagara asset maps the effect's named signals, environment state, shared channels, and constants to your system's user parameters.
| Source | Binding source kind | Units and use |
|---|---|---|
WindVelocityMetresPerSecond | EffectSignal | Rain's horizontal advection velocity, derived from the resolved wind with rain-specific height response and lean controls |
DebrisWindVelocityMetresPerSecond | EffectSignal | Horizontal debris advection velocity in m/s |
WindGust | Channel | Current gust fraction, 0–1 |
WindSpeedMetresPerSecond | Channel | Instantaneous wind speed, m/s |
The effects use the same wind authority, but their final advection need not be identical: rain has its own near-ground response and lean limit. UAtmosWeatherEffect_Rain::MaxLeanDegrees defaults to 45°. It preserves wind direction while limiting how steeply rain leans.
A custom debris-system binding could map:
| Signal or channel | Example target | Scale |
|---|---|---|
DebrisWindVelocityMetresPerSecond | User.WindVelocity | 100, converting m/s to cm/s |
GroundSmokeRate | User.SpawnRateScale | 428.57 in a system calibrated to 200 particles/s at 7 m/s |
WindSpeedMetresPerSecond | User.WindSpeed | 1 |
WindGust | User.Gust | 1 |
The spawn-rate scale is a worked calibration example, not a shipped universal rate. In the Niagara graph, link an acceleration force to your wind-velocity parameter. The host places the mounted system relative to the sky actor using the effect's MountOffset in centimeters, activates it when the effect is active, and writes its rows on refresh.
A weather effect with no renderer can still contribute channels. It does not acquire substitute VFX. See weather for the shipped-renderer limitations.
6. Read wind in Blueprint
Get Resolved Wind, under Atmos Sky > Wind, is Blueprint-pure and returns FAtmosResolvedWind:
| Field | Meaning |
|---|---|
SpeedMetresPerSecond | Instantaneous speed |
MeanSpeedMetresPerSecond | Speed before the gust contribution |
DirectionDeg | Toward heading in compass degrees |
DirectionVec | World-space unit direction |
Gust01 | Current gust fraction |
Gustiness | Authored gust depth used by the resolve |
For a level-placed Niagara system that is not weather, read on Tick or a timer:
Get Resolved Wind
→ DirectionVec × SpeedMetresPerSecond × 100
→ Set Niagara Variable (Vector): User.WindVelocityThe factor of 100 converts m/s to cm/s. This direct path uses the same instantaneous wind as the material collection.
A parameter contract for your own pack
These destination names are recommendations for your content, not required plugin fields. A binding row can target whatever parameter name you expose.
| Recommended target | Type and units | Binding |
|---|---|---|
User.WindVelocity | Vector, world-horizontal cm/s | Effect velocity signal with scale 100; use the phenomenon's derived mean-advection signal rather than adding another wind source |
User.WindSpeed | Float, m/s | WindSpeedMetresPerSecond, scale 1 |
User.Gust | Float, 0–1 | WindGust, scale 1 |
User.WindDirectionDeg | Float, degrees toward, clockwise from +Y | WindAngleDeg, scale 1 |
User.GustSurge | Your per-instance float, suggested 0–2 and default 0.6 | Optional local response: horizontal velocity × (1 + Gust × GustSurge); no channel row required |
The optional surge formula illustrates how a pack can respond more strongly to gusts without recomputing the wind. A material can use WindForce, WindSpeedMetresPerSecond, WindGust, WindAngleDeg, and the WindOffset integral instead of Niagara user parameters.
Keep conversions such as km/h or normalized strength in the row's Scale and Bias. Use Encoding for supported nonlinear conversions. If the existing encodings cannot represent a pack's units, request the missing conversion rather than hand-synchronizing graph controls.
WindIntensity from weather is a normalized channel, not a speed. The wind modifier converts it using WindIntensityToMetresPerSecond, which defaults to 15, and publishes the resolved result. For an intentionally calm look, author zero baseline speed and remove any active weather wind contribution; an absent Wind modifier is not a reliable off switch.
Next steps
Author weather, connect ground-fog motion, or ask for integration help through Discord support.