语言: English | 中文简体
threejs
mouse event listener.
事件穿透:基于单一事件,跳过障碍物,直接触发目标物体的事件。
只有 未注册或失活 对应事件的物体,才允许被跳过。
-
轻量易用
-
基于物体的事件
-
全局事件拦截器
-
支持事件穿透
-
支持
typescript
npm i @dreamoment/falcon
import * as THREE from 'three'
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js'
import Falcon, { EventType } from '@dreamoment/falcon'
const scene = new THREE.Scene()
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000 )
const ambientLight = new THREE.AmbientLight(0xffffff)
const directionalLight = new THREE.DirectionalLight(0xffffff)
directionalLight.position.set(1, 1, 1)
scene.add(ambientLight, directionalLight)
const renderer = new THREE.WebGLRenderer()
renderer.setSize(window.innerWidth, window.innerHeight)
document.body.appendChild(renderer.domElement)
const controls = new OrbitControls(camera, renderer.domElement)
camera.position.set(0, 3, 3)
const geometry = new THREE.BoxGeometry(1, 1, 1)
const material1 = new THREE.MeshStandardMaterial({ color: 0xffffff })
const material2 = new THREE.MeshStandardMaterial({ color: 0xffffff })
const cube1 = new THREE.Mesh(geometry, material1)
const cube2= new THREE.Mesh(geometry, material2)
cube2.position.x += 2
scene.add(cube1, cube2)
const falcon = new Falcon(camera, renderer.domElement)
falcon.intercept(EventType.click, payload => {
// don't send messages to cube2
// if (payload.object3D === cube2) {
// payload.abortController.abort()
// }
})
falcon.intercept(EventType.mouseenter, payload => {
renderer.domElement.style.cursor = 'pointer'
})
falcon.intercept(EventType.mouseleave, payload => {
renderer.domElement.style.cursor = 'auto'
})
falcon.add(cube1)
falcon.add(cube2)
// or
// falcon.add([cube1, cube2])
cube1
.on(EventType.mouseenter, event => {
cube1.material.color = new THREE.Color(0x00ff00)
})
.on(EventType.mouseleave, event => {
cube1.material.color = new THREE.Color(0xffffff)
})
cube2
.on(EventType.click, event => {
cube1.material.color = new THREE.Color(0x0000ff)
})
.on(EventType.mouseenter, () => {
cube2.material.color = new THREE.Color(0xff0000)
})
.on(EventType.mouseleave, () => {
cube2.material.color = new THREE.Color(0xffffff)
})
const animate = () => {
controls.update()
falcon.update()
renderer.render(scene, camera)
}
const onWindowResize = () => {
camera.aspect = window.innerWidth / window.innerHeight
camera.updateProjectionMatrix()
renderer.setSize(window.innerWidth, window.innerHeight)
}
window.addEventListener('resize', onWindowResize)
renderer.setAnimationLoop(animate)
enum EventType {
click = 'click',
dblclick = 'dblclick',
contextmenu = 'contextmenu',
wheel = 'wheel',
mousemove = 'mousemove',
mousedown = 'mousedown',
mouseup = 'mouseup',
mouseenter = 'mouseenter',
mouseleave = 'mouseleave',
touchstart = 'touchstart',
touchmove = 'touchmove',
touchend = 'touchend',
touchcancel = 'touchcancel',
}
mew Falcon(camera: THREE.Camera, dom: HTMLElement)
更新射线触碰的物体集合。应该始终在渲染循环中被使用。
update(): void
设置相机。
setCamera(camera: THREE.Camera): void
设置交互元素节点。
setDom(dom: HTMLElement): void
销毁falcon
实例,并取消相关的事件监听。
dispose(): void
添加物体交互性。
add(target: THREE.Object3D | THREE.Object3D[]): void
移除物体交互性,并清理该物体所有的事件监听。
remove(target: THREE.Object3D | THREE.Object3D[]): void
全局事件拦截器。
type Handler = (event: MouseEvent) => void
interface InterceptorEvent {
type: EventType
event: MouseEvent
object3D: THREE.Object3D
abortController: AbortController
}
intercept(type: EventType, handlerInterceptor: Handler<InterceptorEvent>): void
拦截事件,这次事件不再被分发至对应物体。
abort(): void
只有被添加至
falcon
的物体,才能激活以下方法。
注册物体事件监听。
on(type: EventType, handler: THREE.EventListener): this
基于物体某一事件,移除物体事件监听。
off(type: EventType, handler: THREE.EventListener): this
基于物体某一事件类型,移除物体事件监听。
off(type: EventType): this
基于物体所有事件,移除物体事件监听。
off(): this
基于物体某一事件类型,激活事件监听。
enable(type: EventType): this
基于物体所有事件,激活事件监听。
enable(): this
基于物体某一事件类型,失活事件监听。
disable(type: EventType): this
基于物体所有事件,失活事件监听。
disable(): this
基于物体某一事件类型,开启事件穿透。
enableDeep(type: EventType): this
基于物体所有事件,关闭事件穿透。
enableDeep(): this
基于物体某一事件类型,开启事件穿透。
disableDeep(type: EventType): this
基于物体所有事件,关闭事件穿透。
disableDeep(): this