حتى وقت قريب ، كان العشب في الألعاب يُشار إليه عادةً بنسيج على الأرض ، بدلاً من جعل سيقان فردية. ولكن مع زيادة قوة الحديد ، أصبح من الممكن جعل العشب. يمكن مشاهدة أمثلة رائعة على هذا العرض في ألعاب مثل
Horizon Zero Dawn و
The Legend of Zelda: Breath of the Wild . في هذه الألعاب ، يمكن للاعب التجول في مروج العشب ، والأهم من ذلك ، أن العشب
يستجيب لأفعال اللاعب.
لحسن الحظ ، فإن إنشاء مثل هذا النظام ليس صعبًا للغاية. في الواقع ، ستعلمك المقالة ذلك! في هذا البرنامج التعليمي سوف تتعلم ما يلي:
- إنشاء حقل ناقل باستخدام التقاط المشهد ونظام الجسيمات
- ثني العشب من لاعب يعتمد على حقل ناقل
ملاحظة: يفترض هذا البرنامج التعليمي أنك تعرف بالفعل أساسيات العمل مع Unreal Engine. إذا كنت جديدًا على Unreal Engine ، فقم بفحص سلسلة العشرة أجزاء من دروس Unreal Engine للمبتدئين . على وجه الخصوص ، تحقق من البرنامج التعليمي أنظمة الجسيمات لمعرفة كيفية استخدام Cascade في هذا البرنامج التعليمي.
ملاحظة: هذا البرنامج التعليمي هو جزء من سلسلة من ثلاثة برامج تعليمية حول العمل مع أهداف العرض:
للوصول إلى العمل
لنبدأ بتنزيل مواد هذا البرنامج التعليمي (يمكنك تنزيلها
من هنا ). قم بفك ضغطها ، انتقل إلى
InteractiveGrassStarter وافتح
InteractiveGrass.uproject . سترى حقلًا صغيرًا من العشب سيكون موضوع هذا البرنامج التعليمي. لقد قمت أيضًا بإنشاء أداة لعرض هدف التجسيد لالتقاط المشهد.
قبل أن تبدأ ، يجب عليك دراسة البرنامج التعليمي
حول إنشاء آثار أقدام في الثلج ، لأنني سوف أتخطى بعض المعلومات. تجدر الإشارة إلى أنه يتم استخدام الالتقاط والإسقاط أيضًا في هذا البرنامج التعليمي. لتوفير الوقت ، قمت بإعداد التقاط مخطط ، على غرار المخطط من البرنامج التعليمي على المسارات في الثلج.
للبدء ، دعنا ننظر إلى طريقة أخرى لإنشاء العشب التفاعلي. الطريقة الأكثر شيوعًا هي نقل إحداثيات اللاعب إلى مادة العشب واستخدام قناع كروي لثني العشب في دائرة نصف قطرها معينة من اللاعب.
على الرغم من أن هذا النهج جيد جدًا ، إلا أنه لا يتطور جيدًا عندما نريد إضافة المزيد من الجهات الفاعلة إلى العشب. لكل ممثل تضيفه ، سيكون عليك إضافة معلمة إحداثية أخرى وقناع كروي للمادة. طريقة أكثر قابلية للتحجيم هي استخدام
حقل متجه .
ما هو حقل المتجه؟
حقل المتجه هو مجرد نسيج ، كل بكسل يتوافق مع اتجاه. إذا كنت تعمل مع خرائط الدفق ، فهي متشابهة. ولكن بدلاً من نقل الأشعة فوق البنفسجية ، سنستخدم اتصال
إزاحة الموضع العالمي لتحريك القمم. على عكس الحل باستخدام قناع كروي ، للحصول على اتجاه الانحناء ، يكفي أن تقوم المواد بتجربة حقل المتجه
مرة واحدة فقط.
دعنا نكتشف كيف يمكنك حفظ الاتجاهات في نسيج. انظر إلى هذه الشبكة:
لنفترض أن النقطة الحمراء هي الكائن الذي نريد تحريكه. إذا قمنا بنقلها إلى الزاوية اليمنى السفلى ، فما المتجه الذي سيشير إلى هذه الحركة؟ إذا أجبت
(1 ، 1) ، فأنت على حق! كما تعلم على الأرجح ، يمكنك أيضًا تمثيل المتجهات كزهور ، وبالتالي حفظها في الملمس. دعونا ندرج هذا المتجه في منتقي الألوان غير الواقعي ونرى اللون الذي يعيده.
كما ترى ، يعود الاتجاه
(1 ، 1) إلى اللون الأصفر. هذا يعني أنه إذا أردنا ثني العشب في اتجاه محاور XY الإيجابية ، فسنضطر إلى استخدام لون النسيج هذا. دعونا الآن نلقي نظرة على ألوان جميع المتجهات.
يبدو المربع الأيمن السفلي جيدًا جدًا لأنه يحتوي على تدرجات على كلا المحورين. هذا يعني أنه يمكننا تخزين أي متجه في هذا الربع كلون ، لأن كل متجه له لون فريد.
ولكن هناك مشكلة مع الأرباع الثلاثة الأخرى. لدينا فقط تدرج على طول محور واحد ، أو لا يوجد تدرج على الإطلاق. هذا يعني أن العديد من المتجهات سيكون لها نفس اللون. على سبيل المثال ، لا يمكننا التمييز بين المتجهات
(-1 ، 1) و
(0 ، 1) .
لا تحتوي هذه الأرباع الثلاثة على ألوان فريدة لكل متجه لأنه لا يمكننا تمثيل الألوان إلا باستخدام القيم من 0 إلى 1. ومع ذلك ، فإن هذه الأرباع الثلاثة تستخدم قيمًا سلبية خارج هذا النطاق.
الحل هو إعادة توزيع المتجهات بحيث تتناسب جميعها في الفاصل الزمني من 0 إلى 1. يمكن القيام بذلك عن طريق ضرب المتجه في
0.5 وإضافة
0.5 . هنا تصور لما نحصل عليه:
الآن كل ناقل له لون فريد. عندما نحتاج إلى استخدامه للحسابات ، فإننا ببساطة نعيد توزيعه على الفترة من -1 إلى 1. فيما يلي بعض الألوان ، والتوجيهات المقابلة بعد إعادة التوزيع:
- (0 ، 0): X و Y سالب
- (0.5، 0.5): بدون حركة
- (0 ، 1): X سالب و Y موجب
- (1 ، 0): X موجب و Y سلبي
الآن دعونا نتعلم كيفية إنشاء حقل ناقل في Unreal.
إنشاء حقل متجه
على عكس إنشاء آثار في الثلج ، لن نقوم بالتقاط شكل الأشياء. بدلاً من ذلك ، سوف نرسم على هدف التجسيد بالفرش. ستكون هذه مجرد صور لمجال المتجه المحدد.
سأدعوهم فرش الاتجاه .
بدلاً من الرسم على هدف التجسيد بالقطع ، يمكننا استخدام
الجسيمات . ستعرض الجسيمات فرشاة الاتجاهات وتنبعث من اللاعب. لإنشاء حقل ناقل ، نحتاج فقط إلى استخدام التقاط المشهد والتقاط الجسيمات فقط. ميزة هذه الطريقة هي أن إنشاء آثار بسيطة للغاية. بالإضافة إلى ذلك ، يسمح لك بإدارة الخصائص بسهولة مثل مدة تخزين المسارات وحجمها. بالإضافة إلى ذلك ، تخلق الجسيمات آثارًا ثابتة مؤقتًا ، لأنها موجودة بعد مغادرة منطقة الالتقاط والعودة إليها.
فيما يلي بعض الأمثلة على الفرش الاتجاهية التي يمكننا استخدامها ، فضلاً عن تأثيرها على العشب. لاحظ أنه في المثال أدناه ، الجسيمات غير مرئية.
للبدء ، دعنا ننشئ مادة تعرض فرشاة اتجاه.
إنشاء مواد للاتجاهات
هناك طريقتان لإنشاء فرشاة اتجاه:
- الرياضية: يتم تعيين الاتجاهات والشكل داخل المادة. ميزتها هي أنها لا تتطلب برامج من جهة خارجية وهي مناسبة للنماذج البسيطة.
- تحويل الخريطة العادية: إنشاء خريطة عادية للاتجاهات والأشكال المطلوبة. لتحويل الخريطة إلى حقل متجه مناسب ، نحتاج فقط إلى إزالة القناة الزرقاء. ميزة هذه الطريقة هي أنه يمكنك بسهولة إنشاء أشكال معقدة. فيما يلي مثال على فرشاة يصعب إنشاؤها رياضيًا.
في هذا البرنامج التعليمي ، سنقوم بإنشاء فرشاة رياضية. انتقل إلى مجلد
المواد وافتح
M_Direction . لاحظ أنه تم تحديد نموذج التظليل
Unlit لهذه المادة. هذا مهم لأنه يسمح بالتقاط مشهد لالتقاط الجسيمات دون التأثير عليها.
من أجل عدم التعقيد ، سنقوم بإنشاء مادة تجعل العشب يتحرك بعيدًا عن مركز الجسيم. للقيام بذلك ، قم بإنشاء المخطط التالي:
الآن نحن بحاجة إلى إعادة التوزيع. للقيام بذلك ، أضف العقد المحددة وربط كل شيء على النحو التالي:
الآن دعونا نعطي الفرشاة شكل دائري. للقيام بذلك ، أضف العقد المحددة:
RadialGradientExponential يتحكم في حجم
ودقة محيط الدائرة. يتيح لك
الضرب في لون الجسيمات التحكم في عتامة الجسيمات من نظام الجسيمات. سأناقش هذا بمزيد من التفصيل في القسم التالي.
إليك ما تبدو عليه الفرشاة:
انقر فوق
تطبيق وأغلق المادة. الآن بعد أن أنشأنا المادة ، حان الوقت للشروع في نظام من آثار الجسيمات.
إنشاء نظام لآثار الجسيمات
انتقل إلى مجلد
ParticleSystems وافتح
PS_GrassTrail . لتوفير الوقت ، لقد قمت بالفعل بإنشاء جميع الوحدات اللازمة.
إليك كيفية تأثير كل وحدة على آثار أقدام العشب:
- تفرخ: يؤثر تكرار الخلق على نعومة المسارات. إذا كانت المسارات تبدو متقطعة ، فيجب عليك زيادة وتيرة الإنشاء. في هذا البرنامج التعليمي سنترك القيمة الافتراضية (20).
- العمر: عمر الممر حتى يعود العشب إلى حالته الأصلية
- الحجم الأولي: حجم التتبع
- Color Over Life: نظرًا لأننا نستخدم لون الجسيمات في المادة ، يمكنك التحكم في العتامة هنا. يمكنك أيضًا تغيير منحنى ألفا للتحكم في اختفاء المسار. على سبيل المثال ، يمكنك اختيار الاختفاء الخطي والتخفيف و / أو التخفيف. في هذا البرنامج التعليمي ، سنترك الإعداد الافتراضي ، أي الخسارة الخطية.
- قفل المحور: يستخدم لتوجيه الجسيمات نحو التقاط المشهد
- الدوران الأولي: يستخدم لضمان توجيه الجسيمات على طول المحاور الصحيحة (المزيد عن هذا أدناه)
نحتاج أولاً إلى تعيين المادة. حدد الوحدة النمطية
المطلوبة وقم بتعيين
المادة إلى
M_Direction . قم أيضًا بتعيين
وضع الفرز على
PSORTMODE Age الأحدث أولاً .
يتيح لك وضع الفرز هذا تقديم جزيئات جديدة فوق الجسيمات القديمة. إذا لم يتم ذلك ، فلن تكون جديدة ، ولكن الجسيمات القديمة ستؤثر على العشب.
التالي هو مدة التتبع. حدد الوحدة النمطية
مدى الحياة وتعيين
ثابت إلى
5 . وبفضل هذا ، سيختفي التتبع في غضون خمس ثوانٍ.
الآن دعنا ننتقل إلى حجم التتبع. حدد وحدة
الحجم الأولي واضبط
الثابت على
(150 ، 150 ، 0) . ونتيجة لذلك ، سيغطي كل جسيم مساحة 150 × 150.
الآن نحن بحاجة لجعلها تبدو في اتجاه التقاط المشهد. نظرًا لأنه يتم التقاط المشهد من أعلى ، يجب أن تبدو الجزيئات في اتجاه المحور Z الإيجابي. للقيام بذلك ، حدد وحدة
قفل المحور وقم بتعيين
علامات قفل المحور إلى
Z.أخيرًا ، نحتاج إلى ضبط دوران الجسيمات. في الوقت الحالي ، لا يتم محاذاة ألوان الفرشاة مع الاتجاه الذي تمثله. حدث هذا لأنه يتم تطبيق نظام الجسيمات افتراضيًا مع دوران 90 درجة. لإصلاح ذلك ، حدد وحدة
التدوير الأولي وقم بتعيين القيمة
الثابتة إلى
-0.25 . سيؤدي هذا إلى تدوير الجسيمات 90 درجة عكس اتجاه عقارب الساعة.
وهذا كل ما نحتاجه لنظام الجسيمات ، لذا فلنغلقه.
بعد ذلك ، نحتاج إلى إرفاق نظام جسيمات لما يفترض أن يخلق آثارًا. في حالتنا ، نحتاج إلى إرفاقها بشخصية اللاعب.
إرفاق نظام الجسيمات
انتقل إلى
Characters \ Mannequin وافتح
BP_Mannequin . بعد ذلك ، قم بإنشاء مكون
نظام Partice وتسميته GrassParticles .
بعد ذلك نحتاج إلى تحديد نظام الجسيمات. انتقل إلى لوحة التفاصيل وقم بتعيين
Particles \ Template إلى
PS_GrassTrail .
سيكون من الغريب أن يتمكن اللاعب من رؤية المسار في اللعبة ، لذا يجدر إخفائه. للقيام بذلك ، قم بتشغيل
Rendering \ Owner No See .
نظرًا لأن نظام الجسيمات متصل باللاعب (المالك) ، فلن يراه اللاعب ، ولكنه سيكون مرئيًا لكل شيء آخر.
انقر فوق
ترجمة ، ثم انقر فوق
تشغيل . لاحظ أن الجسيمات لا تظهر لكاميرا المشغل ، ولكن يتم عرضها على هدف التجسيد.
حتى الآن ، تم تعيين التقاط المشهد لالتقاط
كل شيء . من الواضح أن هذا لا يناسبنا ، لأن الجزيئات فقط تؤثر على العشب. في القسم التالي ، سوف نتعلم كيفية التقاط الجسيمات فقط.
التقاط الجسيمات
إذا قمنا بالتقاط الجسيمات الآن ، فسوف نقوم بالانحناء غير الضروري في المناطق التي لا تحتوي على جزيئات. وذلك لأن لون الخلفية لهدف التجسيد أسود. يحدث الانحناء لأن الأسود يشير إلى حركة نحو محاور XY السلبية (بعد إعادة التوزيع). حتى لا تحتوي المناطق الفارغة على حركة ، نحتاج إلى جعل هدف الخلفية يُعرض
(0.5 ، 0.5 ، 0) . أسهل طريقة للقيام بذلك هي إنشاء طائرة ضخمة وإرفاقها باللاعب.
أولاً ، قم بإنشاء مادة للخلفية. ارجع إلى مستعرض المحتوى وافتح
Materials \ M_Background . ثم قم بتوصيل الثابت
(0.5 ، 0.5 ، 0) مع
اللون المنبعث .
ملاحظة: كما هو الحال مع مادة الجسيمات ، يجب أن يكون لأي مادة نلتقطها نموذج تظليل غير مضاء .
انقر فوق
تطبيق وأغلق المادة. ارجع إلى
BP_Mannequin ، ثم قم بإنشاء مكون
طائرة جديد. سمها
الخلفية .
بعد ذلك ، قم بتعيين الخصائص التالية:
- الموقع: (0 ، 0 ، -5000). نضع الطائرة منخفضة جدًا بحيث لا تتداخل مع أي جزيئات.
- مقياس: (100 ، 100 ، 1). لذا نقيس إلى حجم يكفي لتغطية منطقة الالتقاط بالكامل.
- المواد: M_Background
كما هو الحال مع الجسيمات ، سيكون من الغريب أن يرى اللاعب طائرة صفراء ضخمة تحتها. لإخفائه ، قم بتشغيل
التقديم \ المالك لا ترى .
الآن بعد أن قمنا بإعداد الخلفية ، حان الوقت لالتقاط الجسيمات. يمكننا القيام بذلك عن طريق إضافة نظام جسيمات إلى قائمة
العرض فقط لالتقاط المشهد. هذه قائمة بالمكونات التي ستلتقط التقاط المشهد.
استخدام قائمة العرض فقط
قبل أن نتمكن من الإضافة إلى قائمة العرض فقط ، نحتاج إلى طريقة للحصول على جميع الجهات الفاعلة التي تؤثر على العشب. طريقة واحدة للحصول عليها هي استخدام
العلامات . العلامات هي سلاسل بسيطة يمكن تعيينها للجهات الفاعلة والمكونات. ثم يمكنك استخدام عقدة
Get All Actors With Tag للحصول على جميع الممثلين بالعلامة المقابلة.
نظرًا لأن ممثل اللاعب يجب أن يؤثر على العشب ، فهو يحتاج إلى علامة. لإضافة علامة ، انقر فوق الزر
Class Defaults . ثم قم بإنشاء علامة جديدة في
Actor \ Tags وقم
بتسميتها GrassAffector .
نظرًا لأنه يمكن نقل
المكونات فقط إلى قائمة العرض فقط ، نحتاج إلى إضافة علامات إلى
المكونات التي تؤثر على العشب. حدد مكون
GrassParticles وأضف علامة جديدة موجودة في قسم
العلامات .
اسمها GrassAffector أيضًا (
ليس من الضروري استخدام هذه العلامة). كرر نفس الشيء لمكون
الخلفية .
نحتاج الآن إلى إضافة مكونات مؤثرة على العشب إلى قائمة العرض فقط لالتقاط المشهد. انقر فوق
ترجمة وإغلاق
BP_Mannequin . ثم افتح
المخططات \ BP_Capture . انتقل إلى
Event BeginPlay وأضف العقد المميزة. تأكد أيضًا من توصيل المسامير المحددة.
ستقوم هذه الدائرة
بالتكرار عبر جميع الممثلين بعلامة
GrassAffector . وبعد ذلك ستتحقق مما إذا كان الممثل لديه مكونات بهذه العلامة وإضافتها إلى قائمة العرض فقط.
بعد ذلك ، نحتاج إلى إخبار التقاط المشهد باستخدام قائمة العرض فقط. حدد مكون
SceneCapture وانتقل إلى قسم
التقاط المشهد . تعيين
وضع التقديم البدائي لاستخدام قائمة ShowOnly .
انقر فوق "
ترجمة" وإغلاق المخطط. إذا قمت بالنقر فوق
تشغيل ، فسترى أن هدف العرض يلتقط الآن الجسيمات ومستوى الخلفية فقط.
في القسم التالي ، نصل إلى ما كنا نتوقعه. حان الوقت لتعليم العشب للانحناء!
ثني العشب
نحتاج أولاً إلى عرض هدف التجسيد على العشب. انتقل إلى مجلد
المواد وافتح
M_Grass . ثم قم بإنشاء العقد المبينة أدناه. قم بتعيين النسيج إلى
RT_Capture .
نظرًا لأننا أعادنا توزيع الألوان في الفاصل الزمني من 0 إلى 1 ، قبل استخدامها ، نحتاج إلى إعادة توزيع الألوان في الفاصل الزمني من -1 إلى 1. للقيام بذلك ، أضف العقد المميزة:
الآن لدينا اتجاه الانحناء ، نحن بحاجة إلى طريقة لتدوير العشب في هذا الاتجاه. لحسن الحظ ، هناك عقدة تسمى
RotateAboutAxis لهذا الغرض. لنقم بإنشائه.
لنبدأ مع جهة الاتصال
NormalizedRotationAxis . كما يوحي الاسم ، هذا هو المحور الذي يدور حوله الرأس. للحساب ، نحتاج فقط إلى
منتج متجه لاتجاه الانحناء بمقدار
(0 ، 0 ، -1) . للقيام بذلك ، نحتاج إلى إضافة العقد المحددة:
نحتاج أيضًا إلى تحديد
RotationAngle ، أي مقدار دوران الرأس بالنسبة إلى نقطة الدوران. بشكل افتراضي ، يجب أن تكون القيمة بين 0 و 1 ، حيث 0 هي 0 درجة و 1 هي 360 درجة. للحصول على زاوية الدوران ، يمكننا استخدام طول اتجاه الانحناء ، مضروبًا في أقصى دوران.
الضرب بحد أقصى للتدوير
0.2 يعني أن أقصى زاوية دوران هي
72 درجة.
حساب
PivotPoint أصعب قليلاً ، لأن شبكة واحدة من العشب تحتوي على عدة سيقان. هذا يعني أنه لا يمكننا استخدام شيء مثل عقدة موضع
الكائن ، لأنها ستعيد نقطة واحدة لجميع سيقان العشب.
من الناحية المثالية ، يجب عليك استخدام محرر ثلاثي الأبعاد تابع لجهة خارجية لحفظ النقاط المحورية داخل قنوات الأشعة فوق البنفسجية. ولكن بالنسبة لهذا البرنامج التعليمي ، فإننا نقترب من النقطة المحورية. يمكن القيام بذلك عن طريق الانتقال من الأعلى إلى الإزاحة المعينة.
للقيام بذلك ، أضف العقد المحددة:
في هذا البرنامج التعليمي ،
يبلغ ارتفاع العشب حوالي
80 وحدة ، لذلك قمت بتعيين هذه القيمة لـ
PivotOffset .
بعد ذلك ، نحتاج إلى أداء قناعين. يضمن القناع الأول أن جذر الجذع لن يتحرك. يضمن القناع الثاني عدم وجود مجال ناقل يعمل على العشب خارج منطقة الالتقاط.
إخفاء
في هذا البرنامج التعليمي ، قمت بتعيين ألوان قمم العشب بحيث تكون القمم السفلية سوداء والقمم العلوية بيضاء.
لإخفاء الجذور ، نقوم ببساطة بضرب نتيجة
RotateAboutAxis في عقدة
Vertex Color .
لإخفاء العشب خارج منطقة الالتقاط ، نضرب النتيجة السابقة بالعقدة المحددة:
انقر فوق
تطبيق وأغلق المادة. انقر فوق
تشغيل وركض عبر العشب لترك آثار الأقدام عليه!
إلى أين أذهب بعد ذلك؟
يمكن تنزيل المشروع النهائي
من هنا .
على الرغم من أن الطريقة الموضحة في البرنامج التعليمي تعمل بشكل رائع مع الأشياء البسيطة مثل العشب ، إلا أنها لا تكفي عند استخدام الأشياء التي تتطلب المزيد من الديناميكية. الحل الجزئي للمشكلة هو استخدام النسخ المادية لأوراق الشجر. راجع
هذا المنشور حول أوراق الشجر التفاعلية لمزيد من المعلومات.
وأخيرًا ، أود أن أشكر Deathrey من مجتمع Unreal Engine من أجل نصيحة طريقة الجزيئات هذه!