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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!