出于某种原因,在下面的代码中,当我单击对象时,“ intersects”变量在onDocumentMouseDown事件处理程序中不包含任何项目。为了使其能够检测到单击的对象,我必须单击并稍微拖动鼠标,然后鼠标才能拾取单击的项目。如果这很重要,我也正在使用trackballcontrols。我在这里有一个jsfiddle示例:http : //jsfiddle.net/marktreece/xvQ3f/
在jsfiddle示例中,单击多维数据集,然后注意到颜色没有按预期变化。现在单击多维数据集,然后释放鼠标按钮,将其稍微移动,然后颜色会发生变化。我怎样才能做到,只需单击对象就足够了?
这是我的mousedown事件处理程序:
function onDocumentMouseDown( event ) {
event.preventDefault();
var vector = new THREE.Vector3( ( event.clientX / window.innerWidth ) * 2 - 1, - ( event.clientY / window.innerHeight ) * 2 + 1, 0.5 );
projector.unprojectVector( vector, camera );
var raycaster = new THREE.Raycaster( camera.position, vector.sub( camera.position ).normalize() );
var intersects = raycaster.intersectObjects( scene.children, true );
if ( intersects.length > 0 ) {
intersects[ 0 ].object.material.color.setHex( Math.random() * 0xffffff );
}
}
从我可以看到的角度来看,在您的示例中,光线投射效果很好,并且相交变量不为空。问题在于,当您使用TrackballControls时,仅在相机更改其位置时才执行渲染。这就是为什么只需拖动鼠标即可更改框的颜色的原因。
下面,我在一个新的渲染函数调用中包含了您的动画函数。这样就解决了问题。但是,请注意,这不是最有效的解决方案,因为渲染是每帧执行一次。
function animate() {
try{
requestAnimationFrame( animate );
controls.update();
render();
}
catch(err){
alert("animate error. " + err.message);
}
}
希望这可以帮助!
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句