1.4.3. Volume Skin

The SoVolumeSkin( C++ | Java | .NET ) node renders the outer surfaces of the current region of interest. The default region of interest is the entire volume, but region of interest can be restricted to a sub-volume using an SoROI( C++ | Java | .NET ) node. This is explained in Section 1.7, “Clipping”. A volume skin is approximately the same as a set of SoOrthoSlice( C++ | Java | .NET ) nodes positioned at the “faces” of the region of interest. This is a useful analogy, but it’s not exactly the same image. One reason is that SoOrthoSlice( C++ | Java | .NET ) is rendered at the center of the specified voxel and volume skin is rendered at the outer extent of the voxel. In other words an SoOrthoSlice( C++ | Java | .NET ) at a “face” of the volume will be rendered one-half voxel width in from the geometric extent of the volume. While an SoVolumeSkin( C++ | Java | .NET ) will be rendered exactly at the geometric extent of the volume. A very useful difference is that SoVolumeSkin( C++ | Java | .NET ) displays all the faces of the region of interest even when the region of interest has a complex shape. For example when using the exclusion box feature to “cut away” part of the ROI box (what seismic applications sometimes call a “chair cut”).

It’s even more useful to consider that an SoVolumeSkin( C++ | Java | .NET ) node generates approximately the same image as an SoVolumeRender( C++ | Java | .NET ) (direct volume rendering) node would, if rendered using an opaque color map. However the SoVolumeSkin( C++ | Java | .NET ) node will render much faster and load much less data than the equivalent volume rendering node. This makes the SoVolumeSkin( C++ | Java | .NET ) node valuable for exploring a volume by moving an opaque subvolume through it. This is technique is common in seismic visualization applications and is often called a “volume probe”. A related useful technique is to put both an SoVolumeSkin( C++ | Java | .NET ) node and an SoVolumeRender( C++ | Java | .NET ) node under an SoSwitch( C++ | Java | .NET ) node. The application can then allow the user to switch between opaque probe rendering and volume rendering for the same region of interest.

SoVolumeSkin( C++ | Java | .NET ) is intended to be used with an opaque color map or with the alphaUse field set to ALPHA_OPAQUE. Using a non-opaque color map with volume skin will generate the “correct” result, but it may not be what the user of the application expects. Setting alphaUse to ALPHA_OPAQUE allows the same color map to be used for both the volume skin and the volume rendering, even when the volume rendering color map contains (as it usually does) transparency.

As hinted earlier, when using SoVolumeSkin( C++ | Java | .NET ), VolumeViz only loads the tiles of data required to render the outer faces of the region of interest. In fact the only data tiles required (by default) are the tiles intersected by the “front faces” of the volume skin (the faces whose normal vectors point toward the camera). You can use the faceMode field to specify that the back faces of the skin are displayed instead.


C++
SoVolumeSkin* pVolSkin = new SoVolumeSkin;
pVolSkin->alphaUse = SoVolumeSkin::ALPHA_OPAQUE;

.NET
SoVolumeSkin volSkin = new SoVolumeSkin();
volSkin.alphaUse.Value = SoVolumeSkin.AlphaUses.ALPHA_OPAQUE;

Java
SoVolumeSkin volSkin = new SoVolumeSkin();
volSkin.alphaUse.setValue( SoVolumeSkin.AlphaUses.ALPHA_OPAQUE );
SoVolumeSkin default and with SoROI (Region of Interest)

Figure 1.33. SoVolumeSkin default and with SoROI (Region of Interest)


See the volume skin example program in:

$OIVHOME/src/VolumeViz/examples/volumeSkin

See the volume skin example program in:

$OIVHOME/demos/volumeviz/sample/volumeSkin