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

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

السلام عليكم.
 
سؤال بسيط ولكني قضيت أكثر من ساعتين دون الوصول لحل صحيح 🙁  (حالة خمول عقلي).
 
السؤال باختصار، لدينا متجه <0,0,0>، المطلوب حساب قيم زوايا دوران أويلر (Eular) الازمة لتدوير مجسم بحيث ينطبق على المتجه السابق.
 
الخطوة الأولى التي يمكننا البدء منها هي حساب الزوايا بين المتجه المطلوب ومحاور الإحداثيات العامة (Global Coordinates) كالتالي:
أ- حساب ناتج الضرب الشعاعي (dot product) بين المتجه المعطى v والمتجه الواحدي لكل محور عام.
ب- حساب معكوس تمام جيب (arc cosine) القيمة الناتجة من الخطوة أ.
 
بحل الخطوتين أ و ب نحصل على ثلاث زاويا بين المتجه المعطى v والمتجهات العامة X, Y, Z.
 
الآن السؤال هنا، هو كيف يمكننا استنتاج زوايا دوران أويلر من الزوايا الثلاثة التي تم حسابها؟

http://www.twitter.com/homambahnassi
Co-founder @INFramez - Enterprise TecArt @EpicGames

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

السلام عليكم

أعتذر عن الرد السريع، لكن أعتقد أن الاجابة عن السؤال موجودة في هذه الصفحة
http://www.gamedev.net/community/forums/topic.asp?topic_id=399701
وبالتحديد في الرد Bob Janova وفي الرد التالي له من jyk

وأعتقد وكما أشاء البعض في المقالة السابقة أنه يمكن أن نحصل على مصفوفة دوران تمثل الدوران لهذا المتجه، ومن ثم نحول المصفوفة إلى قيم أويلر
أعتقد الصفحة 121 وما بعدها والصفحة 196 وما بعدها في كتاب
3D Math Primer For Graphics And Game Development - Fletcher Dunn and Ian Parberry.pdf
يقدمان شرحاً وافياً لكيفية بناء مصفوفة الدوران وكيفية التحويل منها إلى صيغة أويلر

لم أجرب أي من هذه الطرق
وأرجوا أن تخبرنا بما توصلت إليه 😄

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

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

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

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

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

في 05 يناير 2011 09:39 ص، غمغم وسام البهنسي باستغراب قائلاً:

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

متجه الأصل مفهوم ضمنياً من مشاركتي الأولى عندما ذكرت آلية حساب الزوايا بين المتجه المطلوب والمتجهات العامة. أي وبشكل صريح متجه الأصل هو مرة الـ X الموجب ومرة Y ومرة الـ Z.
 

بتاريخ 05 يناير 2011 09:39 ص، قطب وسام البهنسي حاجبيه بشدة وهو يقول:

بعد تحديد متجه الأصل، تستطيع استنتاج زوايا الدوران بين المتجه الذي ترغب ومتجه الأصل باستخدام الإسقاط وعكس تمام الجيب. تستطيع بهذه الطريقة الحصول بسهولة على زاويتي الدوران لأويلر X و Y.

قد يكون هذا أحد الحلول وفي حال استخدامها لا داعي لاعتبار 3 حالات مختلفة لمتجه الأصل. يكفي افتراض محور واحد (Y+) مثلاً. لكن ما كنت أبحث عنه هو طريقة رياضية للتحويل بين:
قيم الزاوايا الناتجة بين المحاور العامة (X+,Y+,Z+) والمحور المطلوب V بطريقة الجداء الشعاعي (dotProduct) -> ودوران أويلر.

http://www.twitter.com/homambahnassi
Co-founder @INFramez - Enterprise TecArt @EpicGames

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

بتاريخ 02/صفر/1432 12:42 م، قطب همام البهنسي حاجبيه بشدة وهو يقول:

متجه الأصل مفهوم ضمنياً من مشاركتي الأولى عندما ذكرت آلية حساب الزوايا بين المتجه المطلوب والمتجهات العامة. أي وبشكل صريح متجه الأصل هو مرة الـ X الموجب ومرة Y ومرة الـ Z.

كلا هذا ليس ما أعنيه بمتجه الأصل. سأحاول مرة أخرى. لنفس المتجه v الذي تودّ معرفة قيم الدوران له، لو وجدنا أن قيم دوران أويلر له هي 0،0،0... فإلى أين يؤشر v؟ ما هو اتجاهه؟ هذا هو متجه الأصل.
 
حساباتك كلها ستصبح نسبية بين هذين المتجهين فقط (لا أكثر): v و متجه الأصل.
 
لنفرض أننا نريد دوران أويلر بترتيب XYZ الشائع، وأن متجه الأصل هو الـ Z الموجب، فإن الخوارزمية تصبح كالآتي:
 
 
1- نضع القيمة صفر للإحداثي X للمتجه v. ونسمي هذا المتجه الجديد vX.
 
2- إن كان طول vX صفراً فإن قيمة دوران أويلر هي 0،90،0 أو 90- بحسب إشارة الإحداثي X لـ v، وتنتهي المسألة.
 
3- إجعل طول vX ناظمياً.
 
4- نطبق معكوس جيب التمام على الجداء الداخلي بين متجه الأصل و vX. الناتج هو زاوية X من دوران أويلر. بقي لنا Y.

5- نضع القيمة صفر للإحداثي Y للمتجه v. ونسمي هذا المتجه الجديد vY.
 
6- إن كان طول vY صفراً فإن قيمة دوران أويلر في المحور Y غير هامة، ويفضل وضعها صفراً، وتنتهي المسألة.
 
7- إجعل طول vY ناظمياً.
 
8- نطبق معكوس جيب التمام على الجداء الداخلي بين متجه الأصل و vY. الناتج هو زاوية Y من دوران أويلر.
 
(ملاحظة: لقد عدلتُ الخوارزمية بعد إرسالها أول مرة، فأرجو تجاهل ما قد تقرؤه في رسالة البريد الإلكتروني المؤتمتة)
 
كما قلتُ سابقاً، الزاوية Z من الدوران ستكون دائماً صفر، لأنها تعني فتل المتجه v حول نفسه، وهذه الخاصية لا يحملها المتجه عادة. في بعض التمثيلات الخاصة يتم استخدام طول المتجه كمقدار لدورانه حول نفسه، لكنك لم تذكر أنك بهذا الصدد.
 
 
بالمناسبة، هذه الخوارزمية مفيدة جداً لمن يريد توجيه المجسمات لأي اتجاه يريدونه. في لعبة قريش مثلاً، عندما تريد الوحدة أن تتحرك لنقطة ما فإننا نقوم أولاً بحساب متجه الحركة، نجعل طوله ناظمياً، ثم نطبق الخوارزمية أعلاه لحساب دوران أويلر وذلك كي نبني مصفوفة الدوران التي ستستخدم لتوجيه مجسم الشخصية لتقابل اتجاه السير.
 
أعتقد أننا نستخدمها أيضاً في عبر السدم 😒

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