Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript three.js-将摄影机移动到管内几何体_Javascript_Three.js - Fatal编程技术网

Javascript three.js-将摄影机移动到管内几何体

Javascript three.js-将摄影机移动到管内几何体,javascript,three.js,Javascript,Three.js,在3d场景中,通过从外部javascript文件加载200个点作为JSON数据来构建管状几何体。以下是完整的代码: <!DOCTYPE html> <html lang="en"> <head> <title>3d Model using HTML5 and three.js</title> <meta charset="utf-8">

在3d场景中,通过从外部javascript文件加载200个点作为JSON数据来构建管状几何体。以下是完整的代码:

                <!DOCTYPE html>
<html lang="en">
    <head>
        <title>3d Model using HTML5 and three.js</title>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
        <style>
            body {
                font-family: Monospace;
                background-color: #f0f0f0;
                margin: 0px;
                overflow: hidden;
            }
            #Find_panel {
                position: absolute;
                right: 5px;
                top: 5px;
                color: #fff;
                text-align: left;
                background: rgba(0, 0, 0, 0.5);
                padding: 10px;
                width: 290px;
                height: 120px;
                border: solid 1px black;
                border-radius: 5px;
            }
            #Find_panel input {
                padding: 2px 4px;
                margin-bottom: 3px;
            }
        </style>
    </head>
    <body>          
        <input type="button" value="plot" onClick="return plotPath();" />        
        <script src="three.min.js" type="text/javascript"></script>
        <script src="Curve.js" type="text/javascript"></script>
        <script src="TubeGeometry.js" type="text/javascript"></script>      
        <script src="Stats.js" type="text/javascript"></script>
        <script src="Detector.js" type="text/javascript"></script>
        <script src="path.js" type="text/javascript"></script>

        <script>

        // variables
        var container, stats, form;

        var camera, scene, renderer, splineCamera, cameraHelper, cameraEye;

        var text, plane, tube, tubeMesh, parent;

        var targetRotation = 0;
        var targetRotationOnMouseDown = 0;

        var mouseX = 0;
        var mouseXOnMouseDown = 0;

        var windowHalfX = window.innerWidth / 2;
        var windowHalfY = window.innerHeight / 2;

        var binormal = new THREE.Vector3();
        var normal = new THREE.Vector3();

        var materials = []; 
        var onMouseDownMouseX = 0, onMouseDownMouseY = 0,
            lon = 0, onMouseDownLon = 0,isUserInteracting = false,
            lat = 0, onMouseDownLat = 0,
            phi = 0, theta = 0;

        function plotPath()
        {                       
            var obj = getPath();            
            var segments = 50;
            var closed = false;
            var debug = true;
            var radiusSegments = 12;
            var tube;
            var points = [];
            var x=0,y=0,z=0;

            for(var i=0; i<obj.path.length; i++)
            {                               
                console.log(obj.path[i].point);
                points.push(obj.path[i].point);
                extrudePath = new THREE.SplineCurve3(points);
                extrudePath.dynamic = true;

                tube = new THREE.TubeGeometry(extrudePath, segments, 2, radiusSegments, closed, debug);
                tube.dynamic = true;

                tubeMesh = new THREE.Mesh(tube ,new THREE.MeshBasicMaterial({
                    color: 0x000000,side: THREE.DoubleSide,
                    opacity: 0.5,transparent: true,
                    wireframe: true}));
                tubeMesh.__dirtyVertices = true;
                tubeMesh.dynamic = true;

                parent = new THREE.Object3D();
                parent.position.y = 100;

                if ( tube.debug ) tubeMesh.add( tube.debug );
                parent.add( tubeMesh );                                 
            }           
            scene.add( tubeMesh );
            scene.add(parent);
            animate();                          
        } 

        init();                     
        //animate();

        function init(){

            // container
            container = document.createElement( 'div' );
            document.body.appendChild( container );

            // renderer         
            renderer = new THREE.WebGLRenderer( { antialias: true } ); 
            renderer.setSize( window.innerWidth, window.innerHeight );
            container.appendChild( renderer.domElement );

            // scene            
            scene = new THREE.Scene();

            // camera
            camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 1, 1100);          
            camera.position.set(0, 50, 500);            
            camera.lookAt(parent);          

            // CONTROLS         
            controls = new THREE.TrackballControls( this.camera, container );   

            // light            
            scene.add( new THREE.AmbientLight( 0x404040 ) );
            light = new THREE.DirectionalLight( 0xffffff );
            light.position.set( 0, 1, 0 );
            scene.add( light );                 

            // Grid
            geometry = new THREE.Geometry();
            geometry.vertices.push( new THREE.Vector3( - 500, 0, 0 ) );
            geometry.vertices.push( new THREE.Vector3( 500, 0, 0 ) );

            for ( var i = 0; i <= 20; i ++ ) {

                line = new THREE.Line( geometry, new THREE.LineBasicMaterial( { color: 0x000000, opacity: 0.2 } ) );
                line.position.z = ( i * 50 ) - 500;
                scene.add( line );

                line = new THREE.Line( geometry, new THREE.LineBasicMaterial( { color: 0x000000, opacity: 0.2 } ) );
                line.position.x = ( i * 50 ) - 500;
                line.rotation.y = 90 * Math.PI / 180;
                scene.add( line );
            }           

            // projector
            projector = new THREE.Projector();

            // stats
            stats = new Stats();
            stats.domElement.style.position = 'absolute';
            stats.domElement.style.top = '0px';
            //container.appendChild( stats.domElement );

            document.addEventListener( 'mousedown', onDocumentMouseDown, false );
            document.addEventListener( 'mouseover', onDocumentMouseOver, false );
            document.addEventListener( 'mousemove', onDocumentMouseMove, false );
            document.addEventListener( 'touchstart', onDocumentTouchStart, false );
            document.addEventListener( 'touchmove', onDocumentTouchMove, false );
            document.addEventListener( 'mousewheel', onDocumentMouseWheel, false );
            document.addEventListener( 'DOMMouseScroll', onDocumentMouseWheel, false);
            window.addEventListener( 'resize', onWindowResize, false );

        }       

        function onWindowResize() {

            camera.aspect = window.innerWidth / window.innerHeight;
            camera.updateProjectionMatrix();
            renderer.setSize( window.innerWidth, window.innerHeight );

        }

        function onDocumentMouseDown( event ) {
            event.preventDefault();

            document.addEventListener( 'mousemove', onDocumentMouseMove, false );
            document.addEventListener( 'mouseup', onDocumentMouseUp, false );
            document.addEventListener( 'mouseout', onDocumentMouseOut, false );

            isUserInteracting = true;

            onPointerDownPointerX = event.clientX;
            onPointerDownPointerY = event.clientY;

            onPointerDownLon = lon;
            onPointerDownLat = lat;
        }

        function onDocumentMouseMove( event ) {

            if ( isUserInteracting ) {
                    lon = ( onPointerDownPointerX - event.clientX ) * 0.1 + onPointerDownLon;
                    lat = ( event.clientY - onPointerDownPointerY ) * 0.1 + onPointerDownLat;
                }
        }

        function onDocumentMouseUp( event ) {

            isUserInteracting = false;
            document.removeEventListener( 'mousemove', onDocumentMouseMove, false );
            document.removeEventListener( 'mouseup', onDocumentMouseUp, false );
            document.removeEventListener( 'mouseout', onDocumentMouseOut, false );

        }

        function onDocumentMouseOut( event ) {

            document.removeEventListener( 'mousemove', onDocumentMouseMove, false );
            document.removeEventListener( 'mouseup', onDocumentMouseUp, false );
            document.removeEventListener( 'mouseout', onDocumentMouseOut, false );

        }

        function onDocumentMouseOver( event ) {

            document.removeEventListener( 'mousemove', onDocumentMouseMove, false );
            document.removeEventListener( 'mouseup', onDocumentMouseUp, false );
            document.removeEventListener( 'mouseout', onDocumentMouseOut, false );

        }

        function onDocumentTouchStart( event ) {

            if ( event.touches.length === 1 ) {

                event.preventDefault();

                mouseXOnMouseDown = event.touches[ 0 ].pageX - windowHalfX;
                targetRotationOnMouseDown = targetRotation;

            }

        }

        function onDocumentTouchMove( event ) {
            if ( event.touches.length === 1 ) {
                event.preventDefault();
                mouseX = event.touches[ 0 ].pageX - windowHalfX;
                targetRotation = targetRotationOnMouseDown + ( mouseX - mouseXOnMouseDown ) * 0.05;
            }
        }

        function onDocumentMouseWheel( event ) {

            // WebKit

            if ( event.wheelDeltaY ) {

                fov -= event.wheelDeltaY * 0.05;

            // Opera / Explorer 9

            } else if ( event.wheelDelta ) {

                fov -= event.wheelDelta * 0.05;

            // Firefox

            } else if ( event.detail ) {

                fov += event.detail * 1.0;

            }

            camera.projectionMatrix.makePerspective( fov, window.innerWidth / window.innerHeight, 1, 1100 );
            render();

        }

        function animate() {
            requestAnimationFrame( animate );           
            render();
            update();
        }

        function update()
        {
            controls.update();
            stats.update();
        }

        function render() {                         

            lat = Math.max( - 85, Math.min( 85, lat ) );
            phi = ( 90 - lat ) * Math.PI / 180;
            theta = lon * Math.PI / 180;

            camera.target = 500 * Math.sin( phi ) * Math.cos( theta );
            camera.target = 500 * Math.cos( phi );
            camera.target = 500 * Math.sin( phi ) * Math.sin( theta );

            tubeMesh.rotation.y += ( targetRotation - tubeMesh.rotation.y ) * 0.15;         
            camera.updateMatrixWorld();
            camera.lookAt( camera.target );

            renderer.render( scene, camera );
        }
        </script>        
    </body>
</html>
如何通过键盘或轨迹球将相机移动到管状几何体中?

在管几何体内部移动有几种方法。 如果只需要跟随某些轨道,可以创建样条曲线,然后使用

spline.getPointAt( 0 -1 ) 
在你的车上,摄像机上,或者在地铁里移动的任何东西上。
旋转会让事情变得有点棘手。

使用THREE.roll控件实现了类似的功能。
spline.getPointAt( 0 -1 )