سؤال

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

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

فيما يلي منطقي لماذا أجد أن هذا غير متوقع ؛ ربما يمكن لشخص ما الإشارة إلى أين يعيوب تفكيري.

تخيل مصفوفة إسقاط المنظور التالي ، والتي تعطي نتائج صحيحة:

    [ a b c 0 ]
P = [ 0 d e 0 ]
    [ 0 0 f g ]
    [ 0 0 h 0 ]

ضرب هذا بواسطة إحداثيات الكاميرا يعطي إحداثيات مقطع متجانسة:

[x_c]   [ a b c 0 ]   [X_e]
[y_c] = [ 0 d e 0 ] * [Y_e]
[z_c]   [ 0 0 f g ]   [Z_e]
[w_c]   [ 0 0 h 0 ]   [W_e]

أخيرًا ، للحصول على إحداثيات الجهاز الطبيعية ، نقوم بتقسيم X_C و Y_C و Z_C بواسطة W_C:

[x_n]   [x_c/w_c]
[y_n] = [y_c/w_c]
[z_n]   [z_c/w_c]

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

شكرًا!

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

المحلول

حسنًا ، جوهره هو أن اختبار القطع يتم من خلال:

-w_c < x_c < w_c
-w_c < y_c < w_c
-w_c < z_c < w_c

الضرب حسب القيمة السلبية يكسر هذا الاختبار.

نصائح أخرى

لقد وجدت هذا الترتيب ، مما يجعل التقدم نحو الإجابة:

من الكتاب الأحمر ، التذييل G:

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

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

المرجعي: http://glprogramming.com/red/appendixg.html

أسباب يمكن أن أفكر في:

  • من خلال قلب مصفوفة الإسقاط ، لن تكون الإحداثيات ضمن طائرات Znear و ZFAR الخاصة بك في العرض (أكبر من 0).
  • لإنشاء إحداثيات النوافذ ، تتم ترجمة/تحجيم إحداثيات الجهاز الطبيعي بواسطة منفذ العرض. لذا ، إذا كنت قد استخدمت عددًا سلبيًا لإحداثيات المقطع ، فإن إحداثيات الجهاز المعتاد (مقلوب الآن) تترجم إلى إحداثيات العرض إلى إحداثيات النوافذ ... خارج نافذتك (إلى اليسار وأسفل ، إذا صح التعبير)

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

قسم الأسئلة الشائعة بين OpenGL التحولات لديه المزيد من التفاصيل.

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