سؤال

باستخدام OpenGL، أحاول رسم خريطة بدائية من الحرم الجامعي الخاص بي.

هل يمكن لأي شخص أن يشرح لي كيف يتم تنفيذ الغطاء والتكبير والتناوب عادة؟

على سبيل المثال، مع بالغسل والتكبير، هل هو ببساطة أنا ضبط عرضي؟ لذلك أنا مؤامرة ورسم كل خطوطي التي تنشأ خريطتي، ثم كقرازات المستخدم والاستجباء، يقوم بضبط ViewPort الخاص بي؟

للسلطة، هل تحول قيم X / Y من Viewport الخاص بي والتكبير، فهل تزيد / تقليل رأيي من خلال بعض الكمية؟ ماذا عن التناوب؟

للتناوب، هل يجب علي القيام بتحويلات Affine لكل polyline الذي يمثل خريطة الحرم الجامعي الخاص بي؟ لن يكون هذا مكلفا للقيام بالطيران على خريطة بحجم كريم؟

أو، هل تركت Viewport نفس الشيء والطالب / التكبير / التناوب يتم في بعض الشفاء؟


على سبيل المثال، إذا ذهبت إلى هذا حلقة الوصل سترى أنه يصف بالغسل والتكبير بالضبط كيف بديتك أعلاه، عن طريق تعديل Viewport.

هل هذا غير صحيح؟

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

المحلول

إنهم يتحققون من خلال تطبيق سلسلة من أوامر GlTranslate، GlRotate (التي تمثل موضع الكاميرا والتوجيه) قبل رسم المشهد. (من الناحية الفنية، أنت تدوير المشهد بأكمله!)

هناك وظائف فائدة مثل glulookat التي تلتزم بعض التفاصيل حول هذا الموضوع.

لإرادة الأشياء، افترض أن لديك ناقلات يمثلون الكاميرا: الموضع والاتجاه.

يأخذ glulookat الموقف والوجهة وما فوق ناقل.

إذا قمت بتنفيذ فئة متجه، destinaion = position + direction يجب أن تعطيك نقطة وجهة.

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

ثم، قبل تقديم أي شيء في مكان الحادث، قم بتحميل مصفوفة الهوية واتصل Glulookat

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt( source.x, source.y, source.z, destination.x, destination.y, destination.z, 0, 1, 0 );

ثم البدء في رسم الكائنات الخاصة بك

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

مشكلة واحدة هي، إذا كان لديك ناقلات الاتجاه "فقط" إلى الأمام "كيف تحريكها؟ أين هو اليمين واليسار؟

نهجي في هذه الحالة هو مجرد أخذ المنتج الصليب من "الاتجاه" و (0،1،0).

الآن يمكنك نقل الكاميرا إلى اليسار وإلى اليمين باستخدام شيء مثل:

position = position + right * amount; //amount < 0 moves to the left

يمكنك المضي قدما باستخدام "متجه الاتجاه"، لكن IMO من الأفضل تقييد الحركة إلى طائرة أفقية، لذلك احصل على متجه الأمام بنفس الطريقة التي حصلنا عليها من المتجه الصحيح:

forward = cross( up, right )

أن نكون صادقين، وهذا هو نهج اختراق إلى حد ما.

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

نصائح أخرى

يمكن تحقيق كل هذه "الإجراءات" باستخدام وظائف تحويل مصفوفة عرض النموذج. يجب أن تقرأ عن Gltranslatef (بالغسل)، GLSCALF (ZOOM)، GLROTATF (دوران). يجب عليك أيضا قراءة بعض البرنامج التعليمي الأساسي حول OpenGL، قد تجد هذا الرابط مفيد.

عموما هناك ثلاث خطوات يتم تطبيقها عند الرجوع إلى أي نقطة في الفضاء ثلاثي الأبعاد داخل OpenGL.

بالنظر إلى نقطة محلية

  • محلي -> عالم التحويل
  • العالم -> تحويل الكاميرا
  • الكاميرا -> تحويل الشاشة (عادة ما يكون الإسقاط. يعتمد على إذا كنت تستخدم منظور أو متعامدة)

كل من هذه التحويلات تأخذ نقطة ثلاثية الأبعاد، وتضاعف مصفوفة.

عندما تقوم بتدوير الكاميرا، فإنه يتغير عموما العالم -> تحويل الكاميرا بضرب مصفوفة التحويل عن طريق تحويل التناوب / المقلاة / التكبير. نظرا لأن جميع النقاط الخاصة بك يتم إعادة تقديم كل إطار، يتم تطبيق مصفوفة جديدة على نقاطك، ويعطي مظهر دوران.

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