تمت ترجمة المحتوى الموجود على هذا الموقع باستخدام الذكاء الاصطناعي (AI) أو تقنية الترجمة الآلية، وقد تحتوي على أخطاء.

Skip to content

فيزياء Roblox: بناء نظام نوم أفضل

لنتحدث عن "النوم" في محرك الفيزياء.

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

بعض المشاكل المعروفة في هذه الطريقة هي التفاعلات الفيزيائية حيث قد يكون للجسم سرعة قريبة من الصفر لبضعة إطارات، ولكنه لم ينه مساره الحالي. يمكننا التفكير في حالة بسيطة حيث تتدحرج كرة على سطح مائل بواسطة زخمها الخاص. في النهاية، تنفد الطاقة الحركية للكرة وتصل إلى قمة مسارها (بعد تحويلها بالكامل إلى طاقة كامنة عن طريق دفعها لأعلى المنحدر)، ثم تتدحرج عائدة لأسفل المنحدر. ومع ذلك، إذا كانت الكرة بطيئة بما يكفي، فستدخل في حالة السبات على المنحدر عند قمة مسارها قبل أن تتمكن من التدحرج لأسفل مرة أخرى.

إذا واجه المطور هذا النوع من الحالات الاستثنائية في لعبته، فغالبًا ما يوفر المحرك حلاً بديلاً. قد يتمكن من ضبط عتبات وقت دخول شيء ما في وضع السكون، مع التضحية بالأداء في جميع التفاعلات. أو ربما يمكنه تعطيل وضع السكون على كائن معين تمامًا. ربما يرغب فقط في تعطيل السكون على كائن لفترة زمنية معينة. في كلتا الحالتين، الأمر متروك للمطور لاكتشاف أي حالات حافة سكون يواجهها والتغلب عليها. في Roblox، أردنا إيجاد طريقة لمنع هذه الحالات السيئة تمامًا، مما يقلل من عبء العمل على المطور. الهدف هو نظام سكون لا يحتاج المطور إلى القلق بشأنه.

في محرك Roblox، تُسمى الأجسام الصلبة "مجموعات". وهي عبارة عن مجموعة من جسم أساسي واحد أو أكثر متصلة بشكل صلب، أو "أجزاء"، ولكن هذا هو الكائن الذي يكون إما مستيقظًا أو نائمًا.

يمكن ربط التجميعات بتجميعات أخرى عبر مفاصل محاكاة مثل المفصلات أو الحبال، لتشكل ما يُسمى بـ"آلية". وهذا أمر مهم لأن التجميعات يمكنها استنتاج حالة نومها بناءً على حالة التجميعات الأخرى في آليتها، وهو ما سنناقشه لاحقًا.

مثل المحركات الأخرى، كان Roblox يستخدم طريقة تجريبية تقليدية لتحديد متى تدخل الأجسام في حالة السكون. تحتفظ كل مجموعة بـ "سجل" لمواقعها واتجاهاتها السابقة، وطالما بقي الانحراف عن الموقع المتوسط ضمن الحد المسموح به، تظل المجموعة في حالة اليقظة. وبشكل أساسي، إذا كانت السرعة أقل من قيمة محددة لبضعة إطارات، تدخل المجموعة في حالة السكون. سأشير إلى هذه القيمة باسم "عتبة السرعة".

يتم تمييز التجميعات النشطة باللون الأحمر. يتم تمييز التجميعات الخاملة باللون الأسود. لا يوجد تمييز للتجميعات الثابتة.

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

كان هدفنا هو معرفة ما إذا كانت هناك معلومات أفضل من تغير موضع التجميع خلال الإطارات القليلة الماضية لتحديد ما إذا كان يجب أن يدخل في حالة السكون. لماذا لا نتبع أحد قوانين الحركة الأساسية؟ "يظل الجسم إما في حالة سكون أو يستمر في الحركة بسرعة ثابتة، ما لم تؤثر عليه قوة." نحن نعلم أن الجاذبية تؤثر على الأسطوانة، ومن المفترض أن تستمر في الدوران. نريد أن يكون الجسم مستيقظًا عندما يتحرك بسرعة ثابتة، أو عندما تؤثر عليه قوة غير متوازنة. إذا كان أي من هذين الحالتين صحيحًا، فيجب أن يظل الجسم مستيقظًا. يمكننا الحصول على قيم الدفع الأخيرة لمجموعة ما من محلل الفيزياء، ومقارنتها بعتبة دفع منفصلة.

عند زيارة المثال نفسه مرة أخرى، نرى الأسطوانة تتدحرج بشكل صحيح على المنحدر. الآن، من المستحيل أن تدخل المجموعة في حالة السكون إذا كانت تتأثر بقوة غير متوازنة. لكي تدخل المجموعة في حالة السكون، يجب أن تكون أقل من عتبة السرعة وكذلك عتبة الدفع.

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

عندما تحتوي الآلية على تجميع مستيقظ، يتم وضع جميع الجيران المباشرين لهذا التجميع في حالة "فحص" (إذا لم يكونوا مستيقظين أيضًا). تظل التجميعات في حالة "الفحص" نائمة، ولكنها تتحقق من سجل التجميع المستيقظ في كل إطار، وإذا كان انحرافه أعلى من عتبة أخرى أكبر، فإننا نقرر ببساطة أن التجميع "الذي يتم فحصه" يجب أن يستيقظ أيضًا. ويُشار إلى هذا باسم عتبة سرعة الجار.

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

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

فيما يلي عرض توضيحي لهذه الحالة. لدينا كتلتان متصلتان بحبل في حالة انعدام الجاذبية. الكتلة الكبيرة مستيقظة وتتحرك، بينما الجزء الثابت في حالة "فحص النوم". هذا صحيح، إلى أن تتحرك الكتلة الكبيرة مسافة كافية لتصبح الحبل مشدودًا.

يتم تمييز مجموعات "التحقق أثناء السكون" باللون البرتقالي.

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

كما قد تتوقع بالفعل، يمكن استخدام عتبة دافع جار جديدة لإيقاظ الجيران النائمين أيضًا. في حالة الحبل هذه، نعلم أن الكتلة تخضع لتغيير كبير في القوة الصافية بمجرد أن يصبح الحبل مشدودًا. نستخدم هذا التغيير في القوة كحدث لإيقاظ مجموعة "التحقق". في المثال، نرى أنه بمجرد أن يصبح الحبل مشدودًا، يستيقظ الجزء النائم. كل ذلك دون إجراء حسابات إضافية على الجزء النائم نفسه.

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

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

لا تصادق شركة Roblox Corporation ولا هذا المدونة على أي شركة أو خدمة ولا تدعمهما. كما لا يتم تقديم أي ضمانات أو وعود فيما يتعلق بدقة أو موثوقية أو اكتمال المعلومات الواردة في هذا المدونة.

نُشرت هذه المدونة في الأصل على مدونة Roblox Tech Blog.