Change color of mesh using mouseover in three js

后端 未结 2 771
情书的邮戳
情书的邮戳 2021-02-20 06:23

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 cha

相关标签:
2条回答
  • 2021-02-20 06:58

    As the code in the answer above is outdated (I tried it)... you can take a look at threex.domevents library. It did the trick in my case.

    threex.domevents is a three.js extension which provide dom events inside your 3d scene. Always in a effort to stay close to usual pratices, the events name are the same as in DOM. The semantic is the same too, which makes it all very easy to learn. Currently, the available events are click, dblclick, mouseup, mousedown, mouseover and mouse out.

    Here's an example that uses it:

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

    0 讨论(0)
  • 2021-02-20 07:07

    You have to set the color back to the original color on mouse out, that won't happen automatically...

    Check this example on http://stemkoski.github.io specifically the update method:

    Here a fiddle with a demo updated to the latest three.js master:

    // 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;
    }
    
    0 讨论(0)
提交回复
热议问题