1

我正在尝试使用 FirstPersonControls.js 为移动编写一个 3d 环境,并为 mouseclick 侦听器编写以下内容:

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(adblocks);

    if (intersects.length > 0) {

        intersects[0].object.material.color.setHex(Math.random() * 0xffffff);


    }
}

在 init() 中:

document.addEventListener('mousedown', onDocumentMouseDown, false);

我已经在另一个文档上完成了此操作,并且效果很好,但是,这次我尝试包含 FirstPersonControls.js。

在 FirstPersonControls.js 中,我通过注释掉侦听器禁用了 mousedown 和 mouseup 侦听器,如下所示:

//this.domElement.addEventListener( 'mousedown', bind( this, this.onMouseDown ), false );
//this.domElement.addEventListener( 'mouseup', bind( this, this.onMouseUp ), false );

那工作得很好。FirstPersonControls.js 本身可以正常工作。但是,当我为 MouseDown 事件添加额外的侦听器时,键输入(w、a、s、d、q、r 和 f)停止响应。如果我在页面加载时立即按住一个键,该键将一直工作,直到我停止,然后一切都停止响应。另外,我不明白的另一件事,这可能是相关的,这就是我提到它的原因,如果我在 FirstPersonControls.js 中注释掉这一行:

this.domElement.addEventListener( 'mousemove', bind( this, this.onMouseMove ), false );

什么都没有改变。一切都保持完全相同,这对我来说没有意义,因为我认为那是 mousemovement 事件绑定到文档的地方。

4

1 回答 1

0

FirstPersonControl.js 脚本为 mousedown 事件添加了一个监听器函数。你的代码也是如此。当 mousedown 事件发生时,最后一个事件处理程序首先被调用,通常,其他事件处理程序应该在之后被调用。然而,这:

event.preventDefault();

防止事件冒泡到其他事件处理程序。我相信删除这条线应该足以解决您所描述的问题。

于 2013-09-15T19:13:09.090 回答