javascript - 三个 js 通过 GUI 防止光线转换拾取

标签 javascript jquery three.js dat.gui

我需要通过单击来选择对象,然后弹出一个非模态对话框来显示有关该对象的信息。它可以正常工作,但是如果用户单击任何 GUI 项目,包括对话框,并且后面有一个对象,将选择三个 js 对象,从而更改弹出窗口中的信息。

这是片段。

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

jQuery 对话框生成器:

function createDialog(title, text, top) {
      return $("<div class='dialog' title='" + title + "'><p id='bodyText'> " + text + "</p></div>")
      .dialog({ position: { my: ("right" + 0 + "top+" + top), at: "right top" },
      close : setDialogNull, });
}

onMouseDown 函数:

function onDocumentMouseDown( e ) {
    e.preventDefault();
    console.log(dialog);
    var mouseVector = new THREE.Vector3();
    mouseVector.x = 2 * (e.clientX / window.innerWidth ) - 1;
    mouseVector.y = 1 - 2 * ( e.clientY / window.innerHeight );
    var raycaster = new THREE.Raycaster();
    raycaster.setFromCamera( mouseVector, camera );
    var intersects = raycaster.intersectObjects(objectCollection );

    if (intersects.length > 0) {
        var selectedObject = intersects[0];
        console.log("Intersected object", intersects[0]);
        selectedObject.object.material = (selectedObject.object.material.wireframe) ? selectedBoxMaterial : unselectedBoxMaterial;

        var text = intersects[0].distance;
        var title = "Shelf info";

        if (dialog == false) {
            createDialog(title, text, offset);
            offset = offset - 50;
            console.log(offset);
            dialog = true;

            console.log(dialog);
        }   

        if (dialog == true) { 
            {jQuery("#bodyText").text(text);
        }
    }   
}

其他 GUI 元素使用 dat.GUI 创建。

当搜索这个问题时,大多数结果都是关于 Unity 的,作为一名经验丰富的开发人员,我真的不知道如何适应它们。

最佳答案

如果没有更多代码来理解您的设置和事件,就很难知道解决方案是什么。我会给保存 three.js 的元素一个特定的 ID,并在 onDocumentMouseDown 中检查它是否是事件元素。您可能需要检查 document.activeElement.parentElement.id 或其他内容,具体取决于您的设置。

function onDocumentMouseDown( e ) {
    if(document.activeElement.id != "myThreeJSElementID"){
        //some other element has been clicked so let's return with nothing:
        return;
    }
    e.preventDefault();
    console.log(dialog);
    var mouseVector = new THREE.Vector3();
    mouseVector.x = 2 * (e.clientX / window.innerWidth ) - 1;
    mouseVector.y = 1 - 2 * ( e.clientY / window.innerHeight );
    var raycaster = new THREE.Raycaster();
    raycaster.setFromCamera( mouseVector, camera );
    var intersects = raycaster.intersectObjects(objectCollection );

    if (intersects.length > 0) {
        var selectedObject = intersects[0];
        console.log("Intersected object", intersects[0]);
        selectedObject.object.material = (selectedObject.object.material.wireframe) ? selectedBoxMaterial : unselectedBoxMaterial;

        var text = intersects[0].distance;
        var title = "Shelf info";

        if (dialog == false) {
            createDialog(title, text, offset);
            offset = offset - 50;
            console.log(offset);
            dialog = true;

            console.log(dialog);
        }   

        if (dialog == true) { 
            {jQuery("#bodyText").text(text);
        }
    }   
}

更理想的情况是,您应该为您的 three.js 容器设置一个特定的事件,而不是使用全局文档事件,但现在应该可以使用异常。许多代码示例出于简单性而非最佳实践而使用 document.addEventListener。

关于javascript - 三个 js 通过 GUI 防止光线转换拾取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38247078/

相关文章:

javascript - THREE.js:仅更改立方体贴图中一张脸的图像?

Javascript 日期格式 正则表达式 理解语法

javascript - 无法读取 null 的属性 'parentNode'。我在控制台中遇到错误

javascript - 在 jQuery + Datatables 中设置 `processData: false` 会将未知内容附加到我的 Ajax 调用的 URL

jquery - 使用 Cherrypy 和 jQuery/AJAX 从 Python 获取数据

webgl - 用于 3D Web 开发的three.js vs libgdx

javascript - 创建跟随光源的日/夜着色器

javascript - 修复放大和缩小编码

javascript - 如何解决 Promise pending 的问题

javascript - 我怎样才能让一条消息位于 html 之上?