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

للإطلاع على الشفرة البرمجية Source Code
في هذه التدوينة سوف أشارك تجربتي في صنع اللعبة باستخدام تقنية الواقع المعزز وأتطرق لبعض المفاهيم المتعلقة بهذه التقنية.
تصاميم / مجسمات اللعبة
بالبداية سوف أتطرق للمجسمات المستخدمة في اللعبة وهي طاولة الكيرم والأقراص (أو الصول). وجدتها متوفرة بموقع 3dmdb تم تصميمها من قبل مصمم تصاميم ثلاثية أبعاد ونشرها بشكل مجاني.
التصميم يحتوي على تفاصيل جميلة وملفتة مثل الدوائر المحفورة على أقراص اللعب والجيوب الموجودة في أركان الطاولة. بعد تجهيز التصاميم ثلاثية الأبعاد أجريت عليها بعض التعديلات باستخدام برنامج Blender ثم أدرجتها في برنامج Unity وهو محرك الألعاب Game Engine المستخدم لصناعة اللعبة.

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

في هذه اللحظة لدينا جميع المعلومات لإسقاط مجسم طاولة الكيرم من ناحية المكان والزاوية. لكن يتعين علينا القيام ببعض الحسابات الخاصة بترتيب أقراص الكيرم (الصول).
طريقة ترتيب أقراص الكيرم
أقراص الكيرم لها ترتيب مميز بحيث يأتي القرص الأحمر في وسط الطاولة ثم يحيط به بقية الأقراص بشكل دائري ومتناوب (أصفر ثم أسود وهكذا). يتم تدوين إحداثيات وسط الطاولة مسبقًا وتستعمل كثابت Constant ويضاف إليها إحداثيات السطح الذي تم اكتشافه: PlaneVector + BoardCenter وكلاهما إحداثيات ثلاثية أبعاد x, y, z.

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


آلية عمل المضرب
لتسجيل نقطة في لعبة الكيرم يجب أن يُدخل اللاعب أحد الأقراص في أحد الجيوب الموجودة في الأركان الأربعة. يضرب اللاعب القرص الأساسي (الأبيض) بإصبعه ويشكل قوة تدفع المضرب للإصطدام بالأقراص الأخرى وإدخالها في أحد الجيوب. بما أننا نتعامل مع جوال وشاشة ثنائية الأبعاد علينا ابتكار طريقة لتشكيل قوة دفع للمضرب وكانت الآلية المطبقة هي السحب والإطلاق Drag & Shoot حيث يسحب المستخدم الشاشة ويظهر مؤشر لمدى قوة الإندفاع وعند رفع المستخدم لإصبعه يتم دفع المضرب نحو الإتجاه المصوب نحوه.

ويتم ذلك عبر مراقبة مدخلات الللمس Touch Events عند اكتشاف أي لمسة للمرة الأولى نقوم بتدوين احداثيات اللمسة X, Y ونطلق عليها مسمى نقطة البداية Start Position وعند اكتشاف أي لمسة أخرى نتعرف عليها كلمسة بنية التحريك Touch Move/Drag يتم حساب الفارق delta بين إحداثيات اللمسة الحالية والمدونة مسبقًا (نقطة البداية Start Position). وتكون لدينا deltaX وdeltaY الفارق على المحورين x, y وهو ما يسمى بمقدار الإزاحة.
يتم استخدام هذه القيم لشيئين الأول هو رسم المؤشر (مؤشر مدى قوة الدفع) والثاني هو حساب قوة الدفع للمضرب.
حساب الإحداثيات في العالم الحقيقي
وأخيرًا، عندما نكتشف أن المستخدم رفع إصبعه عن الشاشة، نحدد وجهة الإنطلاق وهي النقطة الموجودة في منتصف الشاشة ونطلب من محرك اللعبة Game Engine فرض قوة بمقدار الإزاحة على المضرب مما يجعله ينطلق نحو الإتجاه المحدد بمقدار الإزاحة الذي تم حسابه بناءًا على مدخلات اللمس. لكن يوجود مشكلة هنا، وهي أن إحداثيات شاشة الجوال ثنائية الأبعاد وطاولة الكيرم أصبحت جزء من العالم الحقيقي وهو ثلاثي الأبعاد، كيف سنحدد إتجاه المضرب في العالم الحقيقي؟ كيف نعرف إحداثيات النقطة المطلوبة؟
يتم ذلك عبر عملية تسمى بالRay Casting وهي عملية يقوم بها محرك اللعبة ليحدد ما إذا كان نقطة ما سوف تصطدم في مجسم معين ويحدد بذلك نقطة الإصطدام. فإذا كنا نتكلم عن لعبة إطلاق نار، يقوم محرك اللعبة بإطلاق شعاع افتراضي ray ويرى إن كان اللاعب سوف يتلقى النار ويحدد نقطة التصادم فإذا كانت في الرأس تحسب headshot.

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

احتساب النقاط
يتولى محرك اللعبة Game Engine نظام الإصطدام Collision حيث تتحرك الأقراص عند اصطدامها ببعضها أو بالمضرب عبر تعيين Collider لكل جسم من الأقراص. ويستخدم هذا النظام أيضًا في الجيوب الأربعة على أركان الطاولة حيث يتم احتساب النقاط للمستخدم عن اكتشاف تصادم ما بين أحد الأقراص والجيوب. يوفر محرك اللعبة دالة تسمى OnCollisionEnter تستدعى عند اكتشاف تصادم بين أحد الأقراص وأحد الجيوب وعندها يتم التعرف على نوع القرص ما إن كان أسود فيحتسب 5 نقاط وما إن كان أصفر فيحتسب 10 نقاط.