The rendering of 3D seismic data is based on a custom data access API : the interface cg3DSeismicVolumeData
This data interface is very generic, and, therefore, the 3 axes of the data are named I, J, and K. They can be seen as Inline/Crossline and Time axes but not always. The API of seismic data rendering in JCarnac3D-OGL always refers to I, J, and K axes.
This interface defines the method needed by the volume rendering node to get data for slice rendering.
It is based on the cgSeismicPipeline interface defined by the JSeismic library. Therefore, if you are using the 2D JGeoToolkit, it should be easy to write a 3D data access using the same process to access the datas.
There are 4 data access methods :
createISliceReader :
Returns a pipeline containing all the traces located at the given I coordinate (slice aligned to the J axis).
The samples are aligned along the K axis.
createJSliceReader :
Returns a pipeline containing all the traces located at the given J coordinate (slice aligned to the I axis).
The samples are aligned along the K axis.
createKSliceReader :
Returns a slice often named "time slice." The traces are located at the same K coordinate and aligned on the J axis.
The samples are aligned on the I axis.
createPathReader :
Takes a path in I/J coordinates and returns a list of pipelines.
Returns one pipeline for each segment in the path.
The samples are aligned on the K axis.
The interface also defines methods used by other classes to listen to changes in this data : addDataListener and removeDataListener (which take a listener as parameter).
If your data is completely static, there is no need to implement these methods. However, if you are using dynamic data (such as 4D data), you should implement these methods.
Then if a change occurs in your data, you just have to call the dataUpdated method on all the registered listeners. Indeed, the rendering nodes are added as listeners on the data and therefore can trigger a new rendering if they receive a cg3DSeismicVolumeDataEvent.
A very simple implementation of this interface can be found attached to this page. Note that this implementation is not optimized and only deals with SEP coded with the native_float format.