threejs 点击模型拾取,页面有偏移导致拾取不准

  • 方式一:适合页面无偏移的情况
let mouse = new THREE.Vector2(
    (event.clientX / this.dom.offsetWidth) * 2 - 1,
    -(event.clientY / this.dom.offsetHeight) * 2 + 1
);
let raycaster = new THREE.Raycaster();
raycaster.setFromCamera(mouse, this.camera);
let intersects = raycaster.intersectObject(object.model, true);
  • 方式二:页面有偏移
let mouse = new THREE.Vector2(
    ((event.clientX - this.dom.getBoundingClientRect().left) / this.dom.offsetWidth) * 2 - 1,
    -((event.clientY - this.dom.getBoundingClientRect().top) / this.dom.offsetHeight) * 2 + 1
);
 
let standardVector = new THREE.Vector3(mouse.x, mouse.y, 1);// 标准设备坐标
let worldVector = standardVector.unproject(this.camera); // 标准设备坐标转世界坐标
let ray = worldVector.sub(this.camera.position).normalize();// 射线投射方向单位向量(worldVector坐标减相机位置坐标)
let raycaster = new THREE.Raycaster(this.camera.position, ray);
let intersects = raycaster.intersectObject(object.model, true);
  • 方式三:页面有偏移
let mouse = new THREE.Vector2(
    ((event.clientX - this.dom.getBoundingClientRect().left) / this.dom.offsetWidth) * 2 - 1,
    -((event.clientY - this.dom.getBoundingClientRect().top) / this.dom.offsetHeight) * 2 + 1
);
 
let raycaster = new THREE.Raycaster();
raycaster.setFromCamera(mouse, this.camera);
let intersects = raycaster.intersectObject(object.model, true);

.clientX .clientY是以设备左上角为坐标原点,单位px。 .offsetX .offsetY是以canvas画布左上角为坐标原点,单位px

THE END
posted @   ZerlinM  阅读(173)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示