انتقالات الشادر

Starter pack

في هذا الدرس سنتعلم كيفية إنشاء انتقالات باستخدام الشادر.

أول تأثير سنقوم بإنشائه هو تأثير انتقال الشاشة:

لدينا سيطرة كاملة على تأثير الانتقال، حيث يمكننا تغيير المدة، وظيفة التخفيف، والشادر نفسه.

التأثير الثاني الذي سنقوم بإنشائه هو تأثير انتقال النموذج:

عند التلاشي للخارج، يتم إذابة النموذج وتتحول الألوان إلى اللون الأبيض، ويحدث العكس عند التلاشي للداخل.

الحزمة الابتدائية

إليك جميع النماذج ثلاثية الأبعاد التي سنستخدمها في هذا الدرس مقدمًا من قبل Ergoni ومرخصة تحت Creative Commons Attribution:

تستخدم الحزمة الابتدائية الحزم التالية:

الخطّين المستخدمين هما Kanit و Rubik Doodle Shadow، كلاهما من Google Fonts.

لا تتردد في تعديل أي مكونات حسب تفضيلاتك.

يمكنك تعديل الألوان من خلال اللعب بتوجيهات Leva في الزاوية العلوية اليمنى. بمجرد العثور على الألوان التي تعجبك، أضف خاصية hidden إلى مكون Leva في App.jsx:

// ...

function App() {
  // ...
  return (
    <>
      <Leva hidden />
      {/* ... */}
    </>
  );
}

// ...

انتقال الشاشة

لنبدأ بإنشاء تأثير انتقال الشاشة. سنقوم بإنشاء مكون يسمى ScreenTransition الذي سيتولى تأثير الانتقال.

لنقم بإنشاء ملف جديد يسمى ScreenTransition.jsx في مجلد components:

export const ScreenTransition = ({ transition, color }) => {
  return (
    <mesh>
      <planeGeometry args={[2, 2]} />
      <meshBasicMaterial color={color} />
    </mesh>
  );
};

في هذا المكون، نحن ننشئ مستوى مسطحًا بلون يغطي الشاشة بأكملها. سنستخدم هذا المستوى للتحول بين الشاشات.

مكوننا يتلقى خاصيتين:

  • transition: وهو نوع منطقي لمعرفة ما إذا كان المكون يجب أن يعرض تأثير الانتقال
  • color: وهو اللون الرئيسي لتأثير الانتقال

لنقم بإضافة مكون ScreenTransition إلى App.jsx:

// ...
import { ScreenTransition } from "./components/ScreenTransition";

function App() {
  // ...
  return (
    <>
      {/* ... */}
      <Canvas camera={{ position: [0, 1.8, 5], fov: 42 }}>
        <color attach="background" args={[backgroundColor]} />
        <fog attach="fog" args={[backgroundColor, 5, 12]} />
        <ScreenTransition transition color="#a5b4fc" />
        <Suspense>
          <Experience />
        </Suspense>
      </Canvas>
    </>
  );
}

export default App;

حاليًا نقوم بإجبار تأثير الانتقال على العرض من خلال تمرير true إلى خاصية transition. سنضيف المنطق للتحكم في تأثير الانتقال لاحقًا.

عدل اللون حسب رغبتك. إذا قمت بتغييره، تأكد من تحديث اللون في ملف index.css لتجنب وميض اللون عند تحميل الموقع:

// ...

html {
  background-color: #a5b4fc;
}

المستوى في وسط المشهد

المستوى في وسط المشهد.

طائرة بملء الشاشة

نريد أن تغطي الطائرة الخاصة بنا الشاشة بأكملها. يمكننا استخدام أبعاد viewport وجعلها تواجه الكاميرا، لكننا نريد أيضًا أن تكون في أعلى كل شيء.

لتحقيق ذلك، يقدم Drei مكون Hud الذي سيقوم بعرض عناصره الفرعية في أعلى كل شيء. يمكننا إضافة كاميرا ثابتة إلى مكون Hud لضمان أنها متوافقة تمامًا مع الطائرة الخاصة بنا:

import { Hud, OrthographicCamera } from "@react-three/drei";

export const ScreenTransition = ({ transition, color }) => {
  return (
    <Hud>
      <OrthographicCamera
        makeDefault
        top={1}
        right={1}
        bottom={-1}
        left={-1}
        near={0}
        far={1}
      />
      <mesh>
        <planeGeometry args={[2, 2]} />
        <meshBasicMaterial color={color} />
      </mesh>
    </Hud>
  );
};

نحن نستخدم OrthographicCamera لتغطية الشاشة بأكملها بسهولة بغض النظر عن المسافة بين الكاميرا والطائرة.

طائرة تغطي الشاشة بأكملها

الطائرة الآن تغطي الشاشة بأكملها.

منطق الانتقال

شيء أخير قبل إنشاء الشادر المخصص، لنقم بتحديد حالة الانتقال في UI.jsx:

// ...
import { atom } from "jotai";

export const transitionAtom = atom(true);
// ...

نقوم بتعيين القيمة المبدئية إلى true لبدء تأثير التلاشي بعد تحميل الموقع.

سنستخدم هذه الحالة للتحكم في تأثير الانتقال.

لا زلنا في UI.jsx، سنقوم بتعريف ثوابت للتحكم في مدة وتأخير تأثير الانتقال:

// ...
export const TRANSITION_DELAY = 0.8;
export const TRANSITION_DURATION = 3.2;
// ...

الآن، نستبدل استدعاء الدالة setScreen بوظيفة جديدة ستتعامل مع تأثير الانتقال:

// ...
import { useAtom } from "jotai";
import { useRef } from "react";
// ...

export const UI = () => {
  // ...
  const [transition, setTransition] = useAtom(transitionAtom);
  const timeout = useRef();

  // ...
  const transitionToScreen = (newScreen) => {
    setTransition(true);
    clearTimeout(timeout.current);
    timeout.current = setTimeout(() => {
      setScreen(newScreen);
      setTransition(false);
    }, TRANSITION_DURATION * 1000 + TRANSITION_DELAY * 1000);
  };
  // ...
};

بدلاً من تعيين الشاشة الجديدة مباشرة، نقوم بتعيين حالة الانتقال إلى true ونستخدم setTimeout لتعيين الشاشة الجديدة بعد انتهاء تأثير الانتقال (مدة تأثير الانتقال بالإضافة إلى التأخير).

الآن أصبحت الدالة جاهزة، ابحث عن استدعاءات setScreen في مكون UI واستبدلها بـ transitionToScreen.

من home إلى menu:

<motion.button
  onClick={() => transitionToScreen("menu")}
  // ...
>

ومن menu إلى home:

<motion.button
onClick={() => transitionToScreen("home")}
// ...
>
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.