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

Skip to content

تحسين المحاكاة والأداء باستخدام محلل فيزيائي متقدم

في منتصف عام 2015، كشفت Roblox عن ترقية كبيرة لمحرك الفيزياء الخاص بها: محلل الفيزياء Projected Gauss-Seidel (PGS). في العام الأول، كان المحلل الجديد اختياريًا وقدم دقة محسنة وأداءً أفضل مقارنةً بمحلل الزنبرك المستخدم سابقًا.

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

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

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

لا يزال محرك الفيزياء قيد التحسين والتحسين من أجل الأداء، ونخطط لإضافة ميزات جديدة في المستقبل المنظور.

تطبيق قوانين الفيزياء

الهدف الرئيسي لمحرك الفيزياء هو محاكاة حركة الأجسام في بيئة افتراضية. في محرك الفيزياء الخاص بنا، نهتم بالأجسام الصلبة التي تصطدم ببعضها البعض وتخضع لقيود متبادلة.

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

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

اتخاذ خطوات صغيرة

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

drift.gif

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

الحل

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

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

استراتيجيات التخفيف

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

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

  1. البدء الدافئ: البدء بالحل من خطوة زمنية سابقة لزيادة معدل تقارب المحلل التكراري
  2. ما بعد التثبيت: إعادة إسقاط النظام إلى متعدد القيود لمنع انحراف القيود
  3. التنظيم: إضافة الامتثال للقيود لضمان وجود حل فريد
  4. التحضير المسبق: استخدام حل دقيق لنظام فرعي خطي، مما يحسن استقرار الآليات المعقدة

الاستراتيجيات 1 و 2 و 3 تقليدية إلى حد كبير، لكننا قمنا بتحسين الاستراتيجية 3 وإتقانها. أيضًا، على الرغم من أن الاستراتيجية 4 ليست غير معروفة، إلا أننا لم نر أي تطبيق عملي لها. نستخدم طريقة تحليل أصلية لمصفوفات القيود المتفرقة الكبيرة وطريقة جديدة فعالة لدمجها مع PGS. التنفيذ الناتج أبطأ قليلاً فقط مقارنةً بـ PGS الخالص، لكنه يضمن حل النظام الخطي الناتج عن قيود المساواة بدقة. وبالتالي، لا تتأثر قيود المساواة إلا بالانحراف الناتج عن تقطيع الزمن. توجد تفاصيل حول طرقنا في عرضي التقديمي في GDC 2020. حاليًا، نبحث في الطرق المباشرة المطبقة على قيود عدم المساواة والتصادمات.

الحصول على مزيد من التفاصيل

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

نحن نستخدم الصيغة الثانية لأنها أقل تقييدًا وتتطلب رياضيات وتنفيذًا أبسط بكثير.

يستخدم محرك Roblox طرقًا تحليلية لحساب الاستجابة الديناميكية للقيود، على عكس طرق العقوبة التي كانت تُستخدم من قبل. تم تقديم الطرق التحليلية لأول مرة في Baraff 1989، حيث تُستخدم لمعالجة كل من قيود المساواة وعدم المساواة بطريقة متسقة. لاحظ Baraff أنه يمكن صياغة نموذج التلامس باستخدام البرمجة التربيعية، وقدم طريقة حل تجريبية (وهي ليست الطريقة التي نستخدمها في محللنا).

بدلاً من استخدام الصياغة القائمة على القوة، نستخدم صياغة قائمة على الدفع في فضاء السرعة، والتي قدمها في الأصل Mirtich-Canny 1995 وحسّنها Stewart-Trinkle 1996، والتي توحد معالجة أنواع التلامس المختلفة وتضمن وجود حل للتلامس مع الاحتكاك. في كل خطوة زمنية، يتم الحفاظ على القيود والتصادمات من خلال تطبيق تغييرات لحظية في السرعات بسبب نبضات القيود. يوجد تفسير ممتاز لسبب تفوق المحاكاة القائمة على الدفع في عرض GDC الذي قدمه Catto في عام 2014.

يتم نمذجة التلامسات الخالية من الاحتكاك باستخدام مشكلة التكاملية الخطية (LCP) كما هو موصوف في Baraff 1994. يُضاف الاحتكاك كإسقاط غير خطي على مخروط الاحتكاك، متداخلًا مع تكرارات Projected Gauss-Seidel.

يتم حل الانحراف العددي الذي يسبب أخطاء في المواقع في القيود باستخدام تقنية ما بعد التثبيت باستخدام السرعات الزائفة التي قدمها Cline-Pai 2003. ويتضمن ذلك حل LCP ثانية في فضاء المواقع، والتي تعيد إسقاط النظام إلى متعدد القيود.

يتم حل LCPs باستخدام PGS / Impulse Solver الذي شاع استخدامه بواسطة Catto 2005 (انظر أيضًا Catto 2009). هذه الطريقة تكرارية وتأخذ في الاعتبار كل قيد على حدة بالتسلسل وتحلها بشكل مستقل. عبر العديد من التكرارات، وفي الظروف المثالية، يتقارب النظام إلى حل شامل.

بالإضافة إلى ذلك، يتم حل مشكلات نسبة الكتلة العالية في قيود المساواة عن طريق تهيئة PGS مسبقًا باستخدام التحليل LDL المتفرق لمصفوفة قيود المساواة. يتم تفريغ المصفوفات الفرعية الكثيفة لمصفوفة القيود باستخدام طريقة نسميها Body Splitting. وهذا مشابه للتحليل LDL المستخدم في Baraff 1996، ولكنه يسمح بأنظمة ميكانيكية أكثر عمومية، ويحل النظام في فضاء القيود. لمزيد من المعلومات، يمكنك الاطلاع على عرضي التقديمي في GDC 2020.

تتبع بنية المحلل الخاص بنا فكرة Guendelman-Bridson-Fedkiw، حيث يتم فصل خطوات السرعة والموضع عن طريق حل القيود. تسلسلنا الزمني هو:

  1. تقدم السرعات
  2. حل القيود في فضاء السرعة وفضاء الموقع
  3. تقدم المواقع

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

يعد كتاب Erleben 2005، الذي أصبح متاحًا مجانًا مؤخرًا، مرجعًا ممتازًا لمحاكاة الأجسام الصلبة. يمكنك العثور على محاضرات عبر الإنترنت حول الرسوم المتحركة القائمة على الفيزياء، ومدونة لـ Nilson Souto حول بناء محرك فيزيائي، وعرض تقديمي ممتاز في GDC لـ Erin Catto حول طرق الحل الحديثة، ومنتديات مثل Bullet Physics Forum و GameDev التي تعد أماكن ممتازة لطرح الأسئلة.

في الختام

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

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

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

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