سؤال

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

في الوقت الحالي لدي رمز مثل هذا:

glPushMatrix();
  glRotatef(90.0, 0.0, 1.0, 0.0);
  glBegin(GL_TRIANGLES);        
    glVertex3f( 1.0, 1.0, 0.0 );        
    glVertex3f( 3.0, 2.0, 0.0 );        
    glVertex3f( 3.0, 1.0, 0.0 );        
  glEnd();
glPopMatrix();

لكن النتيجة ليست مثلثًا يدور بزاوية 90 درجة.

يحررحسنًا، شكرًا لمايك هابوستك - يبدو أن الكود الخاص بي كان يستدعي وظيفة SetCamera التي تستخدم glOrtho.أنا جديد جدًا على OpenGL ولا أملك أي فكرة عما يعنيه هذا ولكن تعطيل هذا والتدوير في المحور Z أنتج النتيجة المرجوة.

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

المحلول

هل تحصل على وحدة واحدة خط مستقيم؟يبدو أن 90 درجة تعفن.حول Y سوف تجعلك تنظر إلى جانب المثلث بدون عمق.

يجب أن تحاول التدوير حول المحور Z بدلاً من ذلك لترى ما إذا كنت ستحصل على شيء أكثر منطقية.

يحتوي برنامج OpenGL على مصفوفتين مرتبطتين بعرض الأشكال الهندسية، وهما ModelView وProjection.يتم تطبيق كلاهما على الإحداثيات قبل أن تصبح البيانات مرئية على الشاشة.أولاً يتم تطبيق مصفوفة ModelView، لتحويل البيانات من مساحة النموذج إلى مساحة العرض.ثم يتم تطبيق مصفوفة الإسقاط لتحويل البيانات من مساحة العرض إلى "الإسقاط" على شاشتك ثنائية الأبعاد.

يتم استخدام ModelView لوضع كائنات متعددة في مواقعها في "العالم"، ويتم استخدام الإسقاط لوضع الكائنات على الشاشة.

يبدو الكود الخاص بك جيدًا، لذا أفترض من خلال قراءة الوثائق أنك تعرف طبيعة الوظائف مثل glPushMatrix().إذا كان التدوير حول Z لا يزال غير منطقي، فتأكد من أنك تقوم بتحرير مصفوفة ModelView عن طريق استدعاء glMatrixMode.

نصائح أخرى

تأكد من قيامك بتعديل مصفوفة عرض النموذج عن طريق وضع ما يلي قبل استدعاء glRotatef:

glMatrixMode(GL_MODELVIEW);

بخلاف ذلك، قد تقوم بتعديل الإسقاط أو مصفوفة النسيج بدلاً من ذلك.

"الإجابة المقبولة" ليست صحيحة تمامًا - فالتدوير حول Z لن يساعدك على رؤية هذا المثلث إلا إذا كنت قد فعلت بعض الأشياء الغريبة قبل هذا الرمز.قد تؤدي إزالة استدعاء glOrtho(...) إلى تصحيح المشكلة في هذه الحالة، ولكن لا يزال لديك بعض المشكلات الأخرى.

مشكلتان رئيسيتان في الكود كما هو مكتوب:

  • هل قمت بوضع الكاميرا من قبل؟في OpenGL، تقع الكاميرا في نقطة الأصل، وتنظر إلى أسفل المحور Z، مع وضع الموجب Y في الأعلى.في هذه الحالة، يتم رسم المثلث في نفس مستوى عينك، ولكن للأعلى ولليمين.ما لم يكن لديك مصفوفة إسقاط غريبة جدًا، فلن تراها.يعد gluLookat() هو الأمر الأسهل للقيام بذلك، ولكن يمكن جعل أي أمر ينقل المصفوفة الحالية (والتي يجب أن تكون MODELVIEW) يعمل.

  • أنت ترسم المثلث بطريقة اليد اليسرى، أو في اتجاه عقارب الساعة، في حين أن الوضع الافتراضي لـ OpenGL هو نظام إحداثيات اليد اليمنى، أو عكس اتجاه عقارب الساعة.هذا يعني أنه إذا كنت تقوم بإعدام الوجوه الخلفية (وهو ما لا تفعله على الأرجح، ولكن من المحتمل أن تنتقل إليه كلما تقدمت أكثر)، فلن ترى المثلث كما هو متوقع.لرؤية المشكلة، ضع يدك اليمنى أمام وجهك، وتخيل أنها في المستوى X-Y، وحرك أصابعك بالترتيب الذي ترسم به القمم (1،1) إلى (3،2) إلى (3،1) ).عند القيام بذلك، يكون إبهامك متجهًا بعيدًا عن وجهك، مما يعني أنك تنظر إلى الجانب الخلفي للمثلث.أنت بحاجة إلى الاعتياد على رسم الوجوه بطريقة اليد اليمنى، لأن هذه هي الطريقة الشائعة التي يتم بها ذلك في OpenGL.

أفضل شيء يمكنني أن أوصي به هو استخدام دروس NeHe - http://nehe.gamedev.net/.يبدأون بإظهار كيفية إعداد OpenGL في العديد من الأنظمة، والانتقال إلى رسم المثلثات، والمتابعة ببطء وثبات إلى موضوعات أكثر تقدمًا.من السهل جدًا متابعتها.

عندما ألقيت نظرة أولية على OpenGL، كان دروس نيه (انظر القائمة اليسرى) كانت لا تقدر بثمن.

أود أن أوصي بكتاب:

رسومات الحاسوب ثلاثية الأبعاد:مقدمة رياضية مع برنامج OpenGL بواسطة صموئيل ر.بوس

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

فيما يتعلق بمصفوفة الإسقاط، يمكنك العثور على مصدر جيد للبدء به هنا:

http://msdn.microsoft.com/en-us/library/bb147302(VS.85).aspx

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

من المرجح أن يكون تحويل المصفوفات أحد أهم الأشياء عند العرض ثلاثي الأبعاد ويتضمن بشكل أساسي ثلاث مراحل للمصفوفة:

  • Transform1 = كائن ينسق النظام مع العالم (على سبيل المثال - دوران الكائن وحجمه)
  • Transform2 = نظام الإحداثيات العالمي للكاميرا (وضع الكائن في المكان المناسب)
  • Transform3 = تقوم الكاميرا بتنسيق النظام مع مساحة الشاشة (العرض على الشاشة)

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

استمتع

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