INSODIMENSIONStudios
AtmosGuides

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 contentIntegrationSetup
Materials for grass, flags, ripples, or cloth world-position offsetMPC_AtmosParams or MF_Atmos_WindRead the collection or use the material function
A foliage pack with its own material parameter collectionUAtmosRenderer_WorldStateCreate a renderer asset, bind parameters, and mount it on the cycle's render profile
SpeedTree, Chaos cloth, or AnimDynamics consumers of engine windThe sky actor's WindDirectionalSourceComponentUse the engine's supported wind path
Nanite skeletal foliageEpic's experimental DynamicWind subsystemEnable the plugin and assign the mesh's transform provider
Niagara used as weatherUAtmosEffectRenderer_Niagara on a weather effectMap effect signals and shared channels to user parameters
Other Niagara or Blueprint contentAAtmosSkyActor::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.

ParameterUnitsMeaning
WindSpeedMetresPerSecondm/sInstantaneous speed, including the current gust
WindAngleDegDegreesDirection the wind blows toward, clockwise from world +Y
WindGust0–1Current gust fraction: zero at the mean and one at the strongest peak allowed by gustiness
WindForceVector, m/sXYZ wind velocity with magnitude in W
WindOffset, MistWindOffsetVector, world cmRunning wind displacement, wrapped within ±10 km; use it to pan tiled noise without a jump when velocity changes
CloudWindOffsetVector, world cmCloud displacement from mean speed multiplied by CloudDriftMultiplier
CloudSpeedm/sMean wind multiplied by the cloud settings' WindSpeedMultiplier; clouds do not gust with grass
WindRippleAmount0–1Wind 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 units

For 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.

SourceBinding source kindUnits and use
WindVelocityMetresPerSecondEffectSignalRain's horizontal advection velocity, derived from the resolved wind with rain-specific height response and lean controls
DebrisWindVelocityMetresPerSecondEffectSignalHorizontal debris advection velocity in m/s
WindGustChannelCurrent gust fraction, 0–1
WindSpeedMetresPerSecondChannelInstantaneous 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 channelExample targetScale
DebrisWindVelocityMetresPerSecondUser.WindVelocity100, converting m/s to cm/s
GroundSmokeRateUser.SpawnRateScale428.57 in a system calibrated to 200 particles/s at 7 m/s
WindSpeedMetresPerSecondUser.WindSpeed1
WindGustUser.Gust1

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:

FieldMeaning
SpeedMetresPerSecondInstantaneous speed
MeanSpeedMetresPerSecondSpeed before the gust contribution
DirectionDegToward heading in compass degrees
DirectionVecWorld-space unit direction
Gust01Current gust fraction
GustinessAuthored 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.WindVelocity

The 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 targetType and unitsBinding
User.WindVelocityVector, world-horizontal cm/sEffect velocity signal with scale 100; use the phenomenon's derived mean-advection signal rather than adding another wind source
User.WindSpeedFloat, m/sWindSpeedMetresPerSecond, scale 1
User.GustFloat, 0–1WindGust, scale 1
User.WindDirectionDegFloat, degrees toward, clockwise from +YWindAngleDeg, scale 1
User.GustSurgeYour per-instance float, suggested 0–2 and default 0.6Optional 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.