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 可点击的三个Js对象/凸项_Javascript_Three.js - Fatal编程技术网

Javascript 可点击的三个Js对象/凸项

Javascript 可点击的三个Js对象/凸项,javascript,three.js,Javascript,Three.js,我修改了Three.js库中的一个示例,并尝试在对象上添加click事件 经过多次尝试。。。我还是听不懂 此代码生成凸形 这是我的代码: if ( ! Detector.webgl ) Detector.addGetWebGLMessage(); var container, stats; var camera, scene, renderer; var objects = []; init();

我修改了Three.js库中的一个示例,并尝试在对象上添加click事件

经过多次尝试。。。我还是听不懂

此代码生成凸形

这是我的代码:

        if ( ! Detector.webgl ) Detector.addGetWebGLMessage();

        var container, stats;

        var camera, scene, renderer;
        var  objects = [];

        init();
        animate();

        function init() {

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

            camera = new THREE.PerspectiveCamera( 45, window.innerWidth / window.innerHeight, 1, 2000 );
            camera.position.y = 400;

            scene = new THREE.Scene();

            var light, object, object2, materials;

            scene.add( new THREE.AmbientLight( 0x404040 ) );

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

            var map = THREE.ImageUtils.loadTexture( 'textures/ash_uvgrid01.jpg' );
            map.wrapS = map.wrapT = THREE.RepeatWrapping;
            map.anisotropy = 16;

            materials = [
                new THREE.MeshLambertMaterial( { ambient: 0xbbbbbb, map: map } ),
                new THREE.MeshBasicMaterial( { color: 0x242424, wireframe: true, transparent: false, opacity: 0.1 } )
            ];


            // random convex

            points = [];
            for ( var i = 0; i < 15; i ++ ) {

                points.push( randomPointInSphere( 50 ) );

            }


            object = THREE.SceneUtils.createMultiMaterialObject( new THREE.ConvexGeometry( points ), materials );
            object.position.set( -250, 0, 200 );
            scene.add( object );


            objects.push( object );

            object.callback = function() { console.log('blabla');}





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

            container.appendChild( renderer.domElement );

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



            window.addEventListener( 'resize', onWindowResize, false );

        }

        function onWindowResize() {

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

            renderer.setSize( window.innerWidth, window.innerHeight );

        }


        function randomPointInSphere( radius ) {

            return new THREE.Vector3(
                ( Math.random() - 0.5 ) * 1 * radius,
                ( Math.random() - 0.5 ) * 1 * radius,
                ( Math.random() - 0.5 ) * 1 * radius
            );

        }

        function animate() {

            requestAnimationFrame( animate );

            render();
            stats.update();

        }

        function render() {

            var timer = Date.now() * 0.0001;

            camera.position.x = Math.cos( timer ) * 800;
            camera.position.z = Math.sin( timer ) * 800;

            camera.lookAt( scene.position );

            for ( var i = 0, l = scene.children.length; i < l; i ++ ) {

                var object = scene.children[ i ];

                object.rotation.x = timer * 5;
                object.rotation.y = timer * 2.5;

            }

            renderer.render( scene, camera );

        }

        function addMeteor()
        {
                    var map = THREE.ImageUtils.loadTexture( 'textures/ash_uvgrid01.jpg' );
            map.wrapS = map.wrapT = THREE.RepeatWrapping;
            map.anisotropy = 16;

                    var materials = [
                new THREE.MeshLambertMaterial( { ambient: 0xbbbbbb, map: map } ),
                new THREE.MeshBasicMaterial( { color: 0x242424, wireframe: true, transparent: false, opacity: 0.1 } )
            ];
            objects.push( materials );
                var object3;
                var points3 = [];
            for ( var i = 0; i < 10; i ++ ) {

                points3.push( randomPointInSphere( 50 ) );

            }

            object3 = THREE.SceneUtils.createMultiMaterialObject( new THREE.ConvexGeometry( points3 ), materials );
            object3.position.set( -50, Math.floor((Math.random()*window.innerWidth)), Math.floor((Math.random()* window.innerHeight)) );
            scene.add( object3 );
            objects.push( object3 );

        }
            projector = new THREE.Projector();
        // listeners
            document.addEventListener( 'mousedown', onDocumentMouseDown, false)

            // keyboard handler
            function onDocumentMouseDown( event ) {

                event.preventDefault();
                 console.log('blabla');

                var vector = new THREE.Vector3( 
                    ( event.clientX / window.innerWidth ) * 2 - 1, 
                    - ( event.clientY / window.innerHeight ) * 2 + 1, 
                    0.5 );

                projector.unprojectVector( vector, camera );

                var ray = new THREE.Raycaster( camera.position, vector.sub( camera.position ).normalize() );
                 console.log(objects);   
                var intersects = ray.intersectObjects( objects ); 
                  console.log(intersects);   

                if ( intersects.length > 0 ) {

                    intersects[0].object.callback();

                    console.log('blabla');

                }

            }


        renderer.render( scene, camera );
if(!Detector.webgl)Detector.addGetWebGLMessage();
var容器,stats;
摄像机、场景、渲染器;
var对象=[];
init();
制作动画();
函数init(){
container=document.createElement('div');
文件.正文.附件(容器);
摄像头=新的三个透视摄像头(45,window.innerWidth/window.innerHeight,12000);
摄像机位置y=400;
场景=新的三个。场景();
var灯光、对象、对象2、材质;
添加(新的三个环境光(0x404040));
灯光=新的三个方向灯光(0xffffff);
光。位置。设置(0,1,0);
场景。添加(灯光);
var map=THREE.ImageUtils.loadTexture('textures/ash_uvgrid01.jpg');
map.wrapps=map.wrapT=THREE.RepeatWrapping;
map.各向异性=16;
材料=[
新的3.MeshLambertMaterial({ambient:0xbbbbbb,map:map}),
新的3.MeshBasicMaterial({颜色:0x242424,线框:真,透明:假,不透明度:0.1})
];
//随机凸
点数=[];
对于(变量i=0;i<15;i++){
点推(随机点球(50));
}
对象=三个.SceneUtils.createMultiMaterialObject(新的三个.凸面几何体(点),材质);
对象.position.set(-250,0200);
场景。添加(对象);
对象。推(对象);
object.callback=function(){console.log('blablabla');}
renderer=new THREE.WebGLRenderer({antialas:true});
renderer.setSize(window.innerWidth、window.innerHeight);
container.appendChild(renderer.doElement);
统计数据=新统计数据();
stats.domElement.style.position='绝对';
stats.domElement.style.top='0px';
container.appendChild(stats.domeElement);
addEventListener('resize',onWindowResize,false);
}
函数onWindowResize(){
camera.aspect=window.innerWidth/window.innerHeight;
camera.updateProjectMatrix();
renderer.setSize(window.innerWidth、window.innerHeight);
}
函数randomPointInSphere(半径){
返回新的3.Vector3(
(数学随机()-0.5)*1*半径,
(数学随机()-0.5)*1*半径,
(数学随机()-0.5)*1*半径
);
}
函数animate(){
请求动画帧(动画);
render();
stats.update();
}
函数render(){
var timer=Date.now()*0.0001;
camera.position.x=数学cos(计时器)*800;
camera.position.z=Math.sin(计时器)*800;
摄像机。注视(场景。位置);
对于(变量i=0,l=scene.children.length;i0){
相交[0]。对象。回调();
console.log('blabla');
}
}
渲染器。渲染(场景、摄影机);
谁能给点帮助吗

我应该把网格推进到对象数组中。
但是哪一个呢

THREE.SceneUtils.createMultiMaterialObject()
使用两个子网格创建对象

因此,在调用
Raycaster.intersectObjects()时,需要将
recursive
标志设置为
true
var intersects = ray.intersectObjects( objects, true );