|
@@ -37,6 +37,7 @@
|
|
|
|
|
|
import { NURBSCurve } from 'three/addons/curves/NURBSCurve.js';
|
|
import { NURBSCurve } from 'three/addons/curves/NURBSCurve.js';
|
|
import { NURBSSurface } from 'three/addons/curves/NURBSSurface.js';
|
|
import { NURBSSurface } from 'three/addons/curves/NURBSSurface.js';
|
|
|
|
+ import { NURBSVolume } from 'three/addons/curves/NURBSVolume.js';
|
|
import { ParametricGeometry } from 'three/addons/geometries/ParametricGeometry.js';
|
|
import { ParametricGeometry } from 'three/addons/geometries/ParametricGeometry.js';
|
|
|
|
|
|
let container, stats;
|
|
let container, stats;
|
|
@@ -112,7 +113,7 @@
|
|
const nurbsMaterial = new THREE.LineBasicMaterial( { color: 0x333333 } );
|
|
const nurbsMaterial = new THREE.LineBasicMaterial( { color: 0x333333 } );
|
|
|
|
|
|
const nurbsLine = new THREE.Line( nurbsGeometry, nurbsMaterial );
|
|
const nurbsLine = new THREE.Line( nurbsGeometry, nurbsMaterial );
|
|
- nurbsLine.position.set( 200, - 100, 0 );
|
|
|
|
|
|
+ nurbsLine.position.set( 0, - 100, 0 );
|
|
group.add( nurbsLine );
|
|
group.add( nurbsLine );
|
|
|
|
|
|
const nurbsControlPointsGeometry = new THREE.BufferGeometry();
|
|
const nurbsControlPointsGeometry = new THREE.BufferGeometry();
|
|
@@ -125,51 +126,197 @@
|
|
group.add( nurbsControlPointsLine );
|
|
group.add( nurbsControlPointsLine );
|
|
|
|
|
|
// NURBS surface
|
|
// NURBS surface
|
|
-
|
|
|
|
- const nsControlPoints = [
|
|
|
|
- [
|
|
|
|
- new THREE.Vector4( - 200, - 200, 100, 1 ),
|
|
|
|
- new THREE.Vector4( - 200, - 100, - 200, 1 ),
|
|
|
|
- new THREE.Vector4( - 200, 100, 250, 1 ),
|
|
|
|
- new THREE.Vector4( - 200, 200, - 100, 1 )
|
|
|
|
- ],
|
|
|
|
- [
|
|
|
|
- new THREE.Vector4( 0, - 200, 0, 1 ),
|
|
|
|
- new THREE.Vector4( 0, - 100, - 100, 5 ),
|
|
|
|
- new THREE.Vector4( 0, 100, 150, 5 ),
|
|
|
|
- new THREE.Vector4( 0, 200, 0, 1 )
|
|
|
|
- ],
|
|
|
|
- [
|
|
|
|
- new THREE.Vector4( 200, - 200, - 100, 1 ),
|
|
|
|
- new THREE.Vector4( 200, - 100, 200, 1 ),
|
|
|
|
- new THREE.Vector4( 200, 100, - 250, 1 ),
|
|
|
|
- new THREE.Vector4( 200, 200, 100, 1 )
|
|
|
|
- ]
|
|
|
|
- ];
|
|
|
|
- const degree1 = 2;
|
|
|
|
- const degree2 = 3;
|
|
|
|
- const knots1 = [ 0, 0, 0, 1, 1, 1 ];
|
|
|
|
- const knots2 = [ 0, 0, 0, 0, 1, 1, 1, 1 ];
|
|
|
|
- const nurbsSurface = new NURBSSurface( degree1, degree2, knots1, knots2, nsControlPoints );
|
|
|
|
-
|
|
|
|
- const map = new THREE.TextureLoader().load( 'textures/uv_grid_opengl.jpg' );
|
|
|
|
- map.wrapS = map.wrapT = THREE.RepeatWrapping;
|
|
|
|
- map.anisotropy = 16;
|
|
|
|
- map.colorSpace = THREE.SRGBColorSpace;
|
|
|
|
-
|
|
|
|
- function getSurfacePoint( u, v, target ) {
|
|
|
|
-
|
|
|
|
- return nurbsSurface.getPoint( u, v, target );
|
|
|
|
-
|
|
|
|
|
|
+ {
|
|
|
|
+
|
|
|
|
+ const nsControlPoints = [
|
|
|
|
+ [
|
|
|
|
+ new THREE.Vector4( - 200, - 200, 100, 1 ),
|
|
|
|
+ new THREE.Vector4( - 200, - 100, - 200, 1 ),
|
|
|
|
+ new THREE.Vector4( - 200, 100, 250, 1 ),
|
|
|
|
+ new THREE.Vector4( - 200, 200, - 100, 1 )
|
|
|
|
+ ],
|
|
|
|
+ [
|
|
|
|
+ new THREE.Vector4( 0, - 200, 0, 1 ),
|
|
|
|
+ new THREE.Vector4( 0, - 100, - 100, 5 ),
|
|
|
|
+ new THREE.Vector4( 0, 100, 150, 5 ),
|
|
|
|
+ new THREE.Vector4( 0, 200, 0, 1 )
|
|
|
|
+ ],
|
|
|
|
+ [
|
|
|
|
+ new THREE.Vector4( 200, - 200, - 100, 1 ),
|
|
|
|
+ new THREE.Vector4( 200, - 100, 200, 1 ),
|
|
|
|
+ new THREE.Vector4( 200, 100, - 250, 1 ),
|
|
|
|
+ new THREE.Vector4( 200, 200, 100, 1 )
|
|
|
|
+ ]
|
|
|
|
+ ];
|
|
|
|
+ const degree1 = 2;
|
|
|
|
+ const degree2 = 3;
|
|
|
|
+ const knots1 = [ 0, 0, 0, 1, 1, 1 ];
|
|
|
|
+ const knots2 = [ 0, 0, 0, 0, 1, 1, 1, 1 ];
|
|
|
|
+ const nurbsSurface = new NURBSSurface( degree1, degree2, knots1, knots2, nsControlPoints );
|
|
|
|
+
|
|
|
|
+ const map = new THREE.TextureLoader().load( 'textures/uv_grid_opengl.jpg' );
|
|
|
|
+ map.wrapS = map.wrapT = THREE.RepeatWrapping;
|
|
|
|
+ map.anisotropy = 16;
|
|
|
|
+ map.colorSpace = THREE.SRGBColorSpace;
|
|
|
|
+
|
|
|
|
+ function getSurfacePoint( u, v, target ) {
|
|
|
|
+
|
|
|
|
+ return nurbsSurface.getPoint( u, v, target );
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ const geometry = new ParametricGeometry( getSurfacePoint, 20, 20 );
|
|
|
|
+ const material = new THREE.MeshLambertMaterial( { map: map, side: THREE.DoubleSide } );
|
|
|
|
+ const object = new THREE.Mesh( geometry, material );
|
|
|
|
+ object.position.set( - 400, 100, 0 );
|
|
|
|
+ object.scale.multiplyScalar( 1 );
|
|
|
|
+ group.add( object );
|
|
|
|
+
|
|
}
|
|
}
|
|
-
|
|
|
|
- const geometry = new ParametricGeometry( getSurfacePoint, 20, 20 );
|
|
|
|
- const material = new THREE.MeshLambertMaterial( { map: map, side: THREE.DoubleSide } );
|
|
|
|
- const object = new THREE.Mesh( geometry, material );
|
|
|
|
- object.position.set( - 200, 100, 0 );
|
|
|
|
- object.scale.multiplyScalar( 1 );
|
|
|
|
- group.add( object );
|
|
|
|
-
|
|
|
|
|
|
+
|
|
|
|
+ // NURBS volume
|
|
|
|
+ {
|
|
|
|
+
|
|
|
|
+ const nsControlPoints = [
|
|
|
|
+ [
|
|
|
|
+ [
|
|
|
|
+ new THREE.Vector4( - 200, - 200, - 200, 1 ),
|
|
|
|
+ new THREE.Vector4( - 200, - 200, 200, 1 )
|
|
|
|
+ ],
|
|
|
|
+ [
|
|
|
|
+ new THREE.Vector4( - 200, - 100, - 200, 1 ),
|
|
|
|
+ new THREE.Vector4( - 200, - 100, 200, 1 )
|
|
|
|
+ ],
|
|
|
|
+ [
|
|
|
|
+ new THREE.Vector4( - 200, 100, - 200, 1 ),
|
|
|
|
+ new THREE.Vector4( - 200, 100, 200, 1 )
|
|
|
|
+ ],
|
|
|
|
+ [
|
|
|
|
+ new THREE.Vector4( - 200, 200, - 200, 1 ),
|
|
|
|
+ new THREE.Vector4( - 200, 200, 200, 1 )
|
|
|
|
+ ]
|
|
|
|
+ ],
|
|
|
|
+ [
|
|
|
|
+ [
|
|
|
|
+ new THREE.Vector4( 0, - 200, - 200, 1 ),
|
|
|
|
+ new THREE.Vector4( 0, - 200, 200, 1 )
|
|
|
|
+ ],
|
|
|
|
+ [
|
|
|
|
+ new THREE.Vector4( 0, - 100, - 200, 1 ),
|
|
|
|
+ new THREE.Vector4( 0, - 100, 200, 1 )
|
|
|
|
+ ],
|
|
|
|
+ [
|
|
|
|
+ new THREE.Vector4( 0, 100, - 200, 1 ),
|
|
|
|
+ new THREE.Vector4( 0, 100, 200, 1 )
|
|
|
|
+ ],
|
|
|
|
+ [
|
|
|
|
+ new THREE.Vector4( 0, 200, - 200, 1 ),
|
|
|
|
+ new THREE.Vector4( 0, 200, 200, 1 )
|
|
|
|
+ ]
|
|
|
|
+ ],
|
|
|
|
+ [
|
|
|
|
+ [
|
|
|
|
+ new THREE.Vector4( 200, - 200, - 200, 1 ),
|
|
|
|
+ new THREE.Vector4( 200, - 200, 200, 1 )
|
|
|
|
+ ],
|
|
|
|
+ [
|
|
|
|
+ new THREE.Vector4( 200, - 100, 0, 1 ),
|
|
|
|
+ new THREE.Vector4( 200, - 100, 100, 1 )
|
|
|
|
+ ],
|
|
|
|
+ [
|
|
|
|
+ new THREE.Vector4( 200, 100, 0, 1 ),
|
|
|
|
+ new THREE.Vector4( 200, 100, 100, 1 )
|
|
|
|
+ ],
|
|
|
|
+ [
|
|
|
|
+ new THREE.Vector4( 200, 200, 0, 1 ),
|
|
|
|
+ new THREE.Vector4( 200, 200, 100, 1 )
|
|
|
|
+ ]
|
|
|
|
+ ]
|
|
|
|
+ ];
|
|
|
|
+ const degree1 = 2;
|
|
|
|
+ const degree2 = 3;
|
|
|
|
+ const degree3 = 1;
|
|
|
|
+ const knots1 = [ 0, 0, 0, 1, 1, 1 ];
|
|
|
|
+ const knots2 = [ 0, 0, 0, 0, 1, 1, 1, 1 ];
|
|
|
|
+ const knots3 = [ 0, 0, 1, 1 ];
|
|
|
|
+ const nurbsVolume = new NURBSVolume( degree1, degree2, degree3, knots1, knots2, knots3, nsControlPoints );
|
|
|
|
+
|
|
|
|
+ const map = new THREE.TextureLoader().load( 'textures/uv_grid_opengl.jpg' );
|
|
|
|
+ map.wrapS = map.wrapT = THREE.RepeatWrapping;
|
|
|
|
+ map.anisotropy = 16;
|
|
|
|
+ map.colorSpace = THREE.SRGBColorSpace;
|
|
|
|
+
|
|
|
|
+ // Since ParametricGeometry() only support bi-variate parametric geometries
|
|
|
|
+ // we create evaluation functions for different surfaces with one of the three
|
|
|
|
+ // parameter values (u, v, w) kept constant and create multiple THREE.Mesh
|
|
|
|
+ // objects one for each surface
|
|
|
|
+ function getSurfacePointFront( u, v, target ) {
|
|
|
|
+
|
|
|
|
+ return nurbsVolume.getPoint( u, v, 0, target );
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ function getSurfacePointMiddle( u, v, target ) {
|
|
|
|
+
|
|
|
|
+ return nurbsVolume.getPoint( u, v, 0.5, target );
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ function getSurfacePointBack( u, v, target ) {
|
|
|
|
+
|
|
|
|
+ return nurbsVolume.getPoint( u, v, 1, target );
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ function getSurfacePointTop( u, w, target ) {
|
|
|
|
+
|
|
|
|
+ return nurbsVolume.getPoint( u, 1, w, target );
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ function getSurfacePointSide( v, w, target ) {
|
|
|
|
+
|
|
|
|
+ return nurbsVolume.getPoint( 0, v, w, target );
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ const geometryFront = new ParametricGeometry( getSurfacePointFront, 20, 20 );
|
|
|
|
+ const materialFront = new THREE.MeshLambertMaterial( { map: map, side: THREE.DoubleSide } );
|
|
|
|
+ const objectFront = new THREE.Mesh( geometryFront, materialFront );
|
|
|
|
+ objectFront.position.set( 400, 100, 0 );
|
|
|
|
+ objectFront.scale.multiplyScalar( 0.5 );
|
|
|
|
+ group.add( objectFront );
|
|
|
|
+
|
|
|
|
+ const geometryMiddle = new ParametricGeometry( getSurfacePointMiddle, 20, 20 );
|
|
|
|
+ const materialMiddle = new THREE.MeshLambertMaterial( { map: map, side: THREE.DoubleSide } );
|
|
|
|
+ const objectMiddle = new THREE.Mesh( geometryMiddle, materialMiddle );
|
|
|
|
+ objectMiddle.position.set( 400, 100, 0 );
|
|
|
|
+ objectMiddle.scale.multiplyScalar( 0.5 );
|
|
|
|
+ group.add( objectMiddle );
|
|
|
|
+
|
|
|
|
+ const geometryBack = new ParametricGeometry( getSurfacePointBack, 20, 20 );
|
|
|
|
+ const materialBack = new THREE.MeshLambertMaterial( { map: map, side: THREE.DoubleSide } );
|
|
|
|
+ const objectBack = new THREE.Mesh( geometryBack, materialBack );
|
|
|
|
+ objectBack.position.set( 400, 100, 0 );
|
|
|
|
+ objectBack.scale.multiplyScalar( 0.5 );
|
|
|
|
+ group.add( objectBack );
|
|
|
|
+
|
|
|
|
+ const geometryTop = new ParametricGeometry( getSurfacePointTop, 20, 20 );
|
|
|
|
+ const materialTop = new THREE.MeshLambertMaterial( { map: map, side: THREE.DoubleSide } );
|
|
|
|
+ const objectTop = new THREE.Mesh( geometryTop, materialTop );
|
|
|
|
+ objectTop.position.set( 400, 100, 0 );
|
|
|
|
+ objectTop.scale.multiplyScalar( 0.5 );
|
|
|
|
+ group.add( objectTop );
|
|
|
|
+
|
|
|
|
+ const geometrySide = new ParametricGeometry( getSurfacePointSide, 20, 20 );
|
|
|
|
+ const materialSide = new THREE.MeshLambertMaterial( { map: map, side: THREE.DoubleSide } );
|
|
|
|
+ const objectSide = new THREE.Mesh( geometrySide, materialSide );
|
|
|
|
+ objectSide.position.set( 400, 100, 0 );
|
|
|
|
+ objectSide.scale.multiplyScalar( 0.5 );
|
|
|
|
+ group.add( objectSide );
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
//
|
|
//
|
|
|
|
|
|
renderer = new THREE.WebGLRenderer( { antialias: true } );
|
|
renderer = new THREE.WebGLRenderer( { antialias: true } );
|