【问题标题】:Hide objects on Click with raycaster使用 raycaster 单击时隐藏对象
【发布时间】:2015-11-01 06:56:52
【问题描述】:

我想通过点击隐藏场景对象, 我阅读了许多“光线投射器”教程,但我不知道我的错在哪里 当我打开我的 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>

【问题讨论】:

    标签: javascript three.js raycasting


    【解决方案1】:

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

    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 ;
    };
    

    【讨论】:

    • 非常感谢您的帮助我完全错了,我更改了您在第一篇文章中看到的代码,但现在所有对象都可见并且没有任何反应!
    • 确保您在网格而不是组上进行光线投射。因为缺少那部分代码,我猜你是在对组进行射线测试,出于测试目的,将所有网格放入一个数组中,并将其用于raycaster.intersectObjects( yourMeshArray );
    • 是的,我正在对我不知道的群组进行光线投射,我会对其进行测试,再次感谢您的帮助
    猜你喜欢
    • 2015-02-12
    • 1970-01-01
    • 2021-04-30
    • 1970-01-01
    • 2011-08-26
    • 2014-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多