You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Autodesk Viewer实时光标追踪问题:网格偏移与异常移动

Autodesk Viewer实时光标追踪问题修复

问题1:光标与网格偏移修复

原代码用window.innerWidth/window.innerHeight计算鼠标坐标,未考虑Viewer容器的实际尺寸与偏移(比如容器未占满窗口、存在边距等),导致坐标转换出现偏差。

解决方式:通过viewer.container.getBoundingClientRect()获取容器真实边界,基于容器尺寸计算归一化鼠标坐标,确保坐标转换准确。

问题2:旋转模型时网格消失/移动方向错误修复

原代码通过-camera.position.z / vec.z计算距离,仅适用于特定相机视角;当模型旋转导致相机位置、投影矩阵变化时,该逻辑失效,会造成球体位置错误甚至移出视锥体。

解决方式:使用THREE.Raycaster结合平面相交检测,无论相机如何旋转,都能在指定平面(如XY基准面)上获取稳定的3D光标位置。


修改后的完整代码

const geom = new THREE.SphereGeometry(10, 10, 10);
const material = new THREE.MeshBasicMaterial({ color: 0xff0000 });
const sphereMesh = new THREE.Mesh(geom, material);
const customSceneIdentifier = 'custom-scene';

if (!viewer.overlays.hasScene(customSceneIdentifier)) {
    viewer.overlays.addScene(customSceneIdentifier);
}
viewer.overlays.addMesh(sphereMesh, customSceneIdentifier);

viewer.container.addEventListener('mousemove', function(event) {
    const camera = viewer.navigation.getCamera();
    const raycaster = new THREE.Raycaster();
    const mouse = new THREE.Vector2();

    // 获取Viewer容器边界,计算相对鼠标坐标
    const rect = viewer.container.getBoundingClientRect();
    mouse.x = ((event.clientX - rect.left) / rect.width) * 2 - 1;
    mouse.y = -((event.clientY - rect.top) / rect.height) * 2 + 1;

    // 从相机发射射线
    raycaster.setFromCamera(mouse, camera);

    // 定义追踪平面(示例为XY平面,z=0,可根据需求替换为模型基准面)
    const trackingPlane = new THREE.Plane(new THREE.Vector3(0, 0, 1), 0);
    const intersectionPoint = new THREE.Vector3();

    // 计算射线与平面交点并更新球体位置
    if (raycaster.ray.intersectPlane(trackingPlane, intersectionPoint)) {
        sphereMesh.position.copy(intersectionPoint);
        viewer.impl.invalidate(true, true, true);
    }
});

内容的提问来源于stack exchange,提问作者Aliyan Ishfaq

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 05:00:09