如何收听onclick事件SpotLight Helper并将TransformControls附加到灯光?

时间:2016-09-29 03:10:23

标签: javascript three.js mouseevent

问题:

当我点击立方体时,TransformControls附加在立方体上。但当我点击光助手时,什么都没发生。当我点击光助手时,我希望将TransformControls附加在灯光上。你能帮我解决这个问题吗?

这是最小的例子。

http://codepen.io/kranzy/pen/ALOYZw

或者如果您需要代码:

var scene = new THREE.Scene(); 
var camera = new THREE.PerspectiveCamera( 75, window.innerWidth/window.innerHeight, 0.1, 1000 ); 
var renderer = new THREE.WebGLRenderer(); 
renderer.setSize( window.innerWidth, window.innerHeight ); 
document.body.appendChild( renderer.domElement ); 
var geometry = new THREE.BoxGeometry( 1, 1, 1 ); 
var material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } ); 
var transformControls = new THREE.TransformControls(camera,renderer.domElement); 
scene.add(transformControls); 
var objects = []; 
var cube = new THREE.Mesh( geometry, material ); 
cube.position.x = -10; 
scene.add( cube ); 
objects.push(cube); 
var light = new THREE.SpotLight(); 
scene.add(light); 
var help = new THREE.SpotLightHelper(light); 
scene.add(help); 
objects.push(help); 
camera.position.z = 5; 
var render = function () { 
    requestAnimationFrame( render ); 
    cube.rotation.x += 0.1; 
    cube.rotation.y += 0.1; 
    renderer.render(scene, camera); 
}; 
render(); 
window.addEventListener( 'resize', onWindowResize, false ); 
function onWindowResize(){ 
    camera.aspect = window.innerWidth / window.innerHeight; 
    camera.updateProjectionMatrix(); 
    renderer.setSize( window.innerWidth, window.innerHeight );
} 
document.addEventListener( 'mousedown', onDocumentMouseDown, false ); 
document.addEventListener( 'touchstart', onDocumentTouchStart, false ); 
function onDocumentTouchStart(event){ 
    event.preventDefault(); 
    event.clientX = event.touches[0].clientX; 
    event.clientY = event.touches[0].clientY; 
    onDocumentMouseDown(event); 
} 
function onDocumentMouseDown(event){ 
    event.preventDefault(); 
    mouse = new THREE.Vector2(); 
    mouse.x = ( event.clientX / window.innerWidth ) * 2 - 1; 
    mouse.y = - ( event.clientY / window.innerHeight ) * 2 + 1; 
    raycaster = new THREE.Raycaster(); 
    raycaster.setFromCamera(mouse, camera); 
    var intersects = raycaster.intersectObjects(objects); 
    if(intersects.length > 0){ 
        SELECTED = intersects[ 0 ].object; 
        console.log(SELECTED); 
        if (SELECTED.constructor === THREE.SpotLightHelper) { 
            transformControls.attach(SELECTED.light); 
        } else { 
            transformControls.attach(SELECTED); 
        } 
    }
}

1 个答案:

答案 0 :(得分:1)

问题是raycaster。 将raycaster.intersectObjects()的第二个参数添加到true。

所以最终的代码是 var intersects = raycaster.intersectObjects(objects, true);

以下是将transformControls附加到灯光的工作示例: http://codepen.io/anon/pen/PGJxBj

我希望这对你有帮助..