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
相关产品推荐
相关产品推荐

