الفصل الأول: الجاذبية والتصادمات

قمنا في الوحدات السابقة بمحاكاة الجاذبية عن طريق استخدام ارتفاع مرجعي لسطح الأرض، ومن ثم تحريك العناصر بمرور الوقت نحو هذا المرجع. أما في هذه الوحدة فسنقوم باستخدام المحاكي الفيزيائي الخاص بمحرك Unity لتحقيق هذا الغرض. المكوّنان الأساسيان في عملية المحاكاة الفيزيائية في Unity هما مكوّن التصادم Collider ومكوّن الجسم الصلب Rigid Body. لعل الأول مألوف لنا كونه كان متواجدا في كافّة كائنات الأشكال الأساسية التي نضيفها للمشهد، فلو تفحّصت نافذة الخصائص عند اختيار كائن كرة ستجد مكوّن التصادم Sphere Collider كما في الشكل 43، بينما تجد Box Collider في حالة المكعب وهكذا.

الشكل 43: مكوّن التصادم Sphere Collider

الشكل 43: مكوّن التصادم Sphere Collider

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

الشكل 44: مكوّن الجسم الصلب

الشكل 44: مكوّن الجسم الصلب

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

لإضافة مكوّن الجسم الصلب إلى كائن ما، قم باختيار الكائن من الهرمية ومن ثم اذهب للقائمة Component > Physics > Rigid Body.

الشكل 45: مشهد بسيط لاستعراض بعض خصائص الأجسام الصلبة

الشكل 45: مشهد بسيط لاستعراض بعض خصائص الأجسام الصلبة

أولى الخصائص التي سنتعرف عليها هي مقاومة الهواء Drag، وبناء عليها يتم حساب كمية الحركة التي يمكن للجسم أن يقوم بها بعد انتهاء تأثير كافّة القوى الخارجية عليه. بزيادة هذه القيمة تزيد المقاومة التي يتعرض لها الجسم خلال حركته، مما يجعل فقدانه للسرعة يتم في وقت أقصر وبالتالي لا يلبث أن يتوقف عند زوال المؤثر. حتى نرى تأثير هذه المقاومة، لنعطي الكرات الأربع قيما مختلفة لها ولتكن 0.1 للكرة العلوية ومن ثم 0.15 و 0.2 و 0.25 لما يليها من كرات بالترتيب. إذا شغلت اللعبة الآن ستجد أن الكرات الأربع تسقط بفعل الجاذبية على المنحدر وتنزلق أسفله قبل أن تبدأ بالحركة على المسار. هذه الحركة ستظهر بوضوح تأثير مقاومة الهواء حيث سنرى أن الكرة ذات المقاومة الأقل ستستمر في الحركة إلى أن تسقط عن حافّة المسار، بينما تتوقف الكرات الأخرى بعد قطع مسافات متفاوتة تبعا لمقاومة كل منها. نتيجة هذه الحركة تظهر في الشكل 46 كما يمكنك تجربتها في المشهد scene13 في المشروع المرفق.

الشكل 46: تأثير مقاومة الهواء على حركة الكائنات. انتبه إلى أن الكرات العلوية ذات مقاومة هواء أقل من السفلية

الشكل 46: تأثير مقاومة الهواء على حركة الكائنات. انتبه إلى أن الكرات العلوية ذات مقاومة هواء أقل من السفلية

ثاني الخصائص المهمّة في مكوّن الجسم الصلب هو الكتلة Mass. كما نعرف فالكتلة تتناسب طرديا وبشكل خطي مع الوزن، وهذا الأخير هو القوة التي تجذب بها الأرض الأجسام نحو مركزها. تذكر دائما أن الوزن يمثل قوة الجذب ولا علاقة له بسرعة الجذب. لنرى ذلك على أرض الواقع (أو لنقل أرض الواقع الافتراضي) لنقم ببناء مشهد كالذي في الشكل 47، والذي يحتوي على أربعة مكعبات ذات كتلة تساوي 0.25 أي 250 جراما لكل منها، بالإضافة لأربع كرات متفاوتة في الكتلة ولتكن 10 للعلوية ومن ثم 7.5 و 5 و 1 لباقي الكرات بالترتيب نحو الأسفل.

الشكل 47: مشهد يستعرض تأثير الكتلة على الجسم الصلب

الشكل 47: مشهد يستعرض تأثير الكتلة على الجسم الصلب

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

الشكل 48: محددات الحركة والدوران على الجسم الصلب

الشكل 48: محددات الحركة والدوران على الجسم الصلب

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

الشكل 49: تأثير كتلة الجسم الصلب، لاحظ أن الكرات ذات الكتلة الأكبر في الأعلى أزاحت المكعبات لمسافة أبعد

الشكل 49: تأثير كتلة الجسم الصلب، لاحظ أن الكرات ذات الكتلة الأكبر في الأعلى أزاحت المكعبات لمسافة أبعد

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

الشكل 50: المشهد المستخدم لدراسة التعامل مع التصادمات من خلال البريمجات

الشكل 50: المشهد المستخدم لدراسة التعامل مع التصادمات من خلال البريمجات

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

 

1. using UnityEngine;
2. using System.Collections;
3. 
4. public class ColorBall : MonoBehaviour {
5.  
6.  //لون الكرة
7.  public Color color;
8.  
9.  void Start () {
10.         renderer.material.color = color;
11.     }
12.     
13.     void Update () {
14.     
15.     }
16.     
17.     //تقوم هذه الدّالة بمعالجة التصادمات مع الأجسام الأخرى
18.     void OnCollisionEnter(Collision col){
19.         //قم بتغيير لون الجسم الآخر الذي تم التصادم معه
20.         col.collider.renderer.material.color = color;
21.     }
22.     
23.     //تقوم هذه الدّالة بمعالجة التصادم مع المحفّزات
24.     void OnTriggerEnter(Collider col){
25.         col.renderer.material.color = color;
26.     }
27. }

السرد 40: البريمج الخاص بمعالجة التصادمات بين الكرة وغيرها من الكائنات

يسمح لنا هذا البريمج باختيار لون من نافذة الخصائص ويقوم بإسناد هذا اللون لخامة الكرة عند بداية التشغيل. لنقم مثلا بتحديد أربع ألوان مختلفة لهذه الكرات، كالأحمر والأصفر والأخضر والأزرق. لدينا دالّتان في البريمج خاصتان بمعالجة التصادمات، وكل واحدة منهما تختص بنوع مختلف من هذه التصادمات. الدّالة الأولى وهي ()OnCollisioEnter والتي يتم استدعاؤها حين تصطدم الكرة مع كائن آخر يحمل مكوّن التصادم. عند استدعاء هذه الدّالة يتم تزويدنا بمتغير من نوع Collision والذي أسميناه هنا col، هذا المتغير يحتوي على معلومات تهمنا عن التصادم الحاصل، والتي من أهمها الكائن الآخر الذي وقع التصادم معه والذي نصله من خلال col.collider. في حالة هذا البريمج كل ما نقوم به ببساطة هو تغيير لون الخامة الخاصة بالكائن الآخر بحيث تصبح مطابقة للون الكرة. الأمر نفسه ينطبق على ()OnTriggerEnter والتي يتم استدعاؤها عند التصادم مع محفّز، وهو في هذه الحالة اللوح العلوي. نظرا لأن التصادم مع المحفّز لا يترتب عليه أية آثار فيزيائية على الكائنات المتصادمة، فلا نحتاج معلومات مفصلّة عن التصادم كما هو الحال مع ()OnCollisionEnter بل يكفينا أن نعرف بحدوثه. لهذا نلاحظ أن المتغير المزوّد للدالة هنا مختلف وهو من نوع Collider، أي هو ببساطة مرجع مباشر لمكوّن التصادم في الكائن الآخر أي المحفّز. ما نقوم به هنا أيضا هو تغيير لون خامة الكائن ليطابق لون الكرة.

بقيت خطوة أخيرة قبل تشغيل اللعبة وهو جعل سرعات السقوط للكرات الأربع متباينة، بحيث تصطدم بالألواح في أوقات مختلفة مما يسمح لنا برؤية التأثير على لون اللوح. يمكن تغيير سرعة السقوط بتغيير قيمة مقاومة الهواء Drag على جميع الكرات، حيث كلما زدنا القيمة قلت سرعة السقوط. الشكل 51 يعرض لقطة للمثال أثناء تشغيل اللعبة، ويمكن معاينة المثال أيضا في المشهد scene15 في المشروع المرفق.

الشكل 51: معالجة التصادمات برمجيا عن بتغيير الألوان

الشكل 51: معالجة التصادمات برمجيا عن بتغيير الألوان

السابقالتالي

تعليقات واستفسارات