الشبكة العربية لمطوري الألعاب

خبير مدير وسام البهنسي مشاركة 1

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

وسام البهنسي
مبرمج في إنفيديا وإنفريمز

مبتدئ  عمّار حرفوش مشاركة 2

بالنسبة للحركة الدائرية سهلة نسبيا حيث يمكن حساب مكان الاشياء بواسطة الـ Sin و Cos
اما الاشكال الاخرى اما اعتماد اشكال هندسية معينة يمكن حسابها رياضياً ... او عمل ايديتور لرسم الشكل الهندسي ثم حساب مواقع الكائنات اعتماداً عليه

و اقترح ان تكون الحركة في لعبتنا لا تقتصر على التحرك من نقطة لنقطة كما في اللعبة الاصلية (تنتقل بشكل فجائي) بل تكون ناعمة غير محددة.

محترف  انس مشاركة 3

السلام عليكم.


في 05 يوليو 2010 12:12 ص، قال وسام البهنسي بهدوء وتؤدة:

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



في 05 يوليو 2010 12:12 ص، عقد وسام البهنسي حاجبيه بتفكير وقال:

* مقطع الأنبوب لا يشكل بالضرورة حلقة مغلقة، وإنما قد يكون شريطاً ينتهي بطرفين.

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

اظنه نظام كشف تصادم بين نقطتين، اود ان اشير الى انني مبتدء في عالم البرمجة الالعاب الثلاثية الابعاد لهذا ما طرحته فكرة عن الحل ( و هذا هو هدف الموضوع 😄 ).



وفي 05 يوليو 2010 12:12 ص، قال وسام البهنسي متحمساً:

* اللاعب يضغط "يمين" لتحريك المركبة "يميناً" و "يسار" لتحريكها "يساراً". علينا أن نعرف ما هو يمين ويسار الحركة عندما تكون الحركة في حلقة.

هل تقصد هذه الحالة ؟
 

 





وفي 05 يوليو 2010 12:12 ص، ظهر شبح ابتسامة على وجه وسام البهنسي وهو يقول:

* الحل يجب أن يأخذ بعين الاعتبار أن الرسامين سيصممون الأنابيب كنماذج ثلاثية الأبعاد. أحدها هو المثال الذي نراه في اللعبة الآن.

لم استوعب هذه النقطة هل ممكن توضيحها اكثر من فضلكم ؟

مبتدئ  بلال بوزيــــــــاني مشاركة 4

السلام عليكم .


في 05 يوليو 2010 02:41 م، عقد انس حاجبيه بتفكير وقال:

اود ان اشير الى انني مبتدء في عالم البرمجة الالعاب الثلاثية الابعاد

لاعليك أخي انس فأنا كذلك مبتدإ  في هذه الأمور , لاكن هذه فرصة لاتعلم و الإستفادة خاصة حركة المركبات  , أمر جد رائع. 



وفي 05 يوليو 2010 02:41 م، قال انس متحمساً:

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

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

- فاما عن المسار فلا اعرف الطريقة في تمثيلة , ربما هو عبارة عن مجموعة احداثيا أو شيء أخر. 
 

وفي 05 يوليو 2010 01:12 ص، ظهر شبح ابتسامة على وجه وسام البهنسي وهو يقول:

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



أما في 05 يوليو 2010 01:12 ص، فقد تنهد وسام البهنسي بارتياح وهو يرد:

اللاعب يضغط "يمين" لتحريك المركبة "يميناً" و "يسار" لتحريكها "يساراً". علينا أن نعرف ما هو يمين ويسار الحركة عندما تكون الحركة في حلقة

- هنا حسب رأيي ان المركبة تمثل بمتجه  (Vector) نفترض ان يتجه دائما لليميـــــــن , يكون دائما موازيا لاضلع المتواجدة فيه المركبة .
 
هذا ما بدا لي مبدأيا حسب العلم القليل جدا الذي  عندي راجيا التصحيح لي في أخطائي التصورية .

خبير مدير وسام البهنسي مشاركة 5

وفي 05 يوليو 2010 12:12 ص، أعرب وسام البهنسي عن رأيه بالموقف كالآتي:

* الحل يجب أن يأخذ بعين الاعتبار أن الرسامين سيصممون الأنابيب كنماذج ثلاثية الأبعاد. أحدها هو المثال الذي نراه في اللعبة الآن.


في 24/رجب/1431 08:41 ص، قال انس بهدوء وتؤدة:

لم استوعب هذه النقطة هل ممكن توضيحها اكثر من فضلكم ؟

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



في 24/رجب/1431 12:13 م، عقد بلال بوزيــــــــاني حاجبيه بتفكير وقال:

- من مظهر الانبوب من اللعبة الاصلية انه لا يتغير في نفس المرحة من اللعبة , فلكل مرحلة شكل معين يعني ان كان دائري الشكل يبقى كذلك الى نهاية المرحلة .

بالضبط. الأنبوب ذو مقطع ثابت لا يتغير. لكن لكل مرحلة في اللعبة أنبوب ذو شكل مختلف. 


وفي 24/رجب/1431 12:13 م، قال بلال بوزيــــــــاني متحمساً:

اما بالنسبة انه ليس منتظماً , فمهما كان شكله , يبقى مضلعي حتى لو كان دائري ,   من هنا يظهرلي حسب علمي المتواضع انه يمكن و الله أعلم ان
نستخرج المسارات الممكنة لكل انبوب في مرحلة معينة برمجيا

تفكير سليم! أحسنت! أنتم الآن على الطريق الصحيح... ☺    لكن هذا لا يكفي. يجب أن ندخل في التفاصيل أكثر. كيف ستستخرجون المسار من مجسم الأنبوب؟ وممّا سيتألف هذا المسار؟

وسام البهنسي
مبرمج في إنفيديا وإنفريمز

مبتدئ  بلال بوزيــــــــاني مشاركة 6

السلام عليكم .
 
بدت لي فكرة ان شاء الله تكون صحيحة
 
- الأنبوب يتكون من وجهين , وجه أمامي الذي ستتواجد فيه مركبة اللاعب و وجه مقابل حيث تأتي منه مركبات الأعداء , و كذلك يتكون من أروقة على طول الأنبوب  التي تستعملها مركبات الاعداء للهجوم.
الوجه الاول متكون من رؤوس التي تمثل مسار  مركبة اللاعب, كذلك الوجه المقابل يتكون من رؤوس كل رأس يقابل نظيره في الوجه الأخر التي بها تحدد الاروقة.
السؤال كيف نتحصل على رؤوس الوجه الامامي و رؤوس الوجه المقابل , وكيف نعرف كل رأس نظيره في الوجه المقابل ليتضح لنا اروقة الانبوب ؟
 
- شكل الانبوب  (Model) يتكون من أنسجة (Meshes) , نفترض انه يتكون من نسيج واحد ,  و كل نسيج يتكون من Vertex Buffer الذي يحوي الرؤوس و من Index Buffer الذي يحوي ترتيب الرؤوس و تموقعها في النسيج.
 
الحل نستعمل Index Buffer للحصول ما نريد  , الوجه الأمامي , الخلفي و أروقة :
 
1- النسيج يتكون من صفوف و أعمدة ( يمكن ان يتكون من صف واحد كالانبوب المثال الموجود في المشروع ) , يجب ان نعرف عدد الرؤوس في الوجه.
هنا يجب ان نقرأ من Index Buffer فهرس بعد فهرس حتى نصل لاول فهرس مكرر , هنا نعرف اننا وصلنا الى ما يسما ب Degenerate triangles و هي تقنية تمكنا للاستمرار الى الصف التالي , و هنا مجموع عدد الفهارس على 2 تعطي لنا عدد الرؤوس في الوجه (لا نعد الفهرس المتكرر).
2- الفهارس التي يكون موقعها فردي هي رؤوس الوجه ابتداء من الفهرس 0 ( نفترض انه الوجه الامامي ).
3- الوجه المقابل  نفس العملية نستعملها , إلا اننا نبدأ من الاخير بالنسبة لل Index Buffer في حالة وجود اكثر من صف وإلا الفهارس التي يكون موقها زوجي هي تمثل الوجه المقابل , هنا يجب ان نعرف عدد الصفوف.  
4- الان لدينا رؤوس الوجه الأمامي و رؤوس الوجه المقابل كل رأس يقابل نظيره , وهكذا لدينا الأروقة.
 
- طبعا هذي فكرة خطرت تحتاج الى أرائكم  , تحتاج الى تدقيق اكثر  مثلا هل اول عنصر من Index buffer يمثل رأس الوجه الأمامي او المقابل , هنا الاحداثية Z لارؤوس ربما تعطينا هذي المعلومة .
 
لا ادري ان شرقت و غربت بعيدا عن الحل ام لا 😳
 
اخوكم بلال.

محترف  انس مشاركة 7

السلام عليكم.

 وجدت المعلومات التالية في ملف fbx:


 Vertices: -5.68186950683594,0,3.00994205474854,-5.68186950683594
           ,10,3.00994205474854,1.1351226568222,0,-3.45005440711975,1.1351226568222
           ,10,-3.45005440711975,-5.31220293045044,0,-2.5250928401947,-5.31220293045044,10
           ,-2.5250928401947,-6.19507265090942
           ,0,1.14669096469879,-6.19507265090942,10,1.14669096469879
           ,-6.07431745529175,0,-0.763883650302887,-6.07431745529175
           ,10,-0.763883650302887,-2.30413746833801,0,-4.7773723602294
           ,-2.30413746833801,10,-4.77737236022949,-4.02443265914917

PolygonVertexIndex: 28,0,1,-30,14,2,3,-16,8,4,5,-10,0,6,7
                   ,-2,6,8,9,-8,12,10,11,-14,4,12,13,-6,10,14,15,-12,22,16,17,-24,20,18,19,-22,2
                   ,20,21,-4,18,22,23,-20,26,24,25,-28,16,26,27,-18,24,28,29,-26

Edges: 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,16,18,20,21,
       22,23,24,26,28,30,32,33,34,35,36,37,38,39,40,42,44,46,48,49,50,51,52
        ,54,56,58



و بما ان شكل الانبوب يكون موحدا يكفي معرفت توزيع الرؤوس الاولى او النهائية حسب تموضع الشكل.

بعد تحديد هذه الرؤوس، نقوم بالربط بينها بشكل خطي ينتج منه المسار المحدد الذي يمكن للمركبة ان تسلكه.طول المسار هو طول الانبوب.
(ملاحظة تواجهني متاعب في محرر النصوص 😢 )

مبتدئ  بلال بوزيــــــــاني مشاركة 8

السلام عليكم
 
الحل الذي عرضته سابقا يوحي اني جد مبتدإ  😋  , و اني انتظر التصويب منكم بكل شوق .
 
في ذلك الحل ( ليس حل صحيح 🙁 ) إفترضت ان طريقة الرسم  TriangleStrip و بنيت الفكرة من دراستي ل DirectX من كتب gameinstitute حول انشاء قطع أرض برمجيا أو بالأحرى إنشاء نسيج  (patch) .
 
لذلك كانت الفكرة غريبة ,  إلا اني أحتاج الى تعقيباتكم و توجيهاتكم ☺ .
 
أخوكم بلال.

خبير  أحمد عزالدين مشاركة 9

السلام عليكم

هل تسمحوا لي بالدخول  في النقاش وعرض بعض الافكار 😄

أعتقد أننا في تفكيرنا يجب أن نفكر بشكل منطقي عالي المستوى high-level بدلا من التفكير على مستوى كيفية توضع كل رأس من رؤوس المضلع داخل الـ index buffer وذلك لأننا نستخدم مجسمات مصنوعة في برامج تصميم ولا نعرف الطريقة التي يستخدمها في ترتيب الرؤوس للمجسمات التي يقوم بتخريجها
وحتى لو قمنا باستيراد المجسمات في صيغة ملفات fbx فأعتقد أنه لا ينبغي أن نقوم بفحص محتويات ملفات الـ fbx يدوياً لفهم طريقة تركيبها وان كانت هذه الامور تتم بمعايير محددة الان standard

أعتقد أنه يفضل أن يتوجه تفكيرنا في اتجاهين:
1- هل يمكن أن يقوم مصمموا المجسمات بوضع معلومات خاصة في بعض رؤوس المجسمات مما يساعدنا على تحديد أي الرؤوس تمثل الوجه الامامي أو الخلفي للمجسم أياً كان توضعه؟
- أيضاً يجب أن نرتب تفكيرنا بحيث يجب أن يكون مركزاً حول فهم كيفية استخراج الرؤوس الوجه الامامي أو الخلفي للمجسم بالشكل الذي نحتاجه وفي الخطوة القادمة نفكر في كيفية بناء مسار يربط بين النقاط المكونة لهذه الاوجه بالشكل الذي يناسبنا - غالباً بالـ spline وأشياء مشابهة لـ bezier curve لبناء المنحنيات وتحديد مجموعة نقاط عليها
2- لاحظت أنه اذا كان توضع المجسم صحيحاً كما في يظهر شكلة أثناء اللعب "دائما" ، فإن الرؤوس القريبة الينا تمثل الوجه الامامي بأقل قيم للـ z value
بينما الرؤوس التي تمثل الوجه الخلفي تمثل الرؤوس الابعد منا وتكون غالباً بأعلى قيمة للمكون z value ، وذلك بفرض أننا نستخدم نظام احداثيات حيث يكون المحور z هو محور العمق ويزيد كلما دخلنا في الشاشة

بالطبع اذا أردنا الحرية الكاملة على رؤوس المجسمات فلن يكون ذلك الا بالتعاون بين المصممين وبين المبرمجين وبعد فهم الملف الذي يحتوي على نماذج المجسمات وكيفية توصيفها ، ولكنى أعتقد أن ذلك يكون في حالات نادرة

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

أحمد عزالدين
طالب دراسات عليا
جامعة كالجري

محترف  انس مشاركة 10

السلام عليكم.


في 08 يوليو 2010 01:01 م، قال ahmed ezz بهدوء وتؤدة:

هل تسمحوا لي بالدخول  في النقاش وعرض بعض الافكار
و هل هناك من يرفض مساعدة من هم اكثر خبرة ☺ ؟ اظن اننا لا نسمح، لكننا نرجو مثل مساعدتك 😄 .


يرجى مراعاة قلة خبرتي في ما اقدمه في المناقشة .
ساحاول مناقشة الافكار التالية :

في 08 يوليو 2010 01:01 م، عقد ahmed ezz حاجبيه بتفكير وقال:

1- هل يمكن أن يقوم مصمموا المجسمات بوضع معلومات خاصة في بعض رؤوس المجسمات مما يساعدنا على تحديد أي الرؤوس تمثل الوجه الامامي أو الخلفي للمجسم أياً كان توضعه؟

صراحة هل هذا مهم ؟ اقصد معرفة الوجه الامامي او الوجه الخلفي. بما ان الشكل متماثل اي ان الواجهة الامامية مماثلة للواجهة الخلفية.اذا الا يكفي معرفة احدى الواجهتين لنمعرفة الاخرى ؟


وفي 08 يوليو 2010 01:01 م، قال ahmed ezz متحمساً:

- أيضاً يجب أن نرتب تفكيرنا بحيث يجب أن يكون مركزاً حول فهم كيفية استخراج الرؤوس الوجه الامامي أو الخلفي للمجسم بالشكل الذي نحتاجه وفي الخطوة القادمة نفكر في كيفية بناء مسار يربط بين النقاط المكونة لهذه الاوجه بالشكل الذي يناسبنا - غالباً بالـ spline وأشياء مشابهة لـ bezier curve لبناء المنحنيات وتحديد مجموعة نقاط عليها
فكرت في فحص ملف المجسم لاستخراج الرؤوس، و اذا كانت هذه طريقة غير مرغوب فيها، هل يمكننا معرفة الرؤوس الموجودة على محور معين  ؟


وفي 08 يوليو 2010 01:01 م، ظهر شبح ابتسامة على وجه ahmed ezz وهو يقول:

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

هل يمكننا ان نحدد مكان رسم المجسم حيث يكون الرسم انطلاقا من Z=0، هكذا نبحث عن الرؤوس بنفس قيمة z لتحددي مجموعة النقط الممثلة للمسار


أما في 08 يوليو 2010 01:01 م، فقد تنهد ahmed ezz بارتياح وهو يرد:

هناك المزيد لاشارككم به في القريب ان شاء الله
شكرا جزيلا على المساعدة.