Eventos

Starter pack

Vamos a descubrir cómo manejar eventos de mouse, teclado y táctiles en React Three Fiber para hacer nuestra escena 3D más interactiva e inmersiva.

Mouse

Meshes tienen algunos eventos que podemos usar para manejar eventos de mouse.

Para detectar cuando el mouse está sobre un mesh, podemos usar los eventos onPointerEnter y onPointerLeave.

Vamos a cambiar el color de nuestra esfera cuando el mouse está sobre ella.

Empezamos creando un estado para almacenar si el mouse está sobre la esfera o no:

const [hovered, setHovered] = useState(false);

Luego, añadimos los eventos onPointerEnter y onPointerLeave en el componente <mesh />:

<mesh
  {...props}
  onPointerEnter={() => setHovered(true)}
  onPointerLeave={() => setHovered(false)}
>
  {/* ... */}
</mesh>

Finalmente, cambiamos condicionalmente el color del material basado en el valor del estado hovered:

<meshStandardMaterial color={hovered ? "pink" : "white"} />

Change color on hover

Ahora, la esfera se vuelve rosa cuando el mouse está sobre ella.

También podemos detectar cuando el mouse hace clic en un mesh usando el evento onClick.

Añadimos un estado para almacenar si la esfera está seleccionada o no:

const [selected, setSelected] = useState(false);

Luego, añadimos el evento onClick en el componente <mesh />:

<mesh
  {...props}
  onPointerEnter={() => setHovered(true)}
  onPointerLeave={() => setHovered(false)}
  onClick={() => setSelected(!selected)}
>
  {/* ... */}
</mesh>

Establecemos el estado selected al valor opuesto de su valor actual.

Finalmente, cambiamos condicionalmente el color del material basado en el valor del estado active:

let color = hovered ? "pink" : "white";
if (selected) {
  color = "hotpink";
}

return (
  <mesh
    {...props}
    onPointerEnter={() => setHovered(true)}
    onPointerLeave={() => setHovered(false)}
    onClick={() => setSelected(!selected)}
  >
    <sphereGeometry args={[0.5, 64, 64]} />
    <meshStandardMaterial color={color} />
  </mesh>
);

Decidí usar una variable para almacenar el color para hacer el código más legible en lugar de usar dos operadores ternarios.

Eventos de burbujeo

Vamos a añadir una gran esfera detrás de nuestras tres esferas.

// ...

export const Experience = () => {
  return (
    <>
      <MoveableSphere scale={3} position-z={-10} />
      <MoveableSphere />
      <MoveableSphere position-x={-2} />
      <MoveableSphere position-x={2} />
      <ContactShadows
        rotation-x={Math.PI / 2}
        position={[0, -1.6, 0]}
        opacity={0.42}
      />

      <Environment preset="sunset" />
    </>
  );
};

Si pasamos el cursor sobre la esfera del medio, podemos ver que la gran esfera también se ve afectada por los eventos onPointerEnter y onPointerLeave. Esto es porque esos eventos están burbujeando.

El rayo lanzado utilizado por React Three Fiber para detectar los eventos del ratón atraviesa la esfera del medio y luego la gran esfera.

bubbleEvent

Para evitar que el evento burbujee, podemos usar stopPropagation en el event.

End of lesson preview

To get access to the entire lesson, you need to purchase the course.