وسام البهنسي

مدونة مبرمج معماري

أنت والمصفوفات! (الجزء الثالث)

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

 

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

 

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

 

كمثال، انظر معي الصورة الآتية:

الإسقاط المتوازي 

بالمقابل، في الإسقاط الفراري لا يشترط أن تحافظ الخطوط على توازيها بعد الإسقاط:

الإسقاط الفراري

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

 

حسناً، لننظر الآن إلى مصفوفتي الإسقاط المتوازي والفراري لنتعرف على شكليهما:

 

0 0 0 0.050
0 0 0.067 0
0 0.010 0 0
1 0.001- 0 0
(إسقاط متوازي)
0 0 0 0.005
0 0 0.007 0
1 1.001 0 0
0 0.1- 0 0
(إسقاط فراري)

 

وهذا هو الكود لتوليد هاتين المصفوفتين:

D3DXMATRIX matOrtho,matPerspective;
D3DXMatrixOrthoLH(&matOrtho,40.0f,30.0f,0.1f,100.0f); // مصفوفة إسقاط متوازي بنافذة بأبعاد 30×40
D3DXMatrixPerspectiveLH(&matPerspective,40.0f,30.0f,0.1f,100.0f); // مصفوفة إسقاط فراري بنفس القيم أعلاه

 

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

 

هناك أنواع أخرى من المصفوفات لم نذكرها في سلسلة التدوينات هذه. مثلاً، مصفوفة الرؤية (view matrix) والتي من خلالها نستطيع أن نرى المشهد الفراغي من أي زاوية نظر ومن أي مسافة نشاء. هذه مصفوفة رؤية:

 

0

0.424-

0.424-

0.8

0

0.707-

0.707

0

0

0.566

0.566

0.6

1

7.071

0

0

 

تم بناء هذه المصفوفة بالكود التالي:

D3DXMATRIX matView;
D3DXVECTOR3 vec3Eye(3,5,-4); // موقع عين الناظر
D3DXVECTOR3 vec3At(0,0,0); // موقع هدف النظر
D3DXVECTOR3 vec3Up(0,1,0); // ناظم رأس الناظر
D3DXMatrixLookAtLH(&matView,&vec3Eye,&vec3At,&vec3Up);

 

 

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

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

 

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

 

والآن أترككم برعاية الله.

التعليقات (6) -

  • عبدالله الشمّري

    06/09/2009 04:54:34 ص | الرد

    السلام عليكم .
    هناك سؤال بسيط لا أظنه يستحق فتح موضوع عنه في المنتدى , سأستغل الفرصة وأسأل :
    هل كمبرمج ألعاب ورسوميات علي أن أعرف من أين تم استنتاج هذه المصفوفات .
    مصفوفة الاسقاط المتوازي من السهل استنتاجها تقريبا .. لكن الأمر يتعقّد بالنسبة للاسقاط المنظوري .. حينها أشعر أني فشلت في استنتاجها !

    أخي وسام .. لدي أسئلة كثيرة عن هذا الموضوع ( الاسقاط ) , هل ترى أن أضعها هنا أم في المنتدى ؟!

  • wbahnassi

    06/09/2009 01:27:42 م | الرد

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


    لدي أسئلة كثيرة عن هذا الموضوع ( الاسقاط ) , هل ترى أن أضعها هنا أم في المنتدى ؟!
    أفضل في المنتدى، حيث نستطيع أخذ راحتنا في التعبير ووضع الصور والمرفقات والكود.

  • ياسر

    05/08/2010 06:17:59 ص | الرد

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

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

  • الجزائر

    04/09/2010 06:57:07 م | الرد

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

  • rain.drop19

    01/01/2012 03:18:19 م | الرد

    السلام عليكم انا قراءت الجزء الاول والثاني بس بدي اجزاء وعمليات موسعة على المصفوفات ممكن ارسال اي شي جديد على هاد الاميل وشكرا لكم على التقديم
    الله يجعله بميزان حسانتكم
    rain.drop19@hotmail.com

  • wbahnassi

    01/01/2012 10:19:53 م | الرد

    هل تستطيع تحديد بعض من العمليات التي تريد التعرف عليها أكثر؟

أضف تعليقاً

Loading