أود أن أوضح أكثر ما قاله الأخ الشمري بخصوص عمليات transformation، في العالم ثلاثي الأبعاد، لا يمكن التحريك بطريقة مباشرة (أي player.x += amount) لأن الأشكال عبارة عن مثلثات لها رؤوس ذات إحداثيات ثابتة (لا يمكن لـ OpenGL أو Direct3D تغييرها تلقائياً).
هنالك طريقتان عمليتان لتنفيذ الـ transformation:
1. تحديث إحداثيات كل رأس يدوياً كل إطار، وهي طريقة سيئة برأيي، لأن هنالك أشياء لا يمكن عملها بسهولة مثلconcatenation
2. استخدام مصفوفات التحويل من ما يؤدي إلى ترك مهمة الـ transformation لـ OpenGL/Direct3D وكارد الشاشة، وذلك بالطبع هو الحل المثالي الذي يبدو إننا نسير بإتجاهه. :)
ما سيحصل إن كارد الشاشة سيتولى عملية ضرب مصفوفة التحويل (إضافة إلى مصفوفات أخرى) بكل رأس يتم رسمه، أي تحريك وتدوير وتحجيم تلك الرؤوس حسب تلك المصفوفة، ويقوم بذلك بسرعة كبيرة مقارنة بالمعالج المركزي الذي ليس لديه الوقت للقيام بهكذا عملية خاصة عندما يكون عدد الرؤوس كبيراً (في الأنظمة الجزيئية particle systems مثلاً).
بخصوص الهيكل الفعلي لـ Matrix فلا مشكلة بالنسبة لي سواءاً column-major أو row-major، يمكن التحويل بينهم بسهولة كما تفضلتم.
@ محمد علاء:
بالنسبة لتحجيم الصورة وعلاقتها بوضوح الصورة (أو الإكساء عملياً) ففي العالم ثلاثي الأبعاد، تلك مهمة سيتولاها كارد الشاشة أيضاً، عن طريق ميزة الفلترة filtering، سواءاً عند التكبير أو التصغير أو الدوران.
الشمري كتب:- سؤال :هل هناك فرق بين عملية ضرب نقطة في مصفوفة أو متجه في مصفوفة .. transformVector أو transformPoint .
في حالة النقطة، حاصل الضرب يحسب بطريقة مباشرة.
في حالة المتجه، فالعملية تبدو أصعب، وجدت هذه الصفحة من كتاب التي تتحدث عن الموضوع من وجهة نظر رياضية، هل هنالك طريقة أبسط؟
معلومات إضافية:
- مقالة أعجبتني تشرح بشكل تطبيقي كيفية استخدام المصفوفات للتحويل على فلاش (نفس المبدأ تماماً).
- شرح التحويل على كارد الشاشة، الفصل الرابع من كتاب The Cg Tutorial.
