سؤال

أنا في خضم كتابة محرك ثلاثي الأبعاد وعثرت على خوارزمية LookAt الموضحة في وثائق DirectX:

zaxis = normal(At - Eye)
xaxis = normal(cross(Up, zaxis))
yaxis = cross(zaxis, xaxis)

 xaxis.x           yaxis.x           zaxis.x          0
 xaxis.y           yaxis.y           zaxis.y          0
 xaxis.z           yaxis.z           zaxis.z          0
-dot(xaxis, eye)  -dot(yaxis, eye)  -dot(zaxis, eye)  l

الآن فهمت كيف يعمل على جانب التدوير، لكن ما لم أفهمه تمامًا هو سبب وضع مكون الترجمة للمصفوفة ليكون تلك المنتجات النقطية.بفحصها قليلاً، يبدو أنها تضبط موضع الكاميرا بمقدار صغير بناءً على إسقاط المتجهات الأساسية الجديدة على موضع العين/الكاميرا.

السؤال هو لماذا يحتاج للقيام بذلك؟ماذا ينجز؟

هل كانت مفيدة؟

المحلول

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

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

نصائح أخرى

لاحظ أن المثال الموضح هو مصفوفة رئيسية للصف الأيسر.

وبالتالي فإن العملية هي:الترجمة إلى الأصل أولاً (التحرك بواسطة -عين)، ثم قم بالتدوير بحيث يكون المتجه من عين ل في يتماشى مع +z:

في الأساس تحصل على نفس النتيجة إذا قمت بضرب مصفوفة التدوير مسبقًا عن طريق الترجمة -عين:

[      1       0       0   0 ]   [ xaxis.x  yaxis.x  zaxis.x 0 ]
[      0       1       0   0 ] * [ xaxis.y  yaxis.y  zaxis.y 0 ]
[      0       0       1   0 ]   [ xaxis.z  yaxis.z  zaxis.z 0 ]
[ -eye.x  -eye.y  -eye.z   1 ]   [       0        0        0 1 ]

  [         xaxis.x          yaxis.x          zaxis.x  0 ]
= [         xaxis.y          yaxis.y          zaxis.y  0 ]
  [         xaxis.z          yaxis.z          zaxis.z  0 ]
  [ dot(xaxis,-eye)  dot(yaxis,-eye)  dot(zaxis,-eye)  1 ]

ملاحظات إضافية:

لاحظ أن تحويل المشاهدة (عمدا) معكوسة:تقوم بضرب كل قمة في هذه المصفوفة "لتحريك العالم" بحيث ينتهي الجزء الذي تريد رؤيته في حجم العرض الأساسي.

لاحظ أيضًا أن مصفوفة التدوير (نسميها ر) أحد مكونات مصفوفة LookAt هو تغيير الأساس المقلوب مصفوفة حيث صفوف ر هي ناقلات الأساس الجديدة من حيث ناقلات الأساس القديمة (ومن هنا جاءت أسماء المتغيرات xaxis.x، ..المحور x هو جديد المحور x بعد حدوث تغيير الأساس).ومع ذلك، بسبب الانقلاب، يتم تبديل الصفوف والأعمدة.

وفقط بعض المعلومات العامة:

ومصفوفة lookat هي مصفوفة مواقف / تدور شيء للإشارة إلى (نظرة على) نقطة في الفضاء، من نقطة أخرى في الفضاء.

وهذه الطريقة يأخذ المرجوة "الوسط" من وجهة النظر الكاميرات، وهي "حتى" ناقلات التي تمثل الاتجاه "حتى" للكاميرا (حتى هو دائما تقريبا (0،1،0)، ولكن لم يحدث ذلك يجب أن يكون)، و "العين" ناقلات وهو موقع الكاميرا.

ويستخدم هذا أساسا للكاميرا ولكن يمكن أن تستخدم أيضا لتقنيات أخرى مثل الظلال والأضواء، الخ.

وبصراحة أنا لست متأكدا تماما لماذا يتم تعيين المكون الترجمة كما هو الحال في هذا الأسلوب. في gluLookAt (من برنامج OpenGL)، يتم تعيين عنصر الترجمة 0،0،0 منذ ينظر إلى الكاميرا كما يجري في 0،0،0 دائما.

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

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

وهكذا، فإن الجواب القصير هو أن هذا يجعل الرياضيات أسهل بكثير.

وردا على سؤال في التعليق: السبب كنت لا مجرد طرح موقف "العين" من كل شيء له علاقة مع ترتيب العمليات. التفكير في الأمر على هذا النحو: بمجرد أن تكون في إطار جديد مرجعية (أي موقف رئيس يمثله xaxis، yaxis وzaxis) التي تريد الآن للتعبير عن المسافات من حيث هذه (استدارة) إطار جديد للمرجعية. هذا هو السبب في استخدام المنتج نقطة من محاور جديدة مع موقف العين: التي تمثل نفس المسافة التي تحتاج الأمور إلى التحرك ولكنه يستخدم النظام الجديد تنسيق

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

تقوم مصفوفة البحث بهاتين الخطوتين:

  1. ترجمة النموذج الخاص بك إلى الأصل،
  2. قم بتدويره وفقًا للاتجاه الذي حدده المتجه لأعلى والمظهر
    اتجاه.

المنتج النقطي يعني ببساطة أنك تقوم بالترجمة أولاً ثم تقوم بالتدوير.فبدلاً من ضرب مصفوفتين، يقوم حاصل الضرب النقطي بضرب الصف في العمود.

ومصفوفة التحول 4X4 تحتوي شهرين الى ثلاثة عناصر هي: 1. دوران المصفوفة 2. الترجمة إلى إضافة. 3. على نطاق و(كثير من محرك لا تستخدم هذا مباشرة في المصفوفة).

والجمع بين لهم أن تحويل نقطة من الفضاء A إلى B الفضاء، وبالتالي هذا هو مصفوفة التحويل M_ab

والآن، وموقع الكاميرا في مساحة ألف وحتى لا يكون التحول صالحة لمدة الفضاء B، لذلك تحتاج إلى مضاعفة هذا الموقع مع دوران تحويل.

ويبقى السؤال الوحيد المفتوح هو السبب في النقاط؟ حسنا، إذا كنت أكتب 3 النقاط على ورقة، وكنت يكتشف أن 3 النقاط مع X، Y و Z هو بالضبط مثل الضرب مع مصفوفة التناوب.

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

وهتافات

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

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top