كيف يمكنني منع التشوه عند التدوير حول خط الرؤية في OpenGL؟

StackOverflow https://stackoverflow.com/questions/79360

  •  09-06-2019
  •  | 
  •  

سؤال

لقد قمت برسم شكل بيضاوي في مستوى XZ، وقمت بضبط منظوري للأعلى قليلاً على المحور Y والعودة إلى Z، مع النظر إلى مركز القطع الناقص من زاوية 45 درجة، باستخدام gluPerspective() لتعيين إحباط المشاهدة الخاص بي .

ellipse

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

rotated ellipse

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

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

المحلول

يبدو أنك تستخدم 1.0 كجانب عند استدعاء gluPerspective().يجب عليك استخدام العرض/الارتفاع.على سبيل المثال، إذا كان إطار العرض الخاص بك هو 640 × 480، فيمكنك استخدام 1.33333 كوسيطة العرض.

نصائح أخرى

وفقًا لمواصفات OpenGL:

void gluPerspective( GLdouble fovy,
                     GLdouble aspect,
                     GLdouble zNear,
                   GLdouble zFar )

يجب أن يكون الجانب دالة لعرض نافذتك وارتفاعها.على وجه التحديد العرض مقسومًا على الارتفاع (لكن احذر من القسمة على صفر).

ربما تستخدم 1 باعتباره الجانب الذي لا يكون دقيقًا إلا إذا كانت نافذتك مربعة.

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

اضبط نسبة العرض إلى الارتفاع على window_width / window_height، ويجب أن يبدو القطع الناقص صحيحًا.لاحظ أنك ستحتاج إلى تحديث هذا كلما تم تغيير حجم النافذة؛إذا كنت تستخدم GLUT، قم بتعيين a glutReshapeFunc وأعد حساب مصفوفة الإسقاط هناك.

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