我正在尝试使用 raycaster 使对象变得可点击。我见过无数这样的例子,并且我多次尝试过这段代码但没有成功。我看到的示例与我遇到的其他示例之间的唯一区别是我位于一个球体内部。
我通过创建一些变量来开始我的代码(有些变量可能不是使用过去的示例留下的)。
var container, stats;
var camera, controls, scene, renderer, projector;
var isUserInteracting = false;
var mouse = { x: 0, y: 0, z: 0 }, intersected;
var fov = 70,
texture_placeholder,
isUserInteracting = false,
onMouseDownMouseX = 0, onMouseDownMouseY = 0,
lon = 0, onMouseDownLon = 0,
lat = 0, onMouseDownLat = 0,
phi = 0, theta = 0;
init();
animate();
我继续设置 init() 函数,在其中设置相机并创建球体。
function init() {
var container, mesh1;
container = document.getElementById( 'container' );
camera = new THREE.PerspectiveCamera( fov, window.innerWidth / window.innerHeight, 1, 1100 );
camera.target = new THREE.Vector3( 0, 0, 0 );
scene = new THREE.Scene();
projector = new THREE.Projector();
mesh1 = new THREE.Mesh( new THREE.SphereGeometry( 500, 60, 40 ), new THREE.MeshBasicMaterial( { map: THREE.ImageUtils.loadTexture( "spherical_map_small.jpg" )} ) );
mesh1.scale.x = -1;
mesh1.side = THREE.DoubleSide;
scene.add( mesh1 );
仍然在 init() 函数中,我创建了一个立方体几何图形(这是我想要可点击的)。
meshMaterial = new THREE.MeshBasicMaterial({ color: 0x33CC00});
var geometry = new THREE.CubeGeometry( 20, 20, 20 );
var object = new THREE.Mesh( geometry, new THREE.MeshBasicMaterial( { color: 0x33CC00} ) );
object.position.x = 75;
object.position.y = 10;
object.position.z = 0;
object.rotation.y = 45;
scene.add( object );
objects.push( object );
仍然在 init() 中,我设置了渲染器,并添加了一些事件监听器。
renderer = new THREE.WebGLRenderer();
renderer.setSize( window.innerWidth, window.innerHeight );
container.appendChild( renderer.domElement );
document.addEventListener( 'mousedown', onDocumentMouseDown, false );
document.addEventListener( 'mousemove', onDocumentMouseMove, false );
document.addEventListener( 'mouseup', onDocumentMouseUp, false );
document.addEventListener( 'mousewheel', onDocumentMouseWheel, false );
document.addEventListener( 'DOMMouseScroll', onDocumentMouseWheel, false);
//
window.addEventListener( 'resize', onWindowResize, false );
现在问题来了。接下来是使我的框“对象”可点击的功能,但这似乎不起作用。我相信我告诉它说“有效”。每次单击场景中的对象时。
我已经读了几个小时有关使用 Three.js 进行光线转换的内容,并且相信我对它应该如何工作有很好的理解,但我只是无法让它工作。
function onDocumentMouseUp( event ) {
isUserInteracting = false;
mouse.x = ( event.clientX / window.innerWidth ) * 2 - 1;
mouse.y = - ( event.clientY / window.innerHeight ) * 2 + 1;
var vector = new THREE.Vector3( mouse.x, mouse.y, .5 );
var raycaster = new THREE.Raycaster();
raycaster.setFromCamera(vector, camera);
var intersects = raycaster.intersectObjects(scene, true);
if ( intersects.length ) {
alert('works.');
}
}
如有任何帮助,我们将不胜感激。谢谢。
最佳答案
只是一个想法,尝试使用:
raycaster.intersectObjects(scene.children, true);
你设置了递归(true)吗?否则它不会检查后代
关于javascript - 等距柱状图三.js 内的可点击对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33661604/