UNPKG

three.interaction

Version:

a interaction manager, serve the three.js, help you build a interactivity 3d-scene

90 lines (82 loc) 2.83 kB
import Ticker from '../utils/Ticker'; import InteractionManager from './InteractionManager'; /** * The interaction manager deals with mouse, touch and pointer events. Any DisplayObject can be interactive * if its interactive parameter is set to true * This manager also supports multitouch. * * reference to [pixi.js](http://www.pixijs.com/) impl * * @example * import { Scene, PerspectiveCamera, WebGLRenderer, Mesh, BoxGeometry, MeshBasicMaterial } from 'three'; * import { Interaction } from 'three.interaction'; * const renderer = new WebGLRenderer({ canvas: canvasElement }); * const scene = new Scene(); * const camera = new PerspectiveCamera(60, width / height, 0.1, 100); * * const interaction = new Interaction(renderer, scene, camera); * // then you can bind every interaction event with any mesh which you had `add` into `scene` before * const cube = new Mesh( * new BoxGeometry(1, 1, 1), * new MeshBasicMaterial({ color: 0xffffff }), * ); * scene.add(cube); * cube.on('touchstart', ev => { * console.log(ev); * }); * * cube.on('mousedown', ev => { * console.log(ev); * }); * * cube.on('pointerdown', ev => { * console.log(ev); * }); * // and so on ... * * // you can also listen on parent-node or any display-tree node, * // source event will bubble up along with display-tree. * // you can stop the bubble-up by invoke ev.stopPropagation function. * scene.on('touchstart', ev => { * console.log(ev); * }) * * @class * @extends InteractionManager */ class Interaction extends InteractionManager { /** * @param {WebGLRenderer} renderer - A reference to the current renderer * @param {Scene} scene - A reference to the current scene * @param {Camera} camera - A reference to the current camera * @param {Object} [options] - The options for the manager. * @param {Boolean} [options.autoPreventDefault=false] - Should the manager automatically prevent default browser actions. * @param {Boolean} [options.autoAttach=false] - Should the manager automatically attach target element. * @param {Number} [options.interactionFrequency=10] - Frequency increases the interaction events will be checked. */ constructor(renderer, scene, camera, options) { options = Object.assign({ autoAttach: false }, options); super(renderer, scene, camera, options); /** * a ticker * * @private * @member {Ticker} */ this.ticker = new Ticker(); /** * update for some over event * * @private */ this.update = this.update.bind(this); this.on('addevents', () => { this.ticker.on('tick', this.update); }); this.on('removeevents', () => { this.ticker.off('tick', this.update); }); this.setTargetElement(this.renderer.domElement); } } export default Interaction;