Events

Starter pack

Mari kita pelajari cara menangani event mouse, keyboard, dan sentuhan di React Three Fiber untuk membuat adegan 3D kita menjadi lebih interaktif dan imersif.

Mouse

Meshes memiliki beberapa event yang dapat kita gunakan untuk menangani event mouse.

Untuk mendeteksi ketika mouse berada di atas mesh, kita dapat menggunakan event onPointerEnter dan onPointerLeave.

Mari kita ubah warna bola kita ketika mouse berada di atasnya.

Kita mulai dengan membuat state untuk menyimpan apakah mouse berada di atas bola atau tidak:

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

Kemudian, kita tambahkan event onPointerEnter dan onPointerLeave pada komponen <mesh />:

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

Akhirnya, kita ubah warna material secara kondisional berdasarkan nilai state hovered:

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

Ubah warna saat melayang

Sekarang, bola berubah menjadi pink ketika mouse berada di atasnya.

Kita juga dapat mendeteksi ketika mouse diklik pada mesh menggunakan event onClick.

Kita tambahkan state untuk menyimpan apakah bola dipilih atau tidak:

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

Kemudian, kita tambahkan event onClick pada komponen <mesh />:

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

Kita atur state selected menjadi kebalikan dari nilai saat ini.

Akhirnya, kita ubah warna material secara kondisional berdasarkan nilai state 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>
);

Saya memutuskan untuk menggunakan variabel untuk menyimpan warna agar kode lebih mudah dibaca daripada menggunakan dua operator ternary.

Peristiwa Bubbling

Mari kita tambahkan sebuah bola besar di belakang tiga bola kita.

// ...

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" />
    </>
  );
};

Jika kita mengarahkan mouse ke bola tengah, kita bisa melihat bahwa bola besar juga terpengaruh oleh peristiwa onPointerEnter dan onPointerLeave. Ini karena peristiwa tersebut menggelembung.

Sinar yang digunakan oleh React Three Fiber untuk mendeteksi peristiwa mouse melewati bola tengah dan kemudian melalui bola besar.

bubbleEvent

Untuk mencegah peristiwa dari bubbling, kita bisa menggunakan stopPropagation pada event.

Three.js logoReact logo

React Three Fiber: The Ultimate Guide to 3D Web Development

✨ You have reached the end of the preview ✨

Go to the next level with Three.js and React Three Fiber!

Get full access to this lesson and the complete course when you enroll:

  • 🔓 Full lesson videos with no limits
  • 💻 Access to the final source code
  • 🎓 Course progress tracking & completion
  • 💬 Invite to our private Discord community
Unlock the Full Course – Just $85

One-time payment. Lifetime updates included.