three js clickable objects

38,650

Solution 1

you can use this event manager three.interaction

and see this demo

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);

// new a interaction, then you can add interaction-event with your free style
const interaction = new Interaction(renderer, scene, camera);

const cube = new Mesh(
  new BoxGeometry(1, 1, 1),
  new MeshBasicMaterial({ color: 0xffffff }),
);
scene.add(cube);
cube.cursor = 'pointer';
cube.on('click', function(ev) {});
cube.on('touchstart', function(ev) {});
cube.on('touchcancel', function(ev) {});
cube.on('touchmove', function(ev) {});
cube.on('touchend', function(ev) {});
cube.on('mousedown', function(ev) {});
cube.on('mouseout', function(ev) {});
cube.on('mouseover', function(ev) {});
cube.on('mousemove', function(ev) {});
cube.on('mouseup', function(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);
})
scene.on('touchmove', ev => {
  console.log(ev);
})

Solution 2

Absolutely you need to implement raycaster to select/click/pick certain object in three.js. I've already implemented it in one of my project using three.js and raycaster against collada model. For your reference, these links can help you:

  1. http://soledadpenades.com/articles/three-js-tutorials/object-picking/
  2. http://jensarps.de/2012/08/10/mouse-picking-collada-models-with-three-js/
Share:
38,650
Mashael
Author by

Mashael

Updated on July 09, 2022

Comments

  • Mashael
    Mashael almost 2 years

    I have two 3d objects "meshes" that I created in three.js. I want to add click event to these objects so that when I click on one of them, it is scaled up and when I click on the other one, it rotates.

    I tried this method to add a click event to an object and it's not working.

    <script src='threex.domevent.js'> </script>
    <script>
    
            var scene = new THREE.Scene();
            var camera = new THREE.PerspectiveCamera(20, window.innerWidth/window.innerHeight, 1, 1000);
            camera.position.z = 100;
    
            var renderer = new THREE.WebGLRenderer();
            renderer.setSize(window.innerWidth, window.innerHeight);
            document.body.appendChild(renderer.domElement);
    
            var geometry = new THREE.CubeGeometry(1,1,1);
            var material = new THREE.MeshBasicMaterial({color: 0x00ff00});
            var cube = new THREE.Mesh(geometry, material);
            scene.add(cube);
    
            cube.addEventListener( 'click',function(){cubeScale()} , false );
    
            function cubeScale()
                {
                cube.scale.x *= 20;
                }
    
    
            var render = function () {
                requestAnimationFrame(render);
                cube.rotation.y += 0.1;
                renderer.render(scene, camera);
            };
    
            render();
    
        </script>