threejs-光线投射实现3d场景交互事件

一、介绍
1.属性
// 创建射线
const raycaster = new three.Raycaster()
// 创建鼠标向量(保存鼠标点击位置)
const mouse = new three.Vector2() 
// 创建点击事件
window.addEventListener('click',(event)=>{
  // 获取鼠标点击位置
  mouse.x = (event.clientX / window.innerWidth) * 2 - 1
  mouse.y = -(event.clientY / window.innerHeight) * 2 + 1
  // 创建射线并检测点击物体
  raycaster.setFromCamera(mouse, camera)
  // 计算物体和射线的焦点
  const intersects = raycaster.intersectObjects(scene.children) 
    //检测是否点击到物体 值scene.children或[sphere1,sphere2,sphere3]
    // intersects 中值 face:面信息  normal:象限向量  object:选中的物体
  }
})
二、展示
1.效果

注意:点击小球存在点击后颜色变化

2.代码
// 导入threejs文件
import * as three from 'three'
// 导入轨道控制器
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js'
// 创建场景
const scene = new three.Scene()
// 创建相机
const camera = new three.PerspectiveCamera(
  45, //视角 值越多视野越大
  window.innerWidth / window.innerHeight, //宽高比
  0.1, //近平面(相机最近能看到的物体)
  1000 //远平面(相机最远能看到的物体)
)
// 创建渲染器
const renderer = new three.WebGLRenderer()
renderer.setSize(window.innerWidth, window.innerHeight)
document.body.appendChild(renderer.domElement)
// 添加背景颜色
scene.background = new three.Color(0x999999)

// 创建三个球
const sphere1 = new three.Mesh(
  new three.SphereGeometry(0.5, 32, 32),
  new three.MeshBasicMaterial({ color: 0x4444ff })
)
sphere1.position.x = -3
const sphere2 = new three.Mesh(
  new three.SphereGeometry(0.5, 32, 32),
  new three.MeshBasicMaterial({ color: 0xffa0a4 })
) 
const sphere3 = new three.Mesh(
  new three.SphereGeometry(0.5, 32, 32),
  new three.MeshBasicMaterial({ color: 0xff4400 })
) 
sphere3.position.x = 3

// 加入场景
scene.add(sphere1)
scene.add(sphere2)
scene.add(sphere3)
console.log(scene);

// 创建射线
const raycaster = new three.Raycaster()
// 创建鼠标向量(保存鼠标点击位置)
const mouse = new three.Vector2()
// 创建点击事件
window.addEventListener('click',(event)=>{
  // 获取鼠标点击位置
  mouse.x = (event.clientX / window.innerWidth) * 2 - 1
  mouse.y = -(event.clientY / window.innerHeight) * 2 + 1
  // 创建射线并检测点击物体
  raycaster.setFromCamera(mouse, camera)
  // 计算物体和射线的焦点
  const intersects = raycaster.intersectObjects(scene.children) //检测是否点击到物体 值scene.children或[sphere1,sphere2,sphere3]
  if(intersects.length > 0){
    // intersects 中值 face:面信息  normal:象限向量  object:选中的物体
    if(intersects[0].object.material.isSelect){
      intersects[0].object.material.color.set(intersects[0].object.material.oldColor)
      intersects[0].object.material.isSelect = false
    }else{
      intersects[0].object.material.oldColor = intersects[0].object.material.color.getHex()  // 重置旧颜色
      intersects[0].object.material.isSelect = true  // 重置状态
      intersects[0].object.material.color.set(0xff0000)  // 重置颜色
    }
  }

})

// 相机位置
camera.position.z = 15 //设置在z轴位置
camera.position.x = 1 //设置在x轴位置
camera.position.y = 1 //设置在y轴位置
// 看向位置
camera.lookAt(0, 0, 0) //看向原点
// 创建轨道控制器
const controls = new OrbitControls(camera, renderer.domElement)
controls.enableDamping = true // 启用阻尼系数:值越大,阻尼越明显
controls.dampingFactor = 0.5 //设置阻尼值
controls.enableZoom = true // 启用缩放:值为false时禁止缩放
// controls.autoRotate = true // 启用自动旋转:值为true时禁止手动旋转
controls.autoRotateSpeed = 0.5 // 自动旋转速度
// 渲染函数
const animate = () => {
  controls.update()
  requestAnimationFrame(animate) //每一帧调用函数
  // 旋转
  // cube.rotation.x += 0.01 // X轴转
  // cube.rotation.y += 0.01 // Y轴转
  renderer.render(scene, camera) // 重新渲染
}
animate()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/892567.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HAL+M4学习记录_7

一、TIM 记录学习HAL配置TIM定时器 1.1 简介 TIM(timer)定时器,16位或32位(TIM2和TIM5)计数器、预分频器(16位)、自动重装寄存器的时基单元;可对输入时钟进行计数,在计数…

PyQt 入门教程(3)基础知识 | 3.1、使用QtDesigner创建.ui文件

文章目录 一、使用QtDesigner创建.ui文件1、创建.ui文件2、生成.py文件3、使用新生成的.py文件4、编辑新生成的.py文件 一、使用QtDesigner创建.ui文件 1、创建.ui文件 打开PyCharm,使用自定义外部工具QtDesigner创建mydialog.ui文件,如下: …

finalshell连接navicat数据库

一、安装mysql数据库 这个安装在另外一篇里 超详细的finalshell安装数据库以及数据库的基本操作-CSDN博客https://blog.csdn.net/cfjbcg/article/details/142990671 二、连接 说明root这个用户连接,是有权限的限制的----》修改权限 use mysql pdate user set hos…

测试教程分享

前几年在腾讯课堂上发布了不少课程,后来腾讯课堂改革,要收会员费,课程还要抽提程,这么下来就相当于白干了。就放弃了在上面发课程,再后来腾讯课堂就关闭了,以前发布的视频就没有地方发了,于是我…

Golang | Leetcode Golang题解之第485题最大连续1的个数

题目: 题解: func findMaxConsecutiveOnes(nums []int) (maxCnt int) {cnt : 0for _, v : range nums {if v 1 {cnt} else {maxCnt max(maxCnt, cnt)cnt 0}}maxCnt max(maxCnt, cnt)return }func max(a, b int) int {if a > b {return a}return …

QT--Qlabel学习、获取文本和设置文本、文本对齐方式、文本换行、显示图片

QLabel 是 Qt 中的标签类,通常用于显示提示性的文本,也可以显示图像 对齐方式 用于设置标签中的内容在水平和垂直两个方向上的对齐方式,比如左对齐、右对齐、上对齐、下对齐、水平居中、垂直居中等。 // 获取和设置文本的对齐方式 Qt::Ali…

第二代GPT-SoVITS V2:让声音克隆变得简单

随着人工智能技术的飞速发展,AI声音克隆已经成为一种趋势,广泛应用于各个领域。为了满足更多用户的需求,第二代GPT-SoVITS V2应运而生,它由RVC变声器创始人“花儿不哭”与AI音色转换技术Sovits开发者Rcell联合开发,是一…

有关 C#多表查询学习

导言 在后端多表查询这一块还是不太会,主要是在左连接和innerjoin这块,上课混的时间总是要还回来的...主要是举后端的几个案例来相应学习查询的知识。所用到的例子是自己搞的C#后端,数据库用的是若依的表,有些有些微改变。 多表查…

为什么SSH协议是安全的?

SSH的传输层协议(Transport Layer Protocol)和用户鉴权协议(Authentication Protocol)确保数据的传输安全,这里只介绍传输层协议,是SSH协议的基础。 本文针对SSH2协议。 1、客户端连接服务器 服务器默认…

相似扇形问题

甘肃临夏砖雕是一种历史悠久的古建筑装饰艺术,是第一批国家级非物质文化遗产,如图1是一块扇面形的临夏砖雕作品,它的部分设计图如图2,其中扇形OBC和扇形OAD有相同的圆心O,且圆心角O100度,若OA120cm, OB60cm &#xff0…

9.22前缀和

当我们计算n个数的和的时候,往往会采用循环操作,但是当我们要多次进行询问n个数之和时,如果采用多次循环,时间复杂度会升高,所以我们采用前缀和来解决多次询问时的求和 1.一维前缀和 提公因式,用分配律&am…

2024 kali系统2024版本,可视化界面汉化教程(需要命令行更改),英文版切换为中文版,基于Debian创建的kali虚拟机

我的界面如下所示 1. 安装 locales sudo apt install locales 2. 生成中文语言环境 sudo locale-gen zh_CN.UTF-8 如果你希望安装繁体中文,可以加入: sudo locale-gen zh_TW.UTF-8 3. 修改 /etc/default/locale 文件 确保有以下内容 LANGzh_CN.UT…

【优选算法】——双指针(下篇)!

🌈个人主页:秋风起,再归来~ 🔥系列专栏:C刷题算法总结 🔖克心守己,律己则安 目录 1、有效三角形的个数 2、查找总价值为目标值的两个商品 3、三数之和 4、四数之和 5、完结散花 1、有…

react18中实现简易增删改查useReducer搭配useContext的高级用法

useReducer和useContext前面有单独介绍过,上手不难,现在我们把这两个api结合起来使用,该怎么用?还是结合之前的简易增删改查的demo,熟悉vue的应该可以看出,useReducer类似于vuex,useContext类似…

智慧供排水管网在线监测为城市安全保驾护航

一、方案背景 随着城市化进程的不断推进,城市供排水管网作为城市基础设施的关键组成部分,其安全稳定的运行对于确保城市居民的日常生活、工业生产活动以及整个生态环境的健康具有至关重要的作用。近年来,由于各种原因,城市供排水管…

Springboot整合knife4j生成文档

前言 在开发过程中,接口文档是很重要的内容,用于前端对接口的联调,也用于给其他方使用。但是手写相对比较麻烦。 当然也有swagger之类的,但是界面没有那么友好。 官网: 整合步骤 整合依赖 需要根据版本进行&…

深入了解Spring重试组件spring-retry

在我们的项目中,为了提高程序的健壮性,很多时候都需要有重试机制进行兜底,最多就场景就比如调用远程的服务,调用中间件服务等,因为网络是不稳定的,所以在进行远程调用的时候偶尔会产生超时的异常&#xff0…

python之socket网络编程

华子目录 引言什么是socketsocket套接字类型TCP和UDP socket服务端核心组件1.创建socket对象2.绑定地址和端口3.监听连接4.接受连接5.接受client端消息client_sock.revc(1024)6.发送响应给client端6.1client_sock.send()6.2client_sock.sendall() 7.关闭client端连接8.关闭serv…

flutter 使用三方/自家字体

将字体放入assets/fonts下 在pubspec.yaml文件中flutter下添加如下代码: flutter:fonts:- family: MyCustomFontfonts:- asset: assets/fonts/MyCustomFont.ttf 在flutter Text widget中使用字体 import package:flutter/material.dart;void main() > runApp(…

PyQt 入门教程(3)基础知识 | 3.2、加载资源文件

文章目录 一、加载资源文件1、PyQt5加载资源文件2、PyQt6加载资源文件 一、加载资源文件 常见的资源文件有图像与图标,下面分别介绍下加载资源文件的常用方法 1、PyQt5加载资源文件 2、PyQt6加载资源文件 PyQt6版本暂时没有提供pyrcc工具,下面介绍下在不…