Students Save 30%! Learn & create with unlimited courses & creative assets Students Save 30%! Save Now
Advertisement
  1. Game Development
  2. Programming
Gamedevelopment

دعونا نبني محرك رسومات ثلاثية الأبعاد: Spaces and Culling

by
Difficulty:IntermediateLength:MediumLanguages:
This post is part of a series called Let’s Build a 3D Graphics Software Engine.
Let's Build a 3D Graphics Engine: Linear Transformations
Let's Build a 3D Graphics Engine: Rasterizing Line Segments and Circles

Arabic (العربية/عربي) translation by Hamdan Veerlax (you can also view the original English article)

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

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

يمكنك أيضًا الحصول على مساعدة إضافية على Envato Studio ، حيث يمكنك الاختيار من بين مجموعة واسعة من خدمات تصميم 3D عالية الجودة  من مزودي الخدمات ذوي الخبرة.

3D Design Modeling services
3D تصميم * خدمات النمذجة على Envato ستوديو

خلاصة

أولاً ، دعنا نلقي نظرة على الفصول الدراسية التي أنشأناها حتى الآن:

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

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

ولكن قبل أن نتمكن من الوصول إلى كل ذلك ، يجب أن نتحدث أولاً قليلاً عن الإعدام.


لندن Culling

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

إن القيام بذلك يقلل بشكل كبير من استنزاف محركك على ذاكرة النظام ، وذلك برسم ما يمكن للاعب فعلاً رؤيته ، بدلاً من نقطة كاملة في العالم. في محركنا ، سنقوم بذلك عن طريق تعيين المعلمات لمساحة العرض.

سيتم تحديد مساحة العرض الخاصة بنا عبر جميع المحاور الثلاثة التقليدية: x و y و z. سيتكون تعريف x من كل شيء بين حدود النافذة اليسرى واليمنى ، وسيتضمن تعريفها y كل شيء بين أعلى حدود النافذة والسفلية ، وسيكون تعريف z الخاص بها بين 0 (حيث تم تعيين الكاميرا) ومساحة العرض الخاصة باللاعب (من أجل عرضنا ، سنستخدم قيمة تعسفية قدرها 100).

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


يمكننا الحصول على بعض الكاميرات هنا؟

مع هذا الفهم الأساسي للإعدام ، يمكننا أن نستنتج أن صفنا سيبدو هكذا ، حتى الآن:

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

أولاً ، سوف نريد وظيفة يمكن استدعاؤها خارجياً من الفصل الذي سيجذب المشهد. تقوم هذه الوظيفة بالدوران عبر كل نقطة موجودة ، ومقارنتها بمعلمات اجتثاث الكاميرا ، ورسمها إذا كان ذلك ممكنًا.

ViewFrustum
المصدر: http://en.wikipedia.org/wiki/File:ViewFrustum.svg

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


إدارة النقاط

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

بعد إضافة ذلك إلى الفصل ، ستبدو نظرة عامة أساسية عن الكاميرا كما يلي:

مع هذه الإضافات ، دعونا نحسن قليلاً على البرنامج الذي قمنا به في المرة السابقة.


أكبر وأفضل الأشياء

سنقوم بإنشاء برنامج بسيط لرسم النقاط ، مع نموذج البرنامج الذي أنشأناه في المرة السابقة كنقطة بداية.

في هذا التكرار للبرنامج ، سنضيف في استخدام فئة الكاميرا الجديدة. عند الضغط على المفتاح D ، سيقوم البرنامج بإعادة رسم الشاشة بدون الاستبعاد ، وعرض عدد الكائنات التي تم عرضها في الزاوية العلوية اليمنى من الشاشة. عند الضغط على المفتاح C ، سيقوم البرنامج بإعادة رسم الشاشة بإعدامها ، وكذلك عرض عدد الكائنات المقدمة.

دعونا نلقي نظرة على الكود:

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


خاتمة

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

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

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.