verb-nurbs
Version:
A library for creating and manipulating NURBS surfaces and curves in many languages
155 lines (113 loc) • 4.61 kB
JavaScript
// Some helper methods for the examples
var scene, camera, renderer;
var raycaster = new THREE.Raycaster();
var mouse = new THREE.Vector2();
raycaster.lineprecision = 0.00001;
raycaster.precision = 0.001;
function onMouseMove( event ) {
// calculate mouse position in normalized device coordinates
// (-1 to +1) for both components
mouse.x = ( event.clientX / window.innerWidth ) * 2 - 1;
mouse.y = - ( event.clientY / window.innerHeight ) * 2 + 1;
}
window.addEventListener( 'mousemove', onMouseMove, false );
function setupScene(doUseRaycaster){
useRaycaster = doUseRaycaster;
scene = new THREE.Scene();
camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000 );
camera.lookAt(20,-20,0);
camera.position.x = 30;
camera.position.y = -30;
camera.position.z = 10;
camera.up.set( 0, 0, 1 );
renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.setSize( window.innerWidth, window.innerHeight );
var viewerele = document.getElementById("viewer");
viewerele.appendChild( renderer.domElement );
var ambientLight = new THREE.AmbientLight( 0xbbbbbb );
scene.add( ambientLight );
var lights = [];
lights[0] = new THREE.PointLight( 0xececec, 0.25, 0 );
lights[1] = new THREE.PointLight( 0xececec, 0.25, 0 );
lights[2] = new THREE.PointLight( 0xececec, 0.25, 0 );
lights[0].position.set( 0, 100, 0 );
lights[1].position.set( 100, 200, 100 );
lights[2].position.set( -100, -200, -100 );
scene.add( lights[0] );
scene.add( lights[1] );
scene.add( lights[2] );
}
var intersects = [];
function renderScene(){
var controls = new THREE.OrbitControls(camera, renderer.domElement);
function render() {
if (useRaycaster){
// update the picking ray with the camera and mouse position
raycaster.setFromCamera( mouse, camera );
// clear color
for ( var i = 0; i < intersects.length; i++ ) {
if (!intersects[ i ].object.material.color) continue;
intersects[ i ].object.material.color.set( 0xffffff );
}
// calculate objects intersecting the picking ray
intersects = raycaster.intersectObjects( scene.children );
for ( var i = 0; i < intersects.length; i++ ) {
if (!intersects[ i ].object.material.color) continue;
intersects[ i ].object.material.color.set( 0xff0000 );
}
}
requestAnimationFrame( render );
renderer.render( scene, camera );
}
render();
}
function addCurveToScene(geom, material){
material = material || new THREE.LineBasicMaterial({ linewidth: 2, color: 0xdcdcdc});
scene.add( new THREE.Line( geom, material ) );
}
function addLineToScene(pts, mat){
addCurveToScene(asGeometry(asVector3(pts)), mat);
}
function addMeshToScene(mesh, material, wireframe ){
material = material || new THREE.MeshNormalMaterial( { side: THREE.DoubleSide, wireframe: false, shading: THREE.SmoothShading, transparent: true, opacity: 0.4 } )
// new THREE.MeshPhongMaterial({
// specular: '#ffffff',
// color: '#8e8e8e',
// side: THREE.DoubleSide,
// ambient: '#ffffff',
// emissive: '#111111',
// shininess: 40
// });
scene.add( new THREE.Mesh( mesh, material ) );
if (wireframe){
var material2 = new THREE.MeshBasicMaterial( { color: 0x000000, side: THREE.DoubleSide, wireframe: true } );
var mesh2 = new THREE.Mesh( mesh, material2 );
scene.add( mesh2 );
}
}
function asVector3(pts){
return pts.map(function(x){
return new THREE.Vector3(x[0],x[1],x[2]);
});
}
function asGeometry(threePts){
var geometry = new THREE.Geometry();
geometry.vertices.push.apply( geometry.vertices, threePts );
return geometry;
}
function benchmark(func, runs){
var d1 = Date.now();
for (var i = 0 ; i < runs; i++)
res = func();
var d2 = Date.now();
return { result : res, elapsed : d2-d1, each : (d2-d1)/runs };
}
function pointsAsGeometry(pts){
return asGeometry( asVector3(pts) )
}
function addPointsToScene(pts){
var geom = asGeometry( asVector3( pts ) );
var cloudMat2 = new THREE.PointCloudMaterial({ size: 6.5, sizeAttenuation: false, color: 0xffffff });
var cloud2 = new THREE.PointCloud( geom, cloudMat2 );
scene.add( cloud2 );
}