الغوص في التفاعل و Three.js باستخدام تفاعل ثلاثة ألياف

نشرت: 2022-03-10
ملخص سريع ↬ react-three-fiber هو عارض قوي Three.js يساعد في تقديم نماذج ثلاثية الأبعاد ورسوم متحركة لـ React وتطبيقاتها الأصلية. في هذا البرنامج التعليمي ، ستتعلم كيفية تكوين وبناء نماذج ثلاثية الأبعاد في تطبيق React.

اليوم ، سنتعلم كيفية تكوين واستخدام react-three-fiber لبناء وعرض نماذج ورسوم متحركة ثلاثية الأبعاد في تطبيقات React و React Native.

هذا البرنامج التعليمي مخصص للمطورين الذين يرغبون في معرفة المزيد عن الرسوم المتحركة للنماذج ثلاثية الأبعاد في الويب باستخدام React ولأي شخص لديه قيود مع Three.js مثل عدم القدرة على إنشاء لوحة الرسم ، وربط أحداث المستخدم مثل click الأحداث وبدء حلقة العرض ، react-three-fiber تأتي مع هذه الأساليب. سنقوم ببناء نموذج ثلاثي الأبعاد لفهم كيفية بناء نماذج Three.js ثلاثية الأبعاد باستخدام ألياف ثلاثية react-three-fiber .

الشروع react-three-fiber

Three.js هي مكتبة تسهل إنشاء رسومات ثلاثية الأبعاد في المتصفح ، وتستخدم لوحة قماشية + WebGL لعرض النماذج والرسوم المتحركة ثلاثية الأبعاد ، ويمكنك معرفة المزيد هنا.

React-three-fiber هو عارض React لـ Three.js على الويب وله تفاعل أصلي ، إنه تعزيز للسرعة التي تنشئ بها نماذج ثلاثية الأبعاد ورسومًا متحركة باستخدام Three.js ، وبعض الأمثلة على المواقع التي تحتوي على نماذج ثلاثية الأبعاد ورسوم متحركة يمكن العثور عليها هنا. تقلل react-three-fiber الوقت الذي تقضيه في الرسوم المتحركة بسبب مكوناتها القابلة لإعادة الاستخدام وأحداث الربط وحلقة العرض ، فلنلقِ أولاً نظرة على ما هو Three.js.

يسمح لنا react-three-fiber ببناء مكونات كود threeJS باستخدام حالة React والخطافات والدعائم ، كما أنه يأتي مع العناصر التالية:

جزء وصف
mesh خاصية تساعد في تحديد شكل نماذجنا
hooks تحدد react-three-fiber الخطافات التي تساعدنا في كتابة الوظائف التي تساعد في تحديد أحداث المستخدم مثل onClick و onPointOver
حلقة التصيير والقائمة على المكونات react-three-fiber يعتمد على المكونات ويتم تقديمه وفقًا للتغيير في الحالة أو المتجر
المزيد بعد القفز! أكمل القراءة أدناه ↓

كيفية استخدام react-three-fiber

لاستخدام react-three-fiber ، عليك أن تبدأ باستخدام الأوامر أدناه:

NPM

 npm i three react-three-fiber

غزل

 yarn add three react-three-fiber

ملاحظة : لكي تعمل react-three-fiber ، ستحتاج إلى تثبيت three (Three.js) كما فعلنا أعلاه.

بناء نموذج 3D Ludo Dice ومشروع الرسوم المتحركة

سنقوم هنا ببناء نموذج ثلاثي الأبعاد لنرد ludo باستخدام react-three-fiber كما هو الحال في الفيديو أدناه.

create-react-app لتهيئة مشروعنا ، ولفعل ذلك دعنا ننفذ الأمر أدناه على جهازك.

 create-react-app react-three-fiber-ludo-model

يقوم الأمر أعلاه بتهيئة مشروع React داخل آلتنا المحلية ، وبعد ذلك دعنا cd في الدليل ونثبت حزمنا react-three-fiber three .

 cd react-three-fiber-ludo-model npm i three react-three-fiber

بمجرد تثبيت الحزم ، لنبدأ خادم التطوير الخاص بنا باستخدام الأمر

 npm start

يجب أن يبدأ الأمر أعلاه خادم تطوير المشروع الخاص بنا في متصفحنا. بعد ذلك ، دعنا نفتح مشروعنا في محرر النصوص الذي نختاره ، داخل مجلد src الخاص بالمشروع ، واحذف الملفات التالية: App.css و App.test.js و serviceWorker.js و setupTests.js . بعد ذلك ، دعنا نحذف جميع الأكواد التي تشير إلى الملفات المحذوفة على App.js

بالنسبة لهذا المشروع ، سنحتاج إلى مكون Box لنردات ludo ومكون App الخاص بنا الذي قدمته React.

بناء مكون Box

سيحتوي مكون Box على شكل نردات ludo الخاصة بنا ، وصورة نرد ludo وحالة لإبقائه دائمًا في حالة دوران. أولاً ، دعنا نستورد جميع الحزم التي نحتاجها لمكون Box أدناه.

 import React, { useRef, useState, useMemo } from "react"; import { Canvas, useFrame } from "react-three-fiber"; import * as THREE from "three"; import five from "./assets/five.png";

في الكود أعلاه ، useRef و useState و useMemo . سنستخدم خطاف useRef للوصول إلى شبكة النرد وخطاف useState للتحقق من الحالة النشطة لنرد ludo. سيتم استخدام خطاف useMemo لإرجاع الرقم الموجود على النرد. بعد ذلك ، نقوم باستيراد Canvas و useFrame من react-three-fiber ، ويتم استخدام canvas لرسم الرسومات على المتصفح ، بينما يسمح useFrame للمكونات بالربط في حلقة العرض ، وهذا يجعل من الممكن عرض مكون واحد أكثر محتوى آخر. بعد ذلك ، قمنا باستيراد الحزمة three ثم قمنا باستيراد صورة ثابتة لنرد ludo.

التالي بالنسبة لنا هو كتابة المنطق لمكون Box الخاص بنا. أولاً ، سنبدأ ببناء مكون وظيفي ونضيف الحالة إلى المكون الخاص بنا ، دعنا نفعل ذلك أدناه.

 const Box = (props) => { const mesh = useRef(); const [active, setActive] = useState(false); useFrame(() => { mesh.current.rotation.x = mesh.current.rotation.y += 0.01; }); const texture = useMemo(() => new THREE.TextureLoader().load(five), []); return ( <Box /> ); }

في الكود أعلاه ، نقوم بإنشاء مكون Box مع الدعائم ، وبعد ذلك نقوم بإنشاء مرجع يسمى mesh باستخدام خطاف useRef ، وقد فعلنا ذلك حتى نتمكن دائمًا من إرجاع نفس الشبكة في كل مرة.

الشبكة هي عنصر مرئي في مشهد ، وهي عبارة عن كائن ثلاثي الأبعاد يتكون من مضلع ثلاثي ، وعادة ما يتم بناؤه باستخدام الهندسة ، والتي تُستخدم لتحديد شكل النموذج والمواد التي تحدد مظهر النموذج ، يمكنك تعرف على معلومات حول الشبكة هنا ، يمكنك أيضًا معرفة المزيد حول خطاف useRef هنا.

بعد تهيئة mesh ، نحتاج إلى تهيئة حالة useState باستخدام خطاف useState ، وهنا نقوم بإعداد الحالة النشطة والمرتفعة للتطبيق إلى false.

بعد ذلك ، نستخدم خطاف useFrame من react-three-fiber لتدوير الشبكة (نرد ludo) ، باستخدام الكود أدناه

 mesh.current.rotation.x = mesh.current.rotation.y += 0.01;

هنا ، نقوم بتدوير الوضع الحالي للشبكة كل 0.01 ثانية ، ويتم ذلك لإعطاء الدوران حركة جيدة.

 const texture = useMemo(() => new THREE.TextureLoader().load(five), []);

في الكود أعلاه ، نقوم بإنشاء ثابت يسمى texture ونمرر في رد فعل خطاف useMemo كدالة لتحميل لفة نرد جديدة ، وهنا useMemo لحفظ صورة النرد ورقمها. يمكنك التعرف على خطاف useMemo هنا.

بعد ذلك ، نريد عرض مكون Box على المتصفح وإضافة أحداثنا ، ونقوم بذلك أدناه

 const Box = (props) => { return ( <mesh {...props} ref={mesh} scale={active ? [2, 2, 2] : [1.5, 1.5, 1.5]} onClick={(e) => setActive(!active)} > <boxBufferGeometry args={[1, 1, 1]} /> <meshBasicMaterial attach="material" transparent side={THREE.DoubleSide}> <primitive attach="map" object={texture} /> </meshBasicMaterial> </mesh> ); }

في الكود أعلاه ، نعيد مكون Box الخاص بنا ونلفه في mesh ، مررنا جميع خصائص مكون Box باستخدام عامل الانتشار ، ثم أشرنا إلى الشبكة باستخدام خطاف useRef . بعد ذلك ، نستخدم خاصية scale من Three.js لتعيين حجم مربع النرد عندما يكون نشطًا على 2 و 1.5 عندما لا يكون كذلك. أخيرًا وليس آخرًا ، أضفنا حدث onClick لتعيين state على active إذا لم يتم تعيينها افتراضيًا.

 <boxBufferGeometry args={[1, 1, 1]} />

من أجل عرض مربع النرد ، قدمنا ​​مكون boxBufferGeometry من Three.js ، يساعدنا boxBufferGeometry رسم خطوط ونقاط مثل المربعات ، استخدمنا وسيطة args لتمرير المنشئات مثل حجم هندسة الصندوق.

 <meshBasicMaterial attach="material" transparent side={THREE.DoubleSide}>

تُستخدم meshBasicMaterial من Three.js لرسم الأشكال الهندسية في شكل بسيط. هنا قمنا بتمرير سمة attach ومررنا الدعائم THREE.DoubleSide إلى السمة side . يحدد THREE.DoubleSide الجوانب أو المساحات التي يجب أن يتم تقديمها بواسطة react-three-fiber .

 <primitive attach="map" object={texture} />

يتم استخدام المكون primitive من Three.js لرسم رسوم بيانية ثلاثية الأبعاد. قمنا بإرفاق خاصية الخريطة من أجل الحفاظ على الشكل الأصلي لنرد اللودو. بعد ذلك ، سنقوم بعرض مكون Box الخاص بنا في ملف App.js وإكمال مربع نرد ludo ثلاثي الأبعاد. يجب أن يبدو المكون الخاص بك مشابهًا للصورة أدناه.

مكون الصندوق لمربع ludo 3D

تقديم 3D Ludo Dice Box

في هذا القسم ، سنقوم بعرض مكون Box الخاص بنا في App.js وإكمال مربع ludo ثلاثي الأبعاد الخاص بنا ، للقيام بذلك أولاً ، دعنا ننشئ مكون App ونلفه بعلامة Canvas ، وهذا لتقديم نماذجنا ثلاثية الأبعاد ، لنفعل ذلك أدناه.

 const App = () => { return ( <Canvas> </Canvas> ); } export default App;

بعد ذلك ، دعنا نضيف ضوءًا إلى الصناديق ، توفر لنا react-three-fiber ثلاثة مكونات لإضاءة نماذجنا ، وهي كالتالي

  • ambientLight
    يستخدم هذا لإضاءة جميع الكائنات في مشهد أو نموذج بالتساوي ، فإنه يقبل الدعائم مثل شدة الضوء ، وهذا سوف يضيء جسم نرد ludo.
  • spotLight
    ينبعث هذا الضوء من اتجاه واحد ، ويزداد مع زيادة حجم الكائن ، وهذا سوف يضيء نقاط نرد ludo.
  • pointLight
    يعمل هذا بشكل مشابه لضوء المصباح الكهربائي ، وينبعث الضوء من نقطة واحدة إلى جميع الاتجاهات ، وسيكون هذا ضروريًا للحالة النشطة لتطبيقنا.

دعنا ننفذ ما ورد أعلاه في تطبيقنا أدناه.

 const App = () => { return ( <Canvas> <ambientLight intensity={0.5} /> <spotLight position={[10, 10, 10]} angle={0.15} penumbra={1} /> <pointLight position={[-10, -10, -10]} /> </Canvas> ); } export default App;

في الكود أعلاه ، قمنا باستيراد مكون ambientLight من react-three-fiber وأضفنا كثافة 0.5 إليه ، ثم أضفنا موضعًا وزاوية إلى مكون spotLight و pointLight . الخطوة الأخيرة لتطبيقنا هي عرض مكون الصندوق الخاص بنا وإضافة موضع إلى مربعات النرد ludo ، سنفعل ذلك في الكود أدناه

 <Box position={[-1.2, 0, 0]} /> <Box position={[2.5, 0, 0]} />

عند الانتهاء ، يجب أن يبدو نرد ludo 3D الخاص بك مشابهًا للصورة أدناه:

3D النرد لودو مربع

يتوفر عرض عملي على CodeSandbox.

خاتمة

react-three-fiber جعلت من السهل إنشاء نماذج ثلاثية الأبعاد ورسوم متحركة لتطبيقات React و React Native. من خلال بناء صندوق نرد ludo ثلاثي الأبعاد ، تعلمنا أساسيات Three.js جنبًا إلى جنب مع مكوناته وفوائد react-three-fiber بالإضافة إلى كيفية استخدامه.

يمكنك المضي قدمًا في هذا الأمر من خلال إنشاء نماذج ثلاثية الأبعاد ورسوم متحركة في تطبيقات React و Native عن طريق استخدام react-three-fiber بمفردك. أود أن أرى ما هي الأشياء الجديدة التي توصلت إليها!

يمكنك قراءة المزيد عن Three.js وتفاعل react-three-fiber في المراجع أدناه.

موارد ذات الصلة

  • وثائق Three.js
  • أساسيات Three.js
  • React-Three-fiber GitHub repo بواسطة Poimandres
  • رد فعل ثلاثة وثائق الألياف
  • React Hooks (useState ، useMemo ، إلخ) الوثائق الرسمية