【问题标题】:Mouse Hover not working with different 3dObjects鼠标悬停不适用于不同的 3d 对象
【发布时间】:2015-09-07 20:23:04
【问题描述】:

我正在尝试制作 3d 折线图...Here

因为点和线工作良好,但我想听鼠标悬停在点(球体)上,而不是在线或网格或其他网格对象上...

为此,我有单独的 3d 对象并将它们全部包装在不同的 3d 对象中。 IE。 网格对象有所有网格 points-object 有所有的点 线条对象有所有线条..

 lineContainer = new THREE.Object3D();

                d3.select( lineContainer )
                  .selectAll()
                  .data(currentVal)
                .enter().append(
                  function (d, i) {
                    var LineMaterial = new THREE.LineBasicMaterial({color: d.color});
                    var PI2 = Math.PI * 2;
                    var geometry = new THREE.Geometry();
                    var k = -10;
                    d.points.forEach(function(p){
                        var _x = x1(p.id);
                        var _y = y1(p.y);
                        var _z = (i+1)*10;
                        geometry.vertices.push(new THREE.Vector3(_x,_y,_z));
                    });
                    // for (var j = 0; j < 30; j++) {
                    //     var _point = new THREE.SphereGeometry(0.8);
                    //     var _pointmaterial = new THREE.MeshBasicMaterial( {color: _color(i)} );
                    //     var sphere = new THREE.Mesh( _point, _pointmaterial );
                    //     sphere.position.set(_x,_y,_z);
                    //     parentTransform.add( sphere );
                    // };           
                    var line = new THREE.Line(geometry, LineMaterial);
                    line.userdata = d.id;
                    line.material.linewidth = 2;
                    return line;
                  }
                );

            mainContainer.add( lineContainer );

            pointsContainer = new THREE.Object3D();
                d3.select( pointsContainer )
                  .selectAll()
                  .data(_allPoints)
                .enter().append(
                  function (d, i) {
                    var _x = x1(d.id);
                    var _y = y1(d.y);
                    var _z = d.z*10;
                    var _point = new THREE.SphereGeometry(1.8);
                    var _pointmaterial = new THREE.MeshBasicMaterial( {color: d.color} );
                    var sphere = new THREE.Mesh( _point, _pointmaterial );
                    // sphere.classes = "points";
                    sphere.position.set(_x,_y,_z);
                    sphere.userdata = d;
                    var _toolTipValue = ""+d.id+"("+d.line+")";
                    var spritey = makeTextSprite( _toolTipValue, { fontsize: 14} );
                    spritey.position.set(_x-5,_y+8,_z);
                    spritey.visible = false;
                    d.bindedTip = spritey;
                    tooltipContainer.add(spritey);
                    return sphere;
                  });

            mainContainer.add(pointsContainer);

            scene.add(mainContainer);



 function render() {
            if(!tooltipShow){
            // find intersections
            var vector = new THREE.Vector3( mouse.x, mouse.y, 0.5 );
            // vector.unproject( camera )
            projector.unprojectVector( vector, camera );
            raycaster = new THREE.Raycaster( camera.position, vector.sub( camera.position ).normalize() );

            // raycaster.setFromCamera( mouse, camera );
            //lineintersect

            // var intersects = raycaster.intersectObjects( lineContainer.children, true);


            var pointIntersects = raycaster.intersectObjects( pointsContainer.children, true);
            // console.log(pointIntersects);
            if ( pointIntersects.length > 0 ) {
                console.log(pointIntersects)
                if ( currentPointIntersected !== undefined ) {

                }

                if(currentPointIntersected != pointIntersects[ 0 ].object){
                    currentPointIntersected = pointIntersects[ 0 ].object;
                    console.log(currentIntersected);
                        _allPoints.forEach(function(e,i){
                            if(e.id && e.bindedTip){
                                if(e.id == currentPointIntersected.userdata.id){
                                        e.bindedTip.visible = true;
                                        e.bindedTip.getTexture().needsUpdate = true;
                                        e.isHover = true;

                                }else{
                                        e.bindedTip.visible = false;
                                        e.bindedTip.getTexture().needsUpdate = true;    
                                        e.isHover = false;
                                }
                            }
                        });
                }
            } else {
                if ( currentPointIntersected !== undefined ) {
                    currentPointIntersected.material.linewidth = 1;
                }
                currentPointIntersected = undefined;

            }
            }

            renderer.render( scene, camera );
            stats.update();
        }

我在 here 的 THREEjs 上使用了相同的代码和相同的版本
但只听上层点而不是z轴后面的点....

我怎样才能做到这一点......

【问题讨论】:

  • 将相关代码添加到问题中。链接可能会中断
  • 第一个链接中的代码很大,您可以获取代码但尝试显示有问题的代码
  • 你想在哪里添加悬停行为?
  • 寻找渲染方法,它与动画方法绑定,所以它会每秒调用一次

标签: javascript three.js


【解决方案1】:

我添加了新场景并在渲染器中渲染了两个场景......并将鼠标绑定在顶部场景..以及另一个场景中的所有其他元素..

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-01
    • 2014-04-10
    • 2016-05-17
    • 1970-01-01
    • 2016-12-15
    • 2015-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多