【threejsJavascript】实现事件注册派送

2024-04-01 11:44

本文主要是介绍【threejsJavascript】实现事件注册派送,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

实现类似dom操作中的事件注册

addEventListener,removeEventListener

目标class内

以事件管理器和点击事件为例

import { EventDispatcher, Raycaster, Vector2 } from "three";export class EventManage {mouse = new Vector2()raycaster = new Raycaster()domcamerascenelast = nulllistener = []/*** *  @param {HTMLElement} dom* @param {Camera} camera* @param {Scene} scene*/constructor(dom, camera, scene) {// super()this.dom = domthis.camera = camerathis.scene = sceneconst mouse = this.mouseconst raycaster = this.raycasterlet last = nulldom.addEventListener('mousemove', (e) => {mouse.x = e.offsetX / dom.offsetWidth * 2 - 1mouse.y = -e.offsetY * 2 / dom.offsetHeight + 1raycaster.setFromCamera(mouse, camera);const intersection = raycaster.intersectObjects(this.scene.children)if (intersection.length > 0) {// console.log(intersection[0]);let object = intersection[0].objectobject.dispatchEvent({type: 'mousemove',point: intersection[0].point})if (last && last.uuid == object.uuid) {} else {if (last)last.dispatchEvent({type: 'mouseout',point: intersection[0].point})object.dispatchEvent({type: 'mousein',point: intersection[0].point})}last = object}})dom.addEventListener('click', (e) => {raycaster.setFromCamera(mouse, camera);const intersection = raycaster.intersectObjects(this.scene.children)if (intersection.length > 0) {// console.log(intersection[0]);intersection[0].object.dispatchEvent({type: 'click',point: intersection[0].point})}let callbacks = this.listener.filter(item => item.name == 'click')if (callbacks.length > 0) {callbacks.forEach(({ callback }) => callback({object: intersection[0],}))}})}//注册与删除事件addEventListener = (name, callback) => {this.listener.push({ name, callback })}removeListener = (name_, callback_) => {// 寻找对应事件绑定,=== 确定callback_for (let i = 0; i < this.listener.length; i++) {let { name, callback } = this.listener[i]if (name === name_ && callback === callback_) {this.listener.splice(i, 1)}}}
}

代码内使用

在初始化threejs场景的 class内使用

 		this.eventManage = new EventManage($dom, this.camera, this.scene)this.eventManage.addEventListener('click', (info) => console.log(info))this.metrologyUnit = new MetrologyUnit(this)//测试用其他组件

测试组件

export default class MetrologyUnit {constructor({ eventManage }) {let handler = (info) => {console.log("in Metro", info)}eventManage.addEventListener('click',handler)setTimeout(() => {eventManage.removeListener('click',handler)}, 3000)}
}

效果展示

页面中点击触发

{object: undefined}
index.js:7 in Metro 
{object: undefined}
index.js:45 
{object: {…}}
index.js:7 in Metro 
{object: {…}}
index.js:45 
{object: {…}}
index.js:7 in Metro 
{object: {…}}
index.js:45 //三秒后  (3000ms){object: {…}}
index.js:45 
{object: {…}}
index.js:45 
{object: {…}}
index.js:45 
{object: undefined}


在这里插入图片描述

这篇关于【threejsJavascript】实现事件注册派送的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/867070

相关文章

Redis实现RBAC权限管理

《Redis实现RBAC权限管理》本文主要介绍了Redis实现RBAC权限管理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1. 什么是 RBAC?2. 为什么使用 Redis 实现 RBAC?3. 设计 RBAC 数据结构

SpringBoot自定义注解如何解决公共字段填充问题

《SpringBoot自定义注解如何解决公共字段填充问题》本文介绍了在系统开发中,如何使用AOP切面编程实现公共字段自动填充的功能,从而简化代码,通过自定义注解和切面类,可以统一处理创建时间和修改时间... 目录1.1 问题分析1.2 实现思路1.3 代码开发1.3.1 步骤一1.3.2 步骤二1.3.3

SpringBoot基于沙箱环境实现支付宝支付教程

《SpringBoot基于沙箱环境实现支付宝支付教程》本文介绍了如何使用支付宝沙箱环境进行开发测试,包括沙箱环境的介绍、准备步骤、在SpringBoot项目中结合支付宝沙箱进行支付接口的实现与测试... 目录一、支付宝沙箱环境介绍二、沙箱环境准备2.1 注册入驻支付宝开放平台2.2 配置沙箱环境2.3 沙箱

Nginx实现高并发的项目实践

《Nginx实现高并发的项目实践》本文主要介绍了Nginx实现高并发的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录使用最新稳定版本的Nginx合理配置工作进程(workers)配置工作进程连接数(worker_co

python中列表list切分的实现

《python中列表list切分的实现》列表是Python中最常用的数据结构之一,经常需要对列表进行切分操作,本文主要介绍了python中列表list切分的实现,文中通过示例代码介绍的非常详细,对大家... 目录一、列表切片的基本用法1.1 基本切片操作1.2 切片的负索引1.3 切片的省略二、列表切分的高

基于Python实现一个PDF特殊字体提取工具

《基于Python实现一个PDF特殊字体提取工具》在PDF文档处理场景中,我们常常需要针对特定格式的文本内容进行提取分析,本文介绍的PDF特殊字体提取器是一款基于Python开发的桌面应用程序感兴趣的... 目录一、应用背景与功能概述二、技术架构与核心组件2.1 技术选型2.2 系统架构三、核心功能实现解析

使用Java发送邮件到QQ邮箱的完整指南

《使用Java发送邮件到QQ邮箱的完整指南》在现代软件开发中,邮件发送功能是一个常见的需求,无论是用户注册验证、密码重置,还是系统通知,邮件都是一种重要的通信方式,本文将详细介绍如何使用Java编写程... 目录引言1. 准备工作1.1 获取QQ邮箱的SMTP授权码1.2 添加JavaMail依赖2. 实现

Java嵌套for循环优化方案分享

《Java嵌套for循环优化方案分享》介绍了Java中嵌套for循环的优化方法,包括减少循环次数、合并循环、使用更高效的数据结构、并行处理、预处理和缓存、算法优化、尽量减少对象创建以及本地变量优化,通... 目录Java 嵌套 for 循环优化方案1. 减少循环次数2. 合并循环3. 使用更高效的数据结构4

使用Python实现表格字段智能去重

《使用Python实现表格字段智能去重》在数据分析和处理过程中,数据清洗是一个至关重要的步骤,其中字段去重是一个常见且关键的任务,下面我们看看如何使用Python进行表格字段智能去重吧... 目录一、引言二、数据重复问题的常见场景与影响三、python在数据清洗中的优势四、基于Python的表格字段智能去重

java两个List的交集,并集方式

《java两个List的交集,并集方式》文章主要介绍了Java中两个List的交集和并集的处理方法,推荐使用Apache的CollectionUtils工具类,因为它简单且不会改变原有集合,同时,文章... 目录Java两个List的交集,并集方法一方法二方法三总结java两个List的交集,并集方法一