Re: Voxel Node

T.D. Ritchey ([email protected])
Mon, 12 Jun 95 00:12 BST


I think you are right in emphasising working code, which I am also
doing right now. Unfortunately our SPARCstation 20 has an SX and not a ZX
graphics card :-( (Although I am trying to alleviate this problem). I am
working on code to render the VoxelSet node independent from any browser,
and would be happy to work with someone on fitting it into their running
WebSpace. I have completed a full draft for the VoxelSet node and have
included it at the bottom of the message.

tim
--------------------------------------------------------------------------

VOXELTYPE

UNIFORM Evenly spaced, orthogonal voxel set
RECTILINEAR Orthogonal voxel set, defined axis coordinates
IRREGULAR Each voxel has its own coordinates
OCTREE Octree encoded voxel set

FILE FORMATS/DEFAULTS
VoxelSet {
voxelType UNIFORM # SFEnum
dimensions 0 # SFLong
arrayBounds 0 # SFLong
dataSets 0 # SFLong
thresholds 0 # SFFloat
materialIndex -1 # SFLong
minimumData 0 # SFFloat
maximumData 0 # SFFloat

# optional
minimumExtents 0 # SFFloat
maximumExtents 0 # SFFloat
# end optional

# for RECTILINEAR
coordinates 0 # SFFloat
# end for RECTILINEAR

data 0 # SFFloat
}

The VoxelSet node consists of four enumerated types defined in the
voxelType field (UNIFORM, RECTILINEAR, IRREGULAR, OCTREE). The UNIFORM
type refers to an evenly spaced, rectilinear (i.e. orthogonal) voxel set.
In this case, the data field is mapped evenly between the minimumExtents
and the maximumExtents for each axis if given, and defaults to mapping the
data values onto the integer values along each axis starting at (0,0,0) if
not given. The RECTILINEAR type refers to a rectilinear, but unevenly
spaced voxel set. When this dataType is invoked, the coordinates field
must be given, specifying the axis mapping for the data. The IRREGULAR
type refers to an unspecified organization of the voxel set where each
voxel is proceeded by its own coordinates. The OCTREE type refers to a
voxel set in the octree encoded form. This encoding is especially compact
when dealing with objects having large homogeneous volumes. The specific
form of this encoding will be presented in the section on the field data.

The dimensions field defines the number of dimensions of the voxel
set. In almost all cases this will be 3. The arrayBounds field defines
the number of elements along each axis. This field will be an n-vector
where n = dimensions. For 3-Space the values [n,m,p] refer to the X, Y and
Z array bounds respectively. The dataSets field is a single value
representing the number of different data sets for each coordinate. For
example, a 1 could indicate a scalar value such as density while a value of
3 could indicate a data triplet of temperature-humidity-pressure readings
for each location. It is important to make the distinction here that
data are the values at a specific coordinate. It is the combination of
the data and the coordinate that make up the voxel.

The thresholds field defines various ranges within which the data
can be considered to be of a certain class; this in turn determines how a
specific voxel is visualized. The threshold has a value between 0 and 1,
where 0 is the minimumData and 1 the maximumData value. Each data set can
have multiple thresholds to indicate different material. For example, data
points which represent density in an MRI scan could be broken down into
bone, muscle and fat by giving three threshold pairs indicating the lower
and upper boundaries for each type. The threshold pairs for the different
data sets where dataSets is greater than 1 are separated by a -1. The
materialIndex field indexes into the Material node for each threshold pair,
providing each data set with specific Material information for each
threshold pair.

The minimumData and maximumData fields give the browser hints
towards normalization and optimization for color ranges, etc. They are
n-vectors defining the maximum and minimum values in each of the data sets.
The minimumExtents and maximumExtents are optional fields of n-vectors
which give the browser additional information useful towards optimization
for boundaries, etc. The values are for the lower and upper physical
coordinates for each axis. This differs from the arrayBounds which refer
strictly to the computational or data coordinates. In both of these cases
n refers to the dataSets.

In the case of RECTILINEAR data sets, an additional field
coordinates must be given. This field maps the computational coordinates
onto physical coordinates. This field is a series of numbers which
redefine each axis from 0 to the arrayBounds. The final field, data, gives
the values for the data sets for each voxel. In both the UNIFORM and
RECTILINEAR cases the data is presented coordinate-less, being mapped from
computational to physical coordinates either at evenly spaced integer
values starting at 0, or unevenly spaced coordinates based on the
coordinates field for re-mapping computational to physical coordinates.
These values are presented in order with X the least, and Y the most
significant. In the IRREGULAR case each voxel has its own coordinate
given, so there is no stipulation as to the ordering of the data. The
OCTREE case is a special one and shall be considered below.

The OCTREE case is an extension of the binary tree in which each
octant of the voxel space is a branch from the root node, with each octant
of those spaces having branches, and so on. This allows the termination of
branches which lead to large homogeneous areas in the voxel space. The
format for each node is as follows. If a branch continues then that node
is represented by a -1. If the branch terminates then the node has a value
between 0 and 1 which is the normalized data value. The nodes are in order
from (+,+,+) to (-,-,-) octant with X being the least, and Z the most,
significant.

The following are examples of two of the cases in use:

VoxelSet {
voxelType UNIFORM
dimensions [ 3 ]
arrayBounds [ 25, 30, 35 ]
dataSets [ 1 ]
thresholds [ 0.0, 0.25, 0.25, 0.75, 0.75, 1.0 ]
materialIndex [ 0, 1, 2 ]
minimumData [ 0 ]
maximumData [ 346.10 ]
data [ 1.1, 2.3, 1.2, 4.3, 7.8, 8.6, 6.7, ... ]
}

The above example refers to a 25 by 30 by 35 voxel set in X, Y and Z
respectively. There are three threshold pairs which could define values
for bone, muscle and fat. The materialIndex allows different colors to be
used for each threshold category.

VoxelSet {
voxelType RECTILINEAR
dimensions [ 3 ]
arrayBounds [ 25, 30, 35 ]
dataSets [ 3 ]
thresholds [ 0.0, 1.0, 0.25, 0.75, 0.15, 0.35 ]
materialIndex [ 0, 1, 2 ]
minimumData [ 0.0, 35.1, 0.016 ]
maximumData [ 56.0, 427.9, 1.243 ]
coordinates [ 0, 0.1, ..., 2.4, 0, 1, ..., 30, 0, ... ]
data [ 23, 122.3, 0.945, 36, 206.4, 1.147, ... ]
}

The above example refers to a 25 by 30 by 35 voxel set in X, Y and Z
respectively. There are three threshold pairs which could define the
values for the three different data sets. The materialIndex allows
different colors to be used for each data set, while the
minimum/maximumData values help determine normalization for the data. The
coordinates field gives the mapping from computational or data to physical
space.

---------------------------------------------
Timothy Ritchey [email protected]
Jesus College tel: (01)223 576-822
Cambridge fax: (01)223 576-822
CB5 8BL
England