الأحداث

Starter pack

دعونا نكتشف كيفية التعامل مع أحداث الماوس ولوحة المفاتيح واللمس في React Three Fiber لجعل مشهدنا الثلاثي الأبعاد أكثر تفاعلاً وغامرة.

الفأرة

تمتلك Meshes بضعة أحداث يمكننا استخدامها للتعامل مع أحداث الفأرة.

لكشف متى تكون الفأرة فوق mesh، يمكننا استخدام أحداث onPointerEnter و onPointerLeave.

لنقم بتغيير لون الكرة عندما تكون الفأرة فوقها.

نبدأ بإنشاء حالة لتخزين ما إذا كانت الفأرة فوق الكرة أم لا:

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

ثم نضيف أحداث onPointerEnter و onPointerLeave على مكون <mesh />:

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

أخيرًا، نقوم بتغيير لون المادة بشكل شرطي بناءً على قيمة حالة hovered:

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

تغيير اللون عند التحويم

الآن، تصبح الكرة وردية عندما تكون الفأرة فوقها.

يمكننا أيضًا كشف متى يتم النقر على mesh باستخدام حدث onClick.

نضيف حالة لتخزين ما إذا كانت الكرة محددة أم لا:

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

ثم نضيف حدث onClick على مكون <mesh />:

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

نقوم بتعيين حالة selected إلى العكس من قيمتها الحالية.

أخيرًا، نقوم بتغيير لون المادة بشكل شرطي بناءً على قيمة حالة 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>
);

قررت استخدام متغير لتخزين اللون لجعل الكود أكثر قراءة من استخدام عمليتي شرط ثلاثي.

أحداث الفقاعات

دعونا نضيف كرة كبيرة خلف الكرات الثلاث.

// ...

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

إذا قمنا بتحريك المؤشر فوق الكرة الوسطى، يمكننا أن نلاحظ أن الكرة الكبيرة تتأثر أيضًا بأحداث onPointerEnter و onPointerLeave. السبب هو أن هذه الأحداث تحدث فقاعات.

الشعاع المرسل الذي تستخدمه React Three Fiber لاكتشاف أحداث الفأرة يمر عبر الكرة الوسطى ثم عبر الكرة الكبيرة.

bubbleEvent

لمنع الحدث من الفقاعات، يمكننا استخدام stopPropagation على الحدث.

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.