javascript - 获取鼠标悬停在 Three.js 上的球体的 xyz

标签 javascript html three.js

我正在使用 Three.js 通过数组和 for 循环生成一堆球体。原始数组如下所示:

atoms = [
 ['Na', [0, 0, 0]],
 ['Na', [0.5, 0.5, 0]],
 ['Na', [0.5, 0, 0.5]],
 ['Na', [0, 0.5, 0.5]],
 ['Cl', [0.5, 0, 0]],
 ['Cl', [0, 0.5, 0]],
 ['Cl', [0, 0, 0.5]],
 ['Cl', [0.5, 0.5, 0.5]],
];

我解析数据,使 3 个数字代表 x、y、z 坐标。

最终产品由 Orbitcontrols.js 控制,如下所示:enter image description here

我想知道的是我将如何做到这一点:将鼠标悬停在球体上(同时按下某个键以免干扰轨道控制),然后单击鼠标返回我单击的球体的 xyz。

最佳答案

首先,您需要为 keydown、keyup 和 mousedown 事件添加一些事件监听器:

document.addEventListener('keydown', onKeyDown, false);
document.addEventListener('keyup', onKeyUp, false);
document.addEventListener('mousedown', onMouseDown, false);

您可以在场景或某个类中添加这些事件监听器。对于 keyup 和 keydown,您需要查找要使用的 keyCode。

对于点击事件,您需要使用 THREE.Raycaster。您可以使用这样的东西作为开始:

function onMouseDown(event) {
    event.preventDefault();

    var vector = new THREE.Vector3((event.clientX / window.innerWidth) * 2 - 1, -(event.clientY / window.innerHeight) * 2 + 1, 1, 10000);
    projector.unprojectVector(vector, camera);

    var raycaster = new THREE.Raycaster(camera.position, vector.sub(camera.position).normalize());

    for (var i=1; i<=16; i++) {
        var intersect = raycaster.intersectObject(spheres[i]);
        if (intersect.length > 0) {
            console.log(spheres[i].position);
            break;
        }
    }
}

如果您不使用全屏,则需要调整矢量。

希望这有帮助。

关于javascript - 获取鼠标悬停在 Three.js 上的球体的 xyz,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17435000/

相关文章:

javascript - 按下键时响应鼠标移动

javascript - Express.js :how to use different middlewares based on NODE_ENV?

javascript - 如何检查数组中除 0 javascript 之外的重复项

javascript - 带有复选框的 Woocommerce Ajax 过滤器

javascript - 添加最后一个 cvs 行作为 json 中的对象

javascript - 从输入字段获取值并打开新链接

HTML代码分析器

javascript - 如何在Three.js中添加PointerLockControl?

javascript - 模拟框架外观控件

jquery - 如何为导航栏添加事件类?