Search code examples
javascriptthree.jslight

Three.js - SELECTED SpotLight & dat.gui


I'm adding a SpotLight to my scene and an OctahedronGeometry (as helper) in order to make it visible to the user. The user has to be able to move the SpotLight with the transformControls by clicking on it to select it. And it works !

But, when selected, I want to be able to edit the SpotLight settings. The problem is that I'm interacting with the geometry (which is selected) and not with the SpotLight directly.

Here's my function:

var aSpotLight = document.getElementById("addSpotLight");
aSpotLight.addEventListener("click", addSpotLight, false);

    function addSpotLight(){
        var object = new THREE.SpotLight( 0xffffff, 1, 0, Math.PI * 0.1, 10 );
        object.name = 'SpotLight';
        var helper = new THREE.Mesh(new THREE.OctahedronGeometry(10, 0), new THREE.MeshBasicMaterial( { color: 0x00ee00, wireframe: true, transparent: true } ));
        helper.position.set( 0, 30, 0 );
        object.position.set( 0, 30, 0 );

        scene.add(helper);
        helper.add( object );

        objects.push(object);

        renderer.render( scene, camera );
        material.needsUpdate = true;
    }

And here's my dat.gui settings:

selectedObjectAppearance = {
        lightColor : 0xffffff,
        lightDistance : 10,
        lightIntensity : 1,
        lightlightShadowDarkness : 1
    };

    guiObject.addColor(selectedObjectAppearance, 'lightColor').name('Light Color').onChange(function (e) {SELECTED.children.color = new THREE.Color(e);});
        guiObject.add( selectedObjectAppearance, 'lightDistance' ).min(1).max(15).step(0.5).name('Light distance').onChange(function (e) {SELECTED.distance = e;});
        guiObject.add( selectedObjectAppearance, 'lightIntensity' ).min(0).max(1).step(0.05).name('Light intensity').onChange(function (e) {SELECTED.intensity = e;});
        guiObject.add( selectedObjectAppearance, 'lightlightShadowDarkness' ).min(0).max(1).step(0.05).name('Light shadow darkness').onChange(function (e) {SELECTED.shadowDarkness = e;});

[EDIT] And here's my SELECTED variable:

function onDocumentMouseDown(event){
    event.preventDefault();
    if($(event.target).is('canvas')){
        mouse.x = ( event.clientX / window.innerWidth ) * 2 - 1;
        mouse.y = - ( event.clientY / window.innerHeight ) * 2 + 1;
        raycaster.setFromCamera(mouse, camera);
        var intersects = raycaster.intersectObjects(objects);
        if(intersects.length > 0){
            SELECTED = intersects[ 0 ].object;

            control.attach(SELECTED);
            scene.add(control);
            $(guiObject.domElement).attr("hidden", false);
            // SELECTED.material.color.setHex( Math.random() * 0xffffff );
        } else{
            control.detach(SELECTED);
            scene.remove(control);
            control.update();
            $(guiObject.domElement).attr("hidden", true);
        }
    } else{
        $(guiObject.domElement).attr("hidden", false);
    }
}

How could it be done?


Solution

  • guiObject.addColor(selectedObjectAppearance, 'lightColor').name('Light Color').onChange(function (e) {
        scene.traverse( function( child ) {
            var object = helper.children[0];
    
            if ((SELECTED === helper) && (child instanceof THREE.SpotLight)) {
                object.color = new THREE.Color(e);
            }
            else if ((SELECTED === helper) && (child instanceof THREE.PointLight)) {
                object.color = new THREE.Color(e);
            }
            else if ((SELECTED === helper) && (child instanceof THREE.DirectionalLight)) {
                object.color = new THREE.Color(e);
            }
        } );
    });
    

    Did the trick.