function parseNurbsGeometry( geometryNode, relationships ) {

						if ( THREE.NURBSCurve === undefined ) {

							console.error( "THREE.FBXLoader relies on THREE.NURBSCurve for any nurbs present in the model.  Nurbs will show up as empty geometry." );
							return new THREE.BufferGeometry();

						}

						var order = parseInt( geometryNode.properties.Order );

						if ( isNaN( order ) ) {

							console.error( "FBXLoader: Invalid Order " + geometryNode.properties.Order + " given for geometry ID: " + geometryNode.id );
							return new THREE.BufferGeometry();

						}

						var knots = parseFloatArray( geometryNode.subNodes.KnotVector.properties.a );
						var controlPoints = [];
						var pointsValues = parseFloatArray( geometryNode.subNodes.Points.properties.a );

						for ( var i = 0; i < pointsValues.length; i += 4 ) {

							controlPoints.push( new THREE.Vector4( pointsValues[ i ], pointsValues[ i + 1 ], pointsValues[ i + 2 ], pointsValues[ i + 3 ] ) );

						}

						if ( geometryNode.properties.Form === 'Closed' ) {

							controlPoints.push( controlPoints[ 0 ] );

						}

						var curve = new THREE.NURBSCurve( order - 1, knots, controlPoints );
						var vertices = curve.getPoints( controlPoints.length * 1.5 );

						var vertexBuffer = [];
						vertices.forEach( function ( position ) {

							var array = position.toArray();
							vertexBuffer = vertexBuffer.concat( array );

						} );

						var geometry = new THREE.BufferGeometry();
						geometry.addAttribute( 'position', new THREE.BufferAttribute( new Float32Array( vertexBuffer ), 3 ) );

						return geometry;

					}
Specialty function for parsing NurbsCurve based Geometry Nodes.
@param {FBXGeometryNode} geometryNode
@param {{parents: {ID: number, relationship: string}[], children: {ID: number, relationship: string}[]}} relationships
@returns {THREE.BufferGeometry}