【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

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

禁止平板,iPad长按弹出默认菜单事件

通过监控按下抬起时间差来禁止弹出事件,把以下代码写在要禁止的页面的页面加载事件里面即可     var date;document.addEventListener('touchstart', event => {date = new Date().getTime();});document.addEventListener('touchend', event => {if (new