السلام عليكم.
هناك الكثير من التطورات في هذه المحاولة , وهذا شيء مبشر الحقيقة
تابع وحاول ان تصقل مهارات وتنمي خبراتك عن طريق القراءة , فلو كانت إنجليزيتك جيدة أنصحك بالإطلاع على هذه الكتب :
Mathematics for 3D Game Programming and Computer Graphics
Programming Game AI by Example - يعلم برمجة الذكاء الاصطناعي و يعالج أساليب برمجية مهمة في برمجة الألعاب
Beginning Game Level Design - كتاب بسيط وصغير ويناقش مواضيع عامة في رسم وبناء المراحل .
نعود لموضوعنا الأساسي ..
لاحظت في لعبة ثاوزند آرمز أن الشخصية تستطيع السير في ثمانية اتجاهات , الاتجاهات الأربع بالإضافة للاتجاهات الفرعية :
لم ألعبها من قبل لكن فقط مجرد استنتاج من مشاهدتي للفيديوهات الجيم بلاي .
أظن أن مطوري اللعبة استخدموا نظام التحكم هذا لكي يتفادوا أخطاء أخرى من الممكن أن تنتج في حالة كان دوران الشخصية حراً , مثل صورة السبرايت والتصادمات ..
لكن الشيء الجذاب هنا هو أن لكل زاوية صورة سبرايت خاصة بها فيصبح السبرايت اقرب للموديل ثلاثي الأبعاد , فلكل زاوية معينة صورة سبرايت , وهذا يعطي للعبة طابعا مميزاً .
ساحاول أن احاكي هذا الأسلوب في رسم السبرايت حسب الزاوية التي تنظر الكاميرا بها للشخصية .
بداية , لابد أن تكون لدينا صور للشخصية من ثمانية جهات , أمام - خلف - يمين - يسار - زاوية أمامية لليسار وأخرى لليمين و زاوية من جهة الخلف لليسار وأخرى لليمين .
في اعتقادي , يتم حساب الزاوية بين موقع الشخصية وموقع الكاميرا استناداً إلى احداثيات العالم << تذكر حساب المثلثات :
العلاقة الرياضية التالية تعطينا الزاوية بين نقطتين بالنسبة للإحداثيات العالم , نستطيع معرفة مقدار تلك الزاوية ولكن بشرط ان تكون احداثيات النقطتين معلومة (لنعتبر ان احداثيات الكاميرا هي X1, Z1 واحداثيات الأوبجيكت X2,Z2 )
atanfull (X2 - X1 , Z2-Z1 ) = Angle
, ان لم تستوعب العبارة السابقة انظر الصورة :
لاحظ الخط الممتد بين الـ Camera والـ Object شكّل زاوية مع المحور السيني ..
atanfull عبارة عن دالة ستجدها بالتاكيد ضمن مكتبة البرمجيات في المحرك الذي تعمل عليه .
لاحظ هنا أنني استخدمت احداثي الـ X و Z لأننا في عالم ثلاي الأبعاد .
الخطوة التالية هي تحديد اي صورة سيتم استخدامها . سنقوم بإجراء مقارنة لتحديد اي واحدة سنختارها .
ولكي نقوم بتلك المقارنة , سنقارن قيمة الـAngle التي حصلنا عليها باستخدام دالة atanfull بعدة قيم ثابته هي قياسات لزوايا .
هذه القيم هي عبارة عن تقسيم الـ 360 درجة الخاصة بالدائرة إلى ثمانية أقسام متساوية كل زاوية منها قياسها 45 درجة , موضحة في هذه الرسمة :
واستناداً لقيم هذه الزوايا , سنقارن قيمة الـ Angle بها ثم نحددد أي صورة تستخدم كإكساء لأوبجيكت الشخصية :
لكن هنا تظهر مشكلة جديدة !
المشكلة هي ان الطريقة السابقة لا تأخذ بعين الاعتبار زاوية دوران الشخصية , بمعنى أن شخصيتنا لو قامت بالدوران حول محورها فلن يؤثر ذلك في قيمة الـ Angle التي استخرجناها سابقاً لأنها تعتمد فقط على موقع الشخصية , وتذكر أيضاً اننا نحتاج لجعل المسطح الذي نقوم بإكسائه بصورة الشخصية مواجه للكامير , أي يدور دائما لمواجهة الكامير , وهذه مشكلة أخرى سأتطرق لها لاحقاً .
طيب , ماذا نفعل مع مشكلة الدوران تلك ؟
ببساطة , الحل هو ان نستخدم الاحداثيات المحلية للشخصية ..
ما هي الاحداثيات المحلية ؟! انظر الصورة :
لنعتبر أن المستطيل هو شخصيتنا , نلاحظ أن للشخصية مستوى احداثي خاص بها يتأثر بدوران الشخصية .
نستطيع تحويل الاحداثيات العالمية إلى احداثيات محلية بمعلومية زاوية الشخصية واحداثياته عن طريق المعادلة التالية :
وبهذا تكون لدينا احداثيات متأثرة بالدوران .
وبالتالي , بدلاً من استخدام الاحداثيات العالمية للكاميرا والشخصية سنستعمل الاحداثيات المحلية لكليهما باستخدام المعادلة السابقة .
نأتي للمشكلة الأخرى , الآن نحن ملزمون بجعل المسطح (المكسو بسبرايت الشخصية) مواجه دائماً للكامير وفي نفس الوقت نسمح له بالدوران ..
من الحلول المقترحه هي انشاء مجسم وإخفاءه ونجعل الاعب يتحكم في مشيه ودورانه , ثم نقوم بإنشاء المسطح الذي سيحمل صورة الشخصية ونحدّث موقعه بحيث يكون دائما في نفس احداثيات المجسم .
طبعاً انا متأكد ان شرحي مربك ومعقد , ربما لأن الفكرة في رأسي ولم أطبقها بعد , ولم أتأكد من صحتها .. لكن على الأقل اعطيتك فكرة عن كيفية عمل تلك الانظمة مثل ثاوزند آرمز .
سأحاول ان اعيد الشرح ولكن بعد ان اطبق الفكرة بنفسي , ولو نجحت بإذن الله سأقوم بشرحها بالتفصيل الممل ..