X-Plane 12 features rain simulation on designated surfaces. This article explains how to enable and tune rain effects, as well as what to look out for to get the best experience.

Enabling Rain

Enabling the base rain effect is extremely easy by going into Plane Maker’s objects panel and setting the lighting mode of the rain surface OBJ to “Outside Rain Glass”. With this enabled, X-Plane will start simulating raindrops on the OBJ and automatically tap into the flight model data to properly calculate forces acting on them. Additionally, X-Plane will also start simulating ice build up on the surface when encountering icing conditions.

General considerations

One “gotcha” with the rain system is the way that raindrops interact with multiple surfaces. If you have enabled “Outside Rain Glass” mode for multiple OBJs, they will each run their own simulation and don’t share results with each other. This means that each additional OBJ will consume additional resources and processing time. Our advice is to try to keep the number of “Outside Rain Glass” OBJs to a minimum, ideally 1. You can achieve this by putting all of your rain receiving surfaces into a single OBJ file.

When multiple surfaces are grouped together into a single OBJ, it’s important that each vertex has a unique UV mapping and that contiguous surfaces are also mapped contiguously in UV space. This is because the rain system actually runs the simulation in 2D UV space to reduce resource usage, so the lens through which it “sees” the world is the UV space of your OBJ.

Flt7zxgv1xitb6k6cxfwoodaz nah1xbtqs qbdbj9bw9msp4aelqohfu0c pxwuxiqpogv3g57u-kzrzyzch xnsr6g7ibdvzui5a2e2j4s8thhq6mrxvoinoz-lmuwccb- zgeeiwqoqud4w

Here is an example of the default Cessna windows in 3D and UV space. The rain system operates in the flat UV space on the right in order to reduce the computational complexity.

One side effect of this setup is that rain can cross surfaces in unexpected ways. Two objects that are far apart in 3D space might be close to each other in UV space. In this case, a raindrop can potentially migrate from one surface to the other. Similarly, surfaces might be at different orientations to each other, so when a droplet enters the next surface it suddenly is subject to entirely different forces. In those cases, rain drops can move in strange and unexpected ways. An example of this behaviour can be seen here:

Zjwnbpybs1k9f7cwuygzsxebff2er dp2uqxwgywoxhfhlvwjf1hbldb9bkf7mekfp0e4ir8ubumzsbnoe wsnuku5rzksrx-n4ugyikbtt5wikdguiozubm52qopa0-enq97ai-juku7bfviq

If you look at the upper left part of the windshield, you can see streaks that seem to have moved weirdly. In this case the rain drops have entered from the left edge after hopping from a different surface. They carried their momentum with them which moved them further to the right across the windshield. At the same time, they are suddenly exposed to forces that try to push them upwards. As a result, they now arc weirdly.

The way to work around this is to use separate TRIS commands in your OBJ for each distinct surface. X-Plane tracks draw calls and makes sure to extinguish droplets that hop distinct surfaces that it can track. One “gotcha” here is that X-Plane will also try to merge multiple TRIS commands into one big command. It only does so if subsequent commands are also drawing subsequent patches of triangles, so a way to work around this is to have them backwards. For example, your original OBJ might look like this:

TRIS 0 1224

TRIS 1224 558

TRIS 1782 558

Because this describes a contiguous range of 2340 triangles, X-Plane will try to helpfully merge them together into one. You can prevent this from happening by reversing the lines like this:

TRIS 1782 558

TRIS 1224 558

TRIS 0 1224

Scaling rain

One general OBJ command that might come in handy is the RAIN_scale command. If not specified, the default of 1.0 is assumed, but you can put any other parameter in there. If you find that the rain drops are too big or too small for your aircraft, you can use this to tune their size. During development, you can set this to 1 and then use the sim/private/controls/rain/scale art control to dial this parameter in, in real time. Once you have arrived at a value, you can then bake it into your OBJ.

Combining inside and outside glass

If you have both an outside glass surface with rain, as well as an inside glass surface, you might find that you get draw order problems. In these cases, the inside glass will remove the outside rain effect. The way to make this set up work is to select the “Inside Reflector” lighting mode for the inside glass.

Wipers

A lot of aircraft come with wipers, which can be added to a rain system via the WIPER_texture and WIPER_param OBJ commands. X-Plane supports up to 4 wipers per OBJ and one wiper texture. The wiper texture, specified with the WIPER_texture command, describes the path for each wiper using the 4 channels red, green, blue and alpha. The intensity of the channel is  the percentage along the path of the wiper, going from 1 to 255 (0 is reserved to signal no wiper interaction), the wiper moves from 0% to 100% of its path.

Q idluydkqtb-wxrcdkyqkkpxnvxzqmyhtcj9zxni hpsacdzl0vkk0uhtv8b6wbhvpctljlzrk1-eiuyk7lr ohjcgfidrdgygk2q1q9bvwqlptn3nhv3tjmr1dqmw0mbeqwewhkjolurmxmw

The resulting gradient should be increasing at a uniform rate, and an example of this can be seen on the left.

The red channel describes the first wiper, whereas the green channel describes the second one. Note that you can have multiple wipers using the same channel, but you can’t individually drive them.

For each wiper in the wiper texture, you’ll need one WIPER_param command in your OBJ. The general syntax for that command is:

WIPER_param <dref> <start> <end> <nominal_width>

The dref is the name of the dataref you want to use to drive the wiper. Start and end provide the values the dataref will have when the wiper is at its first and last position respectively. The nominal_width parameter is a bit more complicated: It describes the width of the wiper as a fraction of the gradient in the wiper texture. To accurately calculate this parameter, you’ll need to know the pixel density per meter of your texture, as well as the space covered by the wiper gradient and the physical size of the wiper.

Putting it all together, you might end up with something like this to describe 2 wipers:

WIPER_texture    A330_glass_wiper_gradient.png

WIPER_param    sim/flightmodel2/misc/wiper_angle_deg[0]        0.0   70.0        0.02

WIPER_param    sim/flightmodel2/misc/wiper_angle_deg[1]        0.0   70.0        0.02

In this case the datarefs used describe the angle of the wiper, so the start and end are also in degrees. The nominal width is 2% of the gradient.

One method to generate the wiper texture as well as the parameters is to use the XPlane2Blender plugin. The plugin allows you to generate a wiper texture from your OBJ animations.

Thermal sources

Since the rain simulation includes ice build up as well, one common task is to provide deicing mechanisms for rain surfaces, which can be done using thermal sources. A thermal source can be anything applying heat to the surface, for example a vent blowing hot air or an electrical filament embedded into the glass. Thermal sources work very similarly to wipers, they provide THERMAL_texture and THERMAL_source OBJ commands and X-Plane supports up to 4 individual thermal sources per OBJ.

The THERMAL_texture also uses per channel gradients to describe where to apply the effect and how strongly. The channel describes the thermal source in question (red is 1, green is 2, blue is 3 and alpha is 4). The intensity of the channel describes the percentage of how much of the heat is applied to that area as a percentage. For a hot air blower, this would most likely look like a dot with an intensity of 255, with a gradient falling off to 0 around it. The dot is where the hot air is concentrated, whereas the gradient around it is the fall off of the hot air.

The THERMAL_source command has the following syntax:

THERMAL_source <temperature dref> <on/off dref>

The first parameter describes the dataref to be used to read temperature of the thermal source, in degrees celsius. The second parameter describes the dataref to be used to check whether the thermal source is on or off (1 or 0 respectively).

A complete example describing 4 heat sources looks like this:

THERMAL_texture    A330_glass_thermal_gradient.png

THERMAL_source   A333/window_temp1  sim/cockpit2/ice/ice_window_heat_on_window[0]

THERMAL_source   A333/window_temp2  sim/cockpit2/ice/ice_window_heat_on_window[1]

THERMAL_source   A333/window_temp3  sim/cockpit2/ice/ice_window_heat_on_window[2]

THERMAL_source   A333/window_temp4  sim/cockpit2/ice/ice_window_heat_on_window[3]

Leave a Reply

Your email address will not be published.

Please do not report bugs in the blog comments.
Only bugs reported via the X-Plane Bug Reporter are tracked.