javascript - 使用光线转换器单击时隐藏对象

标签 javascript three.js raycasting

我想通过点击隐藏场景对象, 我读了很多“raycaster”教程,但我不知道我的错在哪里 使用这些代码,当我打开 HTML 文件时,所有对象都被隐藏。 我已经删除了大部分对 raycaster 不敬的代码。

    <script>

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

        var SCREEN_WIDTH = window.innerWidth;
        var SCREEN_HEIGHT = window.innerHeight;
        var FLOOR = -250;

        var container, stats;
         var  group1 , group2 , group3 ;
        var camera, scene, controls;
        var renderer;

        var mesh;
        var textureCube;
        var cameraCube, sceneCube;
        var loader;


        var mouseX = 0, mouseY = 0;

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

        init();
        animate();

        function init() {

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

            // CAMERA and controls

            ....

            // SCENE

            scene = new THREE.Scene();

            // SKYBOX

            .....


              //models

               group1=...
               group2=...
               group3=...


        cubes = new THREE.Object3D() ;
        cubes.add( group1 ) ;
        cubes.add( group2 ) ;
        cubes.add( group3 ) ;

         mouseVector = new THREE.Vector3();
        projector = new THREE.Projector();

            // LIGHTS
            lights...

            // RENDERER

            renderer = new THREE.WebGLRenderer( { antialias: true } );
            renderer.setPixelRatio( window.devicePixelRatio );
            renderer.setSize( SCREEN_WIDTH, SCREEN_HEIGHT );
            renderer.domElement.style.position = "relative";

            renderer.autoClear = false;

            container.appendChild( renderer.domElement );

            //

            renderer.gammaInput = true;
            renderer.gammaOutput = true;

            // STATS

            stats = new Stats();
            container.appendChild( stats.domElement );

            // EVENTS

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


        }

        //

        function onWindowResize( event ) {

            ....
        }


        function onDocumentMouseMove(event) {
            mouseX = ( event.clientX - windowHalfX );
            mouseY = ( event.clientY - windowHalfY );
            mouseVector.x = 2 * (e.clientX / containerWidth) - 1;
            mouseVector.y = 1 - 2 * ( e.clientY / containerHeight );
        }


        //

        function animate() {

            requestAnimationFrame( animate );

            render();
            stats.update();

        }

        function render() {

            controls.update();

            cameraCube.rotation.copy( camera.rotation );

            renderer.clear();
            renderer.render( sceneCube, cameraCube );

        //raycast
             var raycaster = projector.pickingRay( mouseVector.clone(), camera );

            window.addEventListener( 'mousedown', onMouseDown, false );
            var onMouseDown = function ( event ) {
                     var intersects = raycaster.intersectObjects( cubes.children );
                      var intersection = intersects[0] , obj = intersection.object ;
                      obj.visible = false ; 
            };

            renderer.render( scene, camera );

        }

    </script>

最佳答案

您在渲染时对每一帧进行光线转换。当您想通过鼠标点击进行光线转换时,您需要一个事件监听器:

window.addEventListener( 'mousedown', onMouseDown, false );
var onMouseDown = function ( event ) {
    var intersects = raycaster.intersectObjects( cubes.children );
    var intersection = intersects[0], obj = intersection.object;
    obj.visible = false ;
};

关于javascript - 使用光线转换器单击时隐藏对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31901295/

相关文章:

javascript - 嵌套 module.exports 的说明

javascript - 原型(prototype)和构造函数对象属性

javascript - Three.js 中的光线转换和容器

java - Libgdx 3d 中的光线转换

javascript - 如何防止提示对话框在输入时提交表单

javascript - Angular 需要点击两次才能显示 Google 地理编码位置

THREE.js 识别对一个几何体的点击(合并几何体)

three.js - 为什么在三个js中增加对象的比例时fps会下降

javascript - 三.js : Can i create mesh to replace lot of object

javascript - ThreeJS raycaster 关闭,相机和对象的坐标大于 1000000