【问题标题】:Clickable objects inside equirectangular map three.jsequirectangular map three.js中的可点击对象
【发布时间】:2015-11-12 07:23:06
【问题描述】:

我正在尝试使用 raycaster 使对象变得可点击。我见过无数这样的例子,我已经多次尝试了这段代码,但都没有成功。我看到的示例与我遇到的其他示例之间的唯一区别是我在一个球体内。

我通过创建一些变量来开始我的代码(有些可能不会从使用过去的示例中遗留下来)。

 var container, stats;
 var camera, controls, scene, renderer, projector;
 var isUserInteracting = false;
 var mouse = { x: 0, y: 0, z: 0 }, intersected;




  var fov = 70,
  texture_placeholder,
  isUserInteracting = false,
  onMouseDownMouseX = 0, onMouseDownMouseY = 0,
  lon = 0, onMouseDownLon = 0,
  lat = 0, onMouseDownLat = 0,
  phi = 0, theta = 0;

  init();
  animate();

我继续设置我的 init() 函数,在其中设置相机并创建我的球体。

        function init() {

            var container, mesh1;



            container = document.getElementById( 'container' );

            camera = new THREE.PerspectiveCamera( fov, window.innerWidth / window.innerHeight, 1, 1100 );
            camera.target = new THREE.Vector3( 0, 0, 0 );

            scene = new THREE.Scene();

            projector = new THREE.Projector();

            mesh1 = new THREE.Mesh( new THREE.SphereGeometry( 500, 60, 40 ), new THREE.MeshBasicMaterial( { map: THREE.ImageUtils.loadTexture( "spherical_map_small.jpg" )} ) );
            mesh1.scale.x = -1;
            mesh1.side = THREE.DoubleSide;
            scene.add( mesh1 );

仍然在 init() 函数中,然后我创建了一个立方体几何体(这是我想要可点击的)。

meshMaterial = new THREE.MeshBasicMaterial({ color: 0x33CC00});

            var geometry = new THREE.CubeGeometry( 20, 20, 20 );

            var object = new THREE.Mesh( geometry, new THREE.MeshBasicMaterial( { color: 0x33CC00} ) );
            object.position.x = 75;
            object.position.y = 10;
            object.position.z = 0;

            object.rotation.y = 45;

            scene.add( object );

            objects.push( object ); 

仍然在 init() 中,我设置了渲染器,并添加了一些事件侦听器。

            renderer = new THREE.WebGLRenderer();

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

            container.appendChild( renderer.domElement );

            document.addEventListener( 'mousedown', onDocumentMouseDown, false );
            document.addEventListener( 'mousemove', onDocumentMouseMove, false );
            document.addEventListener( 'mouseup', onDocumentMouseUp, false );
            document.addEventListener( 'mousewheel', onDocumentMouseWheel, false );
            document.addEventListener( 'DOMMouseScroll', onDocumentMouseWheel, false);

            //

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

现在的问题。接下来是应该使我的框“对象”可点击的功能,这似乎不起作用。我相信我是在告诉它说“有效”。每次单击场景中的对象时。

我已经阅读了有关使用three.js 进行光线投射的内容几个小时,并且相信我对它应该如何工作有相当的了解,但我就是无法让它工作。

        function onDocumentMouseUp( event ) {

            isUserInteracting = false;

            mouse.x = ( event.clientX / window.innerWidth ) * 2 - 1;
            mouse.y = - ( event.clientY / window.innerHeight ) * 2 + 1;

            var vector = new THREE.Vector3( mouse.x, mouse.y, .5 );

            var raycaster = new THREE.Raycaster();
            raycaster.setFromCamera(vector, camera);
            var intersects = raycaster.intersectObjects(scene, true);

            if ( intersects.length ) {
                alert('works.');
            } 

        }

任何帮助将不胜感激。谢谢。

【问题讨论】:

    标签: javascript three.js


    【解决方案1】:

    只是一个想法,尝试使用:

    raycaster.intersectObjects(scene.children, true);
    

    你是否设置了递归(真)?否则它不会检查后代

    【讨论】:

    • 感谢您的回复。我尝试使用raycaster.intersectObjects(scene.children, true);,但它似乎仍然不起作用,我什至删除了 true。我是 Javascript 和 three.js 的新手,递归是什么意思?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-18
    • 2021-12-24
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多