Main Content

Display Translucent Volume with Advanced Light Scattering

This example shows how to display translucent volumes using realistic light scattering.

The volshow function provides several rendering styles for displaying volumes, including standard volume rendering, cinematic rendering, and light scattering. The light scattering style most accurately models light propagation through an object, but is computationally expensive. Consider using the light scattering style when displaying translucent volumes with soft opacity gradients. For opaque volumes, consider the cinematic rendering style, which is less computationally expensive and generates photorealistic displays. For an example, see Display Volume Using Cinematic Rendering.

In this example, you use light scattering to accurately model light shining through a cloud.

Download Image Volume Data

This example uses a version of the Walt Disney Animation Studios Cloud Data Set [1] saved as a MAT file. Run this code to download the lightScatteringCloud.mat file from the MathWorks® website. The size of the data file is approximately 6 MB.

file = matlab.internal.examples.downloadSupportFile("image","data/lightScatteringCloud.mat");

Load the file into the workspace. The vol variable contains the cloud image volume.

load(file)
whos vol
  Name        Size                    Bytes  Class     Attributes

  vol       307x250x189            58023000  single              

Display Using Volume Rendering

Create a viewer window in which to display the volume.

viewer = viewer3d;

By default, the viewer contains ambient light and one light source located above and to the right of the camera.

viewer.LightPositionMode
ans = 
"right"

Specify the colormap and alphamap for displaying the volume.

alpha = [0.0 repmat(0.1,[1 255])];
color = "white";

Display the volume using the default rendering style, VolumeRendering. Specify the SpecularReflectance value as 0 so the cloud does not appear shiny.

obj = volshow(vol, ...
    Parent=viewer, ...
    RenderingStyle="VolumeRendering", ...
    SpecularReflectance=0, ...
    Alphamap=alpha, ...
    Colormap=color);

Adjust the camera position to view the front of the cloud.

viewer.CameraPosition = [-313.2140 154 95];
viewer.CameraZoom = 1.8;

Create a new viewer, and move the light behind the cloud to simulate light shining through the cloud.

viewer2 = viewer3d;
viewer2.LightPositionMode = "target-behind"; % Move the light behind the cloud
viewer2.CameraPosition = [-313.2140 154 95];
viewer2.CameraZoom = 1.8;

Display the cloud volume using the LightScattering rendering style.

obj2 = volshow(vol, ...
    Parent=viewer2, ...
    RenderingStyle="LightScattering", ... % Use the Light Scattering rendering style
    SpecularReflectance=0, ...
    Alphamap=alpha, ...
    Colormap=color);

Manage Light Scattering Performance

You can balance rendering quality and performance by adjusting the LightScatteringQuality property of the Volume object. By default, the LightScatteringQuality value is auto, and the software automatically decreases quality during interactions, such as pan, zoom, and rotate, and maximizes quality between interactions. This animation shows the temporary change in quality during an interaction.

Animation showing temporary decrease in quality while you rotate the volume.

If your application requires that the light scattering quality remain constant, specify the LightScatteringQuality value as a numeric scalar from 0 to 1, where a greater value corresponds to higher quality. For example, this code specifies a value that balances quality and performance.

obj.LightScatteringQuality = 0.5;

References

[1] Walt Disney Animation Studios. “Walt Disney Animation Studios - Clouds.” Accessed June 30, 2023. https://disneyanimation.com/resources/clouds/. The Clouds data set is licensed under the CC-BY-SA 3.0 license. See the license for details.

See Also

| |

Related Topics