I've put together a WebGL script that displays several meshes using jsonloader and three.js and I now want to add MouseOver and onClick events. The first of these is simply changing the colour of the mesh when the mouse hovers over it:
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);
}
The render function above allows me to change the colour of any mesh to red by hovering over it. I've tried several if/else variants to try and have this effect only work when the mouse is over a mesh but I can't get it to work- it just stays red. Can anyone suggest how I might amend my script?
Thanks.
答案 0 :(得分:12)
您必须在鼠标输出时将颜色设置回原始颜色,这不会自动发生......
在this example上专门检查http://stemkoski.github.io更新方法:
Here a fiddle with a demo更新到最新的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;
}
答案 1 :(得分:1)
由于上面答案中的代码已过时(我试过了)......您可以查看threex.domevents library。在我的案例中它完成了这个技巧。
threex.domevents是一个three.js扩展,它在3d场景中提供dom事件。始终努力保持接近平时 实践中,事件名称与DOM中的相同。语义是 同样也是如此,这使得学习起来非常容易。目前, 可用事件有click,dblclick,mouseup,mousedown,mouseover 和鼠标一起出去。
以下是使用它的示例: