• threeJS 全屏或非全屏状态下鼠标点击获取屏幕位置


    使用threeJS引入模型进行点击事件,其实有一个是将获取到坐标位置进行webgl坐标系的转换

    全屏状态:

    全屏状态下直接利用window.innerWidth和 window.innerHeight进行计算即可,代码如下

    1. // 校验控制器旋转的时候不触发点击事件
    2. boxClickEvent() {
    3. const self = this;
    4. let x, y;
    5. //获取鼠标按下的位置
    6. this.renderer.domElement.addEventListener('mousedown', function (event) {
    7. x = event.pageX;
    8. y = event.pageY;
    9. });
    10. // 鼠标释放
    11. this.renderer.domElement.addEventListener('mouseup', function (event) {
    12. const newX = event.pageX;
    13. const newY = event.pageY;
    14. if (x == newX && y == newY) {
    15. // 位置相同的操作
    16. self.onDocumentMouseDown(event);
    17. }
    18. });
    19. },
    20. //获取点击的事件
    21. onDocumentMouseDown(event) {
    22. const raycaster = new THREE.Raycaster();
    23. const mouse = new THREE.Vector2();
    24. //转换为webgl坐标系下的鼠标位置
    25. mouse.x = (event.clientX / window.innerWidth) * 2 - 1; // 全屏状态
    26. mouse.y = -(event.clientY / window.innerHeight) * 2 + 1; // 全屏状态
    27. if (event.detail !== 2) { // 判断点击次数
    28. console.log('单击',event);
    29. } else {
    30. console.log('双击击',event);
    31. }
    32. },

    非全屏状态: 

    非全屏状态,使用实际的canvas的getBoundingClientRect(),获取canvas的相关信息

    打印下canvas.getBoundingClientRect()👇

    可以看出包含canvas画布的尺寸和相对屏幕上下左右的距离等信息,可以直接进行计算了

    关于renderer,我是这样声明的

    const self = this;
    // 创建渲染器对象
    self.renderer = new THREE.WebGLRenderer({ antialias: true });
    // 渲染区域尺寸
    self.renderer.setSize(self.$refs.threeBox.clientWidth, self.$refs.threeBox.clientHeight);
    // 页面中插入canvas对象
    self.$refs.threeBox.appendCh

    可以把 this.renderer.domElement 直接替换成自己实际声明的canvas

    1. onDocumentMouseDown(event) {
    2. const raycaster = new THREE.Raycaster();
    3. const mouse = new THREE.Vector2();
    4. // 转换为webgl坐标系下的鼠标位置
    5. mouse.x = ((event.clientX - this.renderer.domElement.getBoundingClientRect().left) / this.renderer.domElement.clientWidth) * 2 - 1;
    6. mouse.y = -((event.clientY - this.renderer.domElement.getBoundingClientRect().top) / this.renderer.domElement.clientHeight) * 2 + 1;
    7. // 从相机发射一条经过鼠标点击位置的射线
    8. raycaster.setFromCamera(mouse, this.camera);
    9. // 计算射线和模型的交点
    10. const intersects = raycaster.intersectObjects(this.scene.children, true);
    11. // ...
    12. }
  • 相关阅读:
    第十四届蓝桥杯 子串简写 | 树状数组解法
    如何设置cpolar开机自启动(Linux版)
    js异步与同步
    Docker和Docker compose的安装使用指南
    文件操作的方式
    CV计算机视觉每日开源代码Paper with code速览-2023.11.6
    Java 原生编译的 Solon 回忆录
    【Svelte】-(5)DOM事件 / 事件修饰符 / 组件事件 / 事件转发 (组件之间的事件沟通)
    机器学习-k-近邻算法
    产品研发团队协作神器!10款提效工具大盘点!
  • 原文地址:https://blog.csdn.net/jinse29/article/details/136232458