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

دعونا نبني محرك رسومات ثلاثية الأبعاد: النقاط ، المتجهات ، والمفاهيم الأساسية

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

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

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

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

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

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

أساسيات نظم التنسيق

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

Build a 3D Graphics Engine tutorial
في الصورة: لعنة العديد من وجود طلاب المدارس الثانوية.

تعطي لنا المساحة الديكارتية ثلاثية الأبعاد محور x ، y ، و z (الذي يصف الموضع الذي يعتمد على وضع أفقي ، وضع رأسي ، وعمق على التوالي). يتم عرض إحداثيات أي نقطة داخل هذا الفراغ كتقنية (في هذه الحالة 3-tuple ، نظرًا لوجود ثلاثة محاور). على مستوى ثنائي الأبعاد ، يمكن وصف المجموعة كـ ((س ، ص) ) ، وفي المستوى ثلاثي الأبعاد ، يتم تصويره كـ ((x، y، z) ). إن استخدام هذه المجموعة الثلاث هو أنه يوضح موقع النقطة بالنسبة إلى أصل الفضاء (والذي عادةً ما يتم عرضه على أنه (0،0،0) )).

تلميح: المجموعة: قائمة مرتبة (أو تسلسل) من العناصر في علوم الكمبيوتر أو الرياضيات. لذا ، سيكون ((K، y، l، e) ) عبارة عن 4-tuple ، تظهر سلسلة من الأحرف التي تشكل اسمي.
Build a 3D Graphics Engine tutorial

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

[P = (x، y، z) ]

بالإضافة إلى هذا التعريف للنقطة ، يجب علينا تحديد أجزائه.

كل عنصر من العناصر الموجودة في هذه المجموعة الثلاث هو عبارة عن رقم قياسي يعرّف موضعًا على أساس متجه أساسي. يجب أن يكون لكل متجه أساس طول الوحدة (أي ، طوله بالضبط 1) ، بحيث لا تستطيع 3-tuples مثل ((1،1،1) ) و ((2،2،2) ) تكون متجهات أساسية لأنها طويلة جدًا.

نحدد ثلاثة نواقل أساسية لمساحتنا:

[\\ تبدأ \\ {} الانحياز
(X & = (1،0،0 \\\\
(Y & = (0,1,0\\
(Z & = (0,0,1
\\ نهاية {الانحياز} \\]

Build a 3D Graphics Engine tutorial
المصدر: https://www.thefullwiki.org/Arithmetics/Cartesian_Coordinate.

نظام الإحداثيات

الآن دعونا نتحدث عن التعريف الرياضي لنظام الإحداثيات لدينا ، وكيف يؤثر على نظام الرسومات لدينا ، والحسابات التي يمكننا القيام بها.

تمثيل النقاط

يمكن وصف نقطة أصل نظام الإحداثي الخاص بنا بالنقطة \\ (O \\) ، التي تمثل 3-tuple (0،0،0). هذا يعني أنه يمكن تصوير التمثيل الرياضي لنظام الإحداثيات لدينا على النحو التالي:

\[\{O;X,Y,Z\}\]

بموجب هذا البيان ، يمكنك القول بأن ((x، y، z) ) يمثل موضع نقطة بالنسبة إلى الأصل. يعني هذا التعريف أيضًا أنه يمكن تمثيل أي نقطة (P ) ، ((أ ، ب ، ج) ) ، على النحو التالي:

\[P = O + aX + bY + cZ\]

من الآن فصاعداً ، سأشير إلى العددية في الحالة الصغيرة والمتجهات في الحالة العليا - لذلك \\ (a \\) ، \\ (b \\) ، و \\ (c \\) هي scalars ، و \\ (X \\) ، \\ ( Y \\) ، و \\ (Z \\) هي متجهات. (هم في الواقع ناقلات الأساس التي حددناها في وقت سابق.)

وهذا يعني أنه يمكن تمثيل النقطة التي تكون مجموعتها (2،3،4) كما يلي:

[\\ تبدأ \\ {} الانحياز
(2,3,4) & = (2,0,0) + (0,3,0) + (0,0,4)\\
& = (0,0,0) + (2,0,0) + (0,3,0) + (0,0,4)\\
& = (0,0,0) + 2(1,0,0) + 3(0,1,0) + 4(0,0,1)\\
& = O + 2X + 3Y + 4Z\\
\\ نهاية {الانحياز} \\]

لذلك ، اتخذنا هذا المفهوم المجرد 'نقطة في الفضاء ثلاثي الأبعاد' وعرّفناه على أنه أربعة أشياء منفصلة مضافة معًا. هذا النوع من التعريف مهم جدا عندما نريد وضع أي مفهوم في الكود.

متعامدة بشكل متبادل

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

Build a 3D Graphics Engine tutorial

كما سيتم تعريف نظام الإحداثيات لدينا بأنه 'اليد اليمنى':

Build a 3D Graphics Engine tutorial

المصدر: http://viz.aset.psu.edu/gho/sem_notes/3d_fundamentals/html/3d_coordinates.html.

من الناحية الرياضية ، هذا يعني أن:

\[X = Y \times Z\]

... حيث تمثل \\ (\\ times \\) مشغل المنتج المتقاطع.

إذا لم تكن متأكدًا من المنتج المتقاطع ، فيمكن تعريفه بالمعادلة التالية (على افتراض أنك ستحصل على مجموعتين (3-tuples)):

\[(a,b,c) \times (d,e,f) = (bf - ce, cd - af, ae - bd)\]

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


النقاط والمتجهات

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

Build a 3D Graphics Engine tutorial

للتأكد من عدم الخلط بين الاثنين ، سأكتب النقاط بخط مائل رأسي ، مثل \\ (P \\) ، وناقلات في boldface العاصمة ، \\ \\ \\ mathbf {V} \\).

هناك نوعان من البديهيات الرئيسية التي سوف نتعامل معها عند استخدام النقاط وناقلات الأمراض ، وهي:

  • Axiom 1: الفرق بين نقطتين هو متجه ، لذلك \\ \\ \\ mathbf {V} = P - Q \\)
  • Axiom 2: مجموع النقطة والمتجه هو نقطة ، لذلك \\ (Q = P + \\ mathbf {V} \\)
نصيحة: البديهية هي نقطة تفكير ، غالبًا ما يُنظر إليها على أنها واضحة بما يكفي لقبولها دون جدل.

بناء المحرك

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

سوف تكون أمثلة الصف أدناه في pseudocode بحيث يمكنك المتابعة مع لغة البرمجة التي تختارها. فيما يلي الخطوط العريضة لطبقتنا:

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


خاتمة

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

إذا كنت تعتقد أن هذا كان ممتعًا ، فاحرص على مراجعة برنامج تعليمي التالي حول أساسيات نظام الرسومات: التحولات!

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

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.