首页 > 其他分享 >three.js 第九节 - 光线投射实现3d物体交互事件

three.js 第九节 - 光线投射实现3d物体交互事件

时间:2024-06-22 16:00:47浏览次数:21  
标签:intersects scence 第九节 THREE three sphere new js const

这个程序的效果是,创建3个球,位置分别在-4,0,4的位置,并且,点击哪个球,哪个球的颜色就变成红色


// @ts-nocheck
// 引入three.js
import * as THREE from 'three'
// 导入轨道控制器
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls'

//#region
const scence = new THREE.Scene()

const camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000)
camera.position.set(2, 2, 15) // 设置相机位置
camera.lookAt(0, 0, 0)

const renderer = new THREE.WebGLRenderer()
renderer.setSize(window.innerWidth, window.innerHeight)
document.body.appendChild(renderer.domElement)
//#endregion

// -----------------------------------------------------------------
// -----------------------------------------------------------------

	// 创建3个球
	const sphere_1 = new THREE.Mesh(
	  new THREE.SphereGeometry(1, 32, 32),
	  new THREE.MeshBasicMaterial({
	    color: 0x00ff00
	  })
	)
	sphere_1.position.x = -4
	scence.add(sphere_1)
	
	const sphere_2 = new THREE.Mesh(
	  new THREE.SphereGeometry(1, 32, 32),
	  new THREE.MeshBasicMaterial({
	    color: 0x0000ff
	  })
	)
	scence.add(sphere_2)
	
	const sphere_3 = new THREE.Mesh(
	  new THREE.SphereGeometry(1, 32, 32),
	  new THREE.MeshBasicMaterial({
	    color: 0xff00ff
	  })
	)
	sphere_3.position.x = 4
	scence.add(sphere_3)
	
	/*
	  创建射线
	  Raycaster:这个类用于进行raycasting(光线投射),光线投射用于进行鼠标拾取(在三维空间中计算出鼠标移过了什么物体)
	*/
	const raycaster = new THREE.Raycaster()
	// 创建鼠标向量
	const mouse = new THREE.Vector2()
	
	window.addEventListener('click', event => {
	  // console.log(event.clientX, event.clientY)
	
	  // 设置鼠标向量的x、y值【此公式适用于:相机、渲染器的大小均为1920 * 1080的情况下】
	  mouse.x = (event.clientX / window.innerWidth) * 2 - 1
	  mouse.y = -((event.clientY / window.innerHeight) * 2 - 1)
	  console.log(mouse.x, '----', mouse.y)
	
	  // 通过摄像机和鼠标位置更新射线
	  raycaster.setFromCamera(mouse, camera)
	
	  // 计算物体和射线的焦点
	  // const intersects = raycaster.intersectObjects(scence.children) // 会把场景scence里面所有的东西都加进去
	  const intersects = raycaster.intersectObjects([sphere_1, sphere_2, sphere_3]) // 只加场景scence里面的sphere_1、sphere_2、sphere_3这3个东西
	
	  if (intersects.length > 0) {
	    // 如果选中了
	    if (intersects[0].object._isSelect) {
	      intersects[0].object._isSelect = false // 清除选中状态
	      // 将它的颜色,设置为原来的颜色
	      intersects[0].object.material.color.set(intersects[0].object._originColor)
	      return
	    }
	
	    // 如果没选中,这个`_isSelect`是我自定义的
	    intersects[0].object._isSelect = true
	    // getHex():获取十六进制颜色字符串,这里记录它原来的颜色
	    intersects[0].object._originColor = intersects[0].object.material.color.getHex()
	    intersects[0].object.material.color.set(0xff0000) // 设置为红色
	  }
	
	  console.log('intersects=', intersects)
	})

// -----------------------------------------------------------------
// -----------------------------------------------------------------

//#region
// 添加世界坐标辅助器,红色-X轴; 绿色-Y轴; 蓝色-Z轴
const axesHelper = new THREE.AxesHelper(5)
scence.add(axesHelper)

const controls = new OrbitControls(camera, renderer.domElement)
// 设置带阻尼的惯性
// controls.enableDamping = true
// 设置阻尼系数
controls.dampingFactor = 0.05

// 每一帧根据控制器更新画面
function render() {
  // 如果,需要控制器带有阻尼效果,或者自动旋转等效果,就需要加入`controls.update()`
  controls.update()
  // `requestAnimationFrame`:在屏幕渲染下一帧画面时,触发回调函数来执行画面的渲染
  requestAnimationFrame(render)

  renderer.render(scence, camera)
}
render()
//#endregion



标签:intersects,scence,第九节,THREE,three,sphere,new,js,const
From: https://blog.csdn.net/pig_ning/article/details/139883671

相关文章

  • three.js+vue实现酷炫三维地图web3d大屏可视化GIS地图
    三维地图效果如下,gif压缩导致画质变差了,哈哈three.js+vue代码如下:<template><divid="chinaMap"><divid="threejs"></div><!--右侧按钮--><divclass="rightButton"><divv-for="(item,i......
  • js函数定义方式
    在JavaScript中,有多种方式来定义函数。下面是几种常见的函数定义方式的详细解析和示例代码:函数声明(FunctionDeclaration):函数声明是最常见且最简单的函数定义方式。它由关键字function、函数名、参数列表和函数体组成。函数声明可以在任何地方进行定义,并且会被提升到作用域的......
  • js组合继承
    JS组合继承(combinationinheritance)是一种常用的继承模式,它通过将原型链和构造函数组合使用来实现继承。下面是JS组合继承的详细解析和代码示例:创建父类(基类)的构造函数functionParent(name){this.name=name;this.colors=['red','green','blue'];}给父类添......
  • 前端网页开发学习(HTML+CSS+JS)有这一篇就够!
    目录HTML教程▐ 概述▐ 基础语法▐ 文本标签▐ 列表标签 ▐ 表格标签▐ 表单标签CSS教程▐概述▐基础语法▐选择器▐修饰文本▐修饰背景▐透明度▐伪类▐盒子模型▐ 浮动▐ 定位JavaScript教程▐概述▐ 基础语法▐函数▐事件▐......
  • 安装和使用nvm安装Nodejs
    文章目录安装和使用nvm1.安装nvm2.重新加载终端配置3.安装所需的Node.js版本4.使用安装的Node.js版本nvm常用命令安装和使用nvm以下是安装nvm并使用它来安装Node.js的步骤:1.安装nvm首先,您需要安装nvm。您可以使用curl或wget来完成安装:......
  • 基于SSM+JSP的校园闲置物品交易平台(带1w+字文档)
    基于SSM+JSP的校园闲置物品交易平台(带1w+字文档)该校园闲置物品交易平台在Windows平台下完成开发,采用java编程语言开发,将应用程序部署于Tomcat上,加之MySQL接口来实现交互式响应服务器上的数据,将最终效果呈现于服务器上。运用MySQL数据库,使用Navicatpremium连接数据库,从......
  • Json工具类
    publicstaticclassJsonHelper{///<summary>///将对象序列化为JSON格式///</summary>///<paramname="o">对象</param>///<returns>json字符串</returns>publicstaticstringSerializeObject(object......
  • Java爬虫入门(2) Jsoup使用
    Jsoup介绍:    一款Java对html的解析工具。Jsoup的基础使用:    导入Maven依赖:                <dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.11.3</version></dependency>......
  • 对JSONUtil.toBean()的理解
    在Java中,JSONUtil.toBean()​方法的作用是将JSON格式的数据转换为Java对象。这个方法通常属于一些JSON处理库(例如Hutool库中的JSONUtil),它提供了便捷的方式将JSON字符串中的数据映射到Java对象的相应属性上。这样可以使得开发者能够以面向对象的方式处理JSON数据,而无需手动解析JSO......
  • 063java jsp ssm企业员工培训管理系统员工培训计划培训记录管理(源码+数据库+文档)
    项目技术:Spring+SpringMVC+MyBatis等等组成,B/S模式管理等等。环境需要1.运行环境:最好是javajdk1.8,我们在这个平台上运行的。其他版本理论上也可以。2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA;3.tomcat环境:Tomcat7.x,8.x,9.x版本均可4.硬件环境:windows7/8/10......