function Volume( xLength, yLength, zLength, type, arrayBuffer ) {

		if ( arguments.length > 0 ) {

			/**
     * @member {number} xLength Width of the volume in the IJK coordinate system
     */
			this.xLength = Number( xLength ) || 1;
			/**
     * @member {number} yLength Height of the volume in the IJK coordinate system
     */

			this.yLength = Number( yLength ) || 1;
			/**
     * @member {number} zLength Depth of the volume in the IJK coordinate system
     */

			this.zLength = Number( zLength ) || 1;
			/**
     * @member {Array<string>} The order of the Axis dictated by the NRRD header
     */

			this.axisOrder = [ 'x', 'y', 'z' ];
			/**
     * @member {TypedArray} data Data of the volume
     */

			switch ( type ) {

				case 'Uint8':
				case 'uint8':
				case 'uchar':
				case 'unsigned char':
				case 'uint8_t':
					this.data = new Uint8Array( arrayBuffer );
					break;

				case 'Int8':
				case 'int8':
				case 'signed char':
				case 'int8_t':
					this.data = new Int8Array( arrayBuffer );
					break;

				case 'Int16':
				case 'int16':
				case 'short':
				case 'short int':
				case 'signed short':
				case 'signed short int':
				case 'int16_t':
					this.data = new Int16Array( arrayBuffer );
					break;

				case 'Uint16':
				case 'uint16':
				case 'ushort':
				case 'unsigned short':
				case 'unsigned short int':
				case 'uint16_t':
					this.data = new Uint16Array( arrayBuffer );
					break;

				case 'Int32':
				case 'int32':
				case 'int':
				case 'signed int':
				case 'int32_t':
					this.data = new Int32Array( arrayBuffer );
					break;

				case 'Uint32':
				case 'uint32':
				case 'uint':
				case 'unsigned int':
				case 'uint32_t':
					this.data = new Uint32Array( arrayBuffer );
					break;

				case 'longlong':
				case 'long long':
				case 'long long int':
				case 'signed long long':
				case 'signed long long int':
				case 'int64':
				case 'int64_t':
				case 'ulonglong':
				case 'unsigned long long':
				case 'unsigned long long int':
				case 'uint64':
				case 'uint64_t':
					throw 'Error in Volume constructor : this type is not supported in JavaScript';
					break;

				case 'Float32':
				case 'float32':
				case 'float':
					this.data = new Float32Array( arrayBuffer );
					break;

				case 'Float64':
				case 'float64':
				case 'double':
					this.data = new Float64Array( arrayBuffer );
					break;

				default:
					this.data = new Uint8Array( arrayBuffer );

			}

			if ( this.data.length !== this.xLength * this.yLength * this.zLength ) {

				throw 'Error in Volume constructor, lengths are not matching arrayBuffer size';

			}

		}
		/**
   * @member {Array}  spacing Spacing to apply to the volume from IJK to RAS coordinate system
   */


		this.spacing = [ 1, 1, 1 ];
		/**
   * @member {Array}  offset Offset of the volume in the RAS coordinate system
   */

		this.offset = [ 0, 0, 0 ];
		/**
   * @member {Martrix3} matrix The IJK to RAS matrix
   */

		this.matrix = new THREE.Matrix3();
		this.matrix.identity();
		/**
   * @member {Martrix3} inverseMatrix The RAS to IJK matrix
   */

		/**
   * @member {number} lowerThreshold The voxels with values under this threshold won't appear in the slices.
   *                      If changed, geometryNeedsUpdate is automatically set to true on all the slices associated to this volume
   */

		var lowerThreshold = - Infinity;
		Object.defineProperty( this, 'lowerThreshold', {
			get: function () {

				return lowerThreshold;

			},
			set: function ( value ) {

				lowerThreshold = value;
				this.sliceList.forEach( function ( slice ) {

					slice.geometryNeedsUpdate = true;

				} );

			}
		} );
		/**
   * @member {number} upperThreshold The voxels with values over this threshold won't appear in the slices.
   *                      If changed, geometryNeedsUpdate is automatically set to true on all the slices associated to this volume
   */

		var upperThreshold = Infinity;
		Object.defineProperty( this, 'upperThreshold', {
			get: function () {

				return upperThreshold;

			},
			set: function ( value ) {

				upperThreshold = value;
				this.sliceList.forEach( function ( slice ) {

					slice.geometryNeedsUpdate = true;

				} );

			}
		} );
		/**
   * @member {Array} sliceList The list of all the slices associated to this volume
   */

		this.sliceList = [];
		/**
   * @member {Array} RASDimensions This array holds the dimensions of the volume in the RAS space
   */

	}
This class had been written to handle the output of the NRRD loader.
It contains a volume of data and informations about it.
For now it only handles 3 dimensional data.
See the webgl_loader_nrrd.html example and the loaderNRRD.js file to see how to use this class.
@class
@param   {number}        xLength         Width of the volume
@param   {number}        yLength         Length of the volume
@param   {number}        zLength         Depth of the volume
@param   {string}        type            The type of data (uint8, uint16, ...)
@param   {ArrayBuffer}   arrayBuffer     The buffer with volume data