当前位置:   article > 正文

threejs基础案例之十:模拟点击事件_three.js点击事件

three.js点击事件

注意点击时控制台的打印

threejs最后渲染的时候是以canvas形式进行渲染的。所以在界面中如何实现点击事件实际上成了如何在canvas中如何进行点击事件。但其实这只是其一。threejs是3d空间,鼠标在点击的时候,是去的是x和y二位数据,而在3d世界中,如何得到鼠标的坐标呢?这里引入了一个标准设备坐标。

它是一个相对值,其值在-1和1之间。用来记录我们鼠标在设备上移动的相对位置,既然是相对位置,那它相对于谁呢?

没错。设备坐标和web中的canvas定位的基点不一样。在web中,canvas画布的位置的基点是左上角(0,0),而对于设备坐标而言它的基点在canvas的画布中心。这样鼠标的移动,我们可以通过web中鼠标的位置得到其相对于设备坐标的移动位置。也就是sx,sy最后得到的结果。当然想要得到鼠标点在3d世界中的坐标。我们还需要做一个操作,把设备坐标转化成3D世界坐标,这需要我们通过这个project方法来实现真正的转换worldVector.project(camara)

有了坐标就可以了吗?还不行。

好在threejs给我们提供了一个方案。new THREE.Raycaster(),光线投射Raycaster,这个类用于进行raycasting(光线投射)。 光线投射用于进行鼠标拾取(在三维空间中计算出鼠标移过了什么物体),通过这个类的intersectObjects方法。能获取到场景中所有与该射线相交的物体。依此就能判断是否点击

  1. <template>
  2. <div>
  3. </div>
  4. </template>
  5. <script setup>
  6. import { ref ,reactive, nextTick,onMounted} from 'vue'
  7. import * as THREE from "three"
  8. import {OrbitControls} from "three/examples/jsm/controls/OrbitControls"
  9. const scene=new THREE.Scene()
  10. //相机
  11. const camara=new THREE.PerspectiveCamera(75,window.innerWidth/window.innerHeight,0.1,1000)
  12. camara.position.set(0,0,10)
  13. //几何体
  14. const cube=new THREE.Mesh(
  15. new THREE.BoxGeometry(2,2,2),
  16. new THREE.MeshBasicMaterial({color:"#f90"})
  17. )
  18. scene.add(cube)
  19. //渲染器
  20. const renderder=new THREE.WebGLRenderer({
  21. antialias:true
  22. })
  23. renderder.setSize(window.innerWidth,window.innerHeight)
  24. renderder.setClearColor("#ccc")
  25. document.body.appendChild(renderder.domElement)
  26. //控制器
  27. const control=new OrbitControls(camara,renderder.domElement)
  28. //渲染函数
  29. const render=()=>{
  30. renderder.render(scene,camara)
  31. requestAnimationFrame(render)
  32. }
  33. render()
  34. const mouse=new THREE.Vector2()
  35. let rayCaster=new THREE.Raycaster()
  36. const handlerClick=(e)=>{
  37. mouse.x=(e.clientX/window.innerWidth)*2-1 //通过web中鼠标坐标得到标准屏幕坐标
  38. mouse.y=-(e.clientY/window.innerHeight)*2+1
  39. rayCaster.setFromCamera(mouse,camara) 通过摄像机和鼠标位置更新射线
  40. let intersects=rayCaster.intersectObjects(scene.children) //获取场景中所有与射线相交的物体,结果是一个数组
  41. console.log("intersects:",intersects)
  42. if(intersects.length>0){ //length>0则说明有与射线相交的问题。表明点击了
  43. console.log(intersects[0])
  44. }
  45. }
  46. window.addEventListener("click",handlerClick)
  47. </script>
  48. <style scoped>
  49. .view-box{
  50. width: 100%;
  51. height: 100%;
  52. overflow: hidden;
  53. }
  54. .container{
  55. position: absolute;
  56. width: 240px;
  57. height: 240px;
  58. background: rgba(0,0,0,0.6);
  59. color:#ccc
  60. }
  61. </style>

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/95868
推荐阅读
相关标签
  

闽ICP备14008679号