繁体   English   中英

使用鼠标悬停在三个js中更改网格的颜色

[英]Change color of mesh using mouseover in three js

我已经整理了一个使用jsonloader和three.js显示多个网格的WebGL脚本,现在我想添加MouseOver和onClick事件。 第一个是当鼠标悬停在网格上时简单地改变网格的颜色:

function render() {
  requestAnimationFrame(render);    
  mesh.rotation.z += 0.090;    
  raycaster.setFromCamera(mouse, camera);    
  var intersects = raycaster.intersectObjects(scene.children);  

  for (var i = 0; i < intersects.length; i++) {    
    intersects[i].object.material.color.set(0xff0000);    
  }    
  renderer.render(scene, camera);

}

上面的渲染功能允许我将任何网格的颜色悬停在它上面。 我已经尝试了几个if / else变体尝试并且只有在鼠标悬停在网格上时才能使用此效果,但我无法使其工作 - 它只是保持红色。 任何人都可以建议我如何修改我的脚本?

谢谢。

您必须在鼠标移出时将颜色设置回原始颜色,这不会自动发生...

请在http://stemkoski.github.io上查看此示例 ,具体是更新方法:

这里有一个演示小提琴更新到最新的three.js大师:

// create a Ray with origin at the mouse position
//   and direction into the scene (camera direction)
var vector = new THREE.Vector3( mouse.x, mouse.y, 1 );
projector.unprojectVector( vector, camera );
var ray = new THREE.Raycaster( camera.position, vector.sub( camera.position ).normalize() );

// create an array containing all objects in the scene with which the ray intersects
var intersects = ray.intersectObjects( scene.children );

// INTERSECTED = the object in the scene currently closest to the camera 
//      and intersected by the Ray projected from the mouse position    

// if there is one (or more) intersections
if ( intersects.length > 0 )
{
    // if the closest object intersected is not the currently stored intersection object
    if ( intersects[ 0 ].object != INTERSECTED )
    {
        // restore previous intersection object (if it exists) to its original color
        if ( INTERSECTED )
            INTERSECTED.material.color.setHex( INTERSECTED.currentHex );
        // store reference to closest object as current intersection object
        INTERSECTED = intersects[ 0 ].object;
        // store color of closest object (for later restoration)
        INTERSECTED.currentHex = INTERSECTED.material.color.getHex();
        // set a new color for closest object
        INTERSECTED.material.color.setHex( 0xffff00 );
    }
}
else // there are no intersections
{
    // restore previous intersection object (if it exists) to its original color
    if ( INTERSECTED )
        INTERSECTED.material.color.setHex( INTERSECTED.currentHex );
    // remove previous intersection object reference
    //     by setting current intersection object to "nothing"
    INTERSECTED = null;
}

由于上面答案中的代码已经过时(我试过了)...你可以看一下threex.domevents库 它在我的情况下做了伎俩。

threex.domevents是一个three.js扩展,它在3d场景中提供dom事件。 始终努力接近通常的实践,事件名称与DOM中的相同。 语义也是一样的,这使得学习起来非常容易。 目前,可用的事件是click,dblclick,mouseup,mousedown,mouseover和mouse out。

这是一个使用它的示例:

http://bl.ocks.org/fabiovalse/2e8ae04bfce21af400e6

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM