当前位置: 首页 > news >正文

Three.js投射光线实现三维物体交互

在这里插入图片描述

<template><div id="webgl"></div>
</template><script setup>
import * as THREE from 'three'
//导入轨道控制器
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls'
// 导入 dat.gui
import { GUI } from 'three/addons/libs/lil-gui.module.min.js';// 目标:点光源const gui = new GUI();
//1.创建场景
const scene = new THREE.Scene()//2.创建相机 角度  宽高比  近端  远端
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 30)
// 设置相机位置  x y z 
camera.position.set(0, 0, 10)
// 把相机添加到场景中
scene.add(camera)const cubeGeometry = new THREE.BoxGeometry(1, 1, 1)
const meterial = new THREE.MeshBasicMaterial({wireframe: true // 线框
})
const redMaterial = new THREE.MeshBasicMaterial({color: '#ff0000'
})let cubeArr = []
// 1000个立方体
for (let i = -5; i < 5; i++) {for (let j = -5; j < 5; j++) {for (let z = -5; z < 5; z++) {const cube = new THREE.Mesh(cubeGeometry, meterial)cube.position.set(i, j, z)scene.add(cube)cubeArr.push(cube)}}
}// 创建投射光线对象
const raycaster = new THREE.Raycaster()// 鼠标的位置对象
const mouse = new THREE.Vector2()// 监听鼠标的位置
window.addEventListener('click', (event) => {mouse.x = (event.clientX / window.innerWidth) * 2 - 1mouse.y = -((event.clientY / window.innerHeight) * 2 - 1)raycaster.setFromCamera(mouse, camera) // 鼠标的二维坐标,相机坐标let result = raycaster.intersectObjects(cubeArr)// 检测物体// console.log(result);result.forEach(item=>{item.object.material = redMaterial})
})// 初始化渲染器
const renderer = new THREE.WebGLRenderer()
// 设置渲染的尺寸大小
renderer.setSize(window.innerWidth, window.innerHeight)// 将webgel渲染的canvas内容添加到body
document.body.appendChild(renderer.domElement)// 创建轨道控制器
const controls = new OrbitControls(camera, renderer.domElement)
// 设置控制器的阻尼 更真实 惯性
controls.enableDamping = true// 添加坐标轴辅助器
const axesHelper = new THREE.AxesHelper(5)
scene.add(axesHelper)// 设置时钟
const clock = new THREE.Clock()function render() {controls.update()// 使用渲染器,通过相机将场景渲染进来renderer.render(scene, camera);// 渲染下一帧的时候 调用 render函数requestAnimationFrame(render)
}
render()// 监听画面变化,更新渲染画面
window.addEventListener("resize", () => {// 更新摄像头camera.aspect = window.innerWidth / window.innerHeight// 更新摄像机的投影矩阵camera.updateProjectionMatrix()// 更新渲染器renderer.setSize(window.innerWidth, window.innerHeight)// 设置渲染器的像素比renderer.setPixelRatio(window.devicePixelRatio)
})</script>

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 抖音本地生活城市服务商骗局后,第三方本地生活系统源码部署持续火爆!
  • Pyqt5新手教程
  • 【b站-湖科大教书匠】6 应用层 - 计算机网络微课堂
  • NSSRound#4 Team
  • C++初阶学习第三弹——类与对象(上)
  • vue的nextTick的作用
  • leetcode-136. 只出现一次的数字
  • C#中的异步编程:如何有效地使用async和await关键字以提高应用程序的性能和响应性
  • 【linux】在多核CPU下,好像看到不同进程在不同CPU调度
  • vue js 将对象转换为 JSON 字符串 ;将 JSON 字符串转换为对象
  • 人工智能与机器学习原理精解【9】
  • SQL进阶技巧:车辆班次问题分析
  • Typescript配置文件(tsconfig.json)详解系列四:esModuleInterop和allowSyntheticDefaultImports
  • Redis7-入门-安装
  • C#使用csvhelper实现csv的操作
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • 10个最佳ES6特性 ES7与ES8的特性
  • chrome扩展demo1-小时钟
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • Javascripit类型转换比较那点事儿,双等号(==)
  • javascript数组去重/查找/插入/删除
  • Java深入 - 深入理解Java集合
  • ng6--错误信息小结(持续更新)
  • php中curl和soap方式请求服务超时问题
  • python docx文档转html页面
  • Selenium实战教程系列(二)---元素定位
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 解决iview多表头动态更改列元素发生的错误
  • 入门级的git使用指北
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 硬币翻转问题,区间操作
  • 主流的CSS水平和垂直居中技术大全
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • #Linux(帮助手册)
  • (1/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)
  • (145)光线追踪距离场柔和阴影
  • (备份) esp32 GPIO
  • (不用互三)AI绘画工具应该如何选择
  • (六)vue-router+UI组件库
  • (五)IO流之ByteArrayInput/OutputStream
  • (原创)可支持最大高度的NestedScrollView
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • .a文件和.so文件
  • .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
  • .NET I/O 学习笔记:对文件和目录进行解压缩操作
  • .net 微服务 服务保护 自动重试 Polly
  • .Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化
  • .NetCore发布到IIS
  • .NET版Word处理控件Aspose.words功能演示:在ASP.NET MVC中创建MS Word编辑器
  • .NET关于 跳过SSL中遇到的问题
  • @ConditionalOnProperty注解使用说明
  • @modelattribute注解用postman测试怎么传参_接口测试之问题挖掘
  • [Algorithm][动态规划][路径问题][不同路径][不同路径Ⅱ][珠宝的最高价值]详细讲解