سؤال

في OpenGL أحاول تدوير الكاميرا حول نقطة ما، بحيث تكون الكاميرا على مسافة r من النقطة وتواجه النقطة عندما تدور.بمعنى آخر، أريد أن تتحرك الكاميرا على طول محيط الدائرة بنصف قطر r من المركز، بحيث تواجه الكاميرا المركز عند أي نقطة على طول المحيط.

لنفترض أن مركز الدائرة في الفضاء ثلاثي الأبعاد هو (3، 0، 3)؛

لقد حاولت:

// move to center of circle    
glTranslatef(-3, 0, -3)
// move a distance away from the circle
glTranslatef(0, 0, r);
// rotate along the y "up" axis
glRotatef(CameraAngle, 0, 1, 0);

حيث CameraAngle هي الدرجات التي يتم تحريكها حول الدائرة.

والنتيجة النهائية هي أن الكاميرا لا تزال تدور على طول نقطة الأصل، وليس مركز الدائرة.هل بإمكان أي شخص مساعدتي في حل هذه المشكلة؟شكرًا!

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

المحلول

تحتاج إما إلى:

  • قم بتدوير الكاميرا حول الأصل ثم ترجمتها (*)

أو:

  • يستخدم gluLookAt لإبقاء الكاميرا موجهة إلى وسط الدائرة

(*) تدور دوال التدوير عادةً حول الأصل.للدوران حول نقطة أخرى P عليك أن:

  • ترجمة (-P)
  • استدارة
  • ترجمة (ف)

نصائح أخرى

وانها مربكة قليلا، ولكن أعتقد أن عليك أن:

// move camera a distance r away from the center
glTranslatef(0, 0, -r);

// rotate 
glRotatef(angley, 0, 1, 0);
glRotatef(anglex, 1, 0, 0);

// move to center of circle    
glTranslatef(-cx, -cy, -cz)

ملاحظة يجب أن لا يتم تغيير النظام.

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

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

والحيلة الوحيدة الممكنة هي تحديد متجه جيدة حتى - ولكن ليس عادة الكثير من العمل. إذا كان مسار ونقطة الهدف هم في نفس الطائرة، يمكنك استخدام نفس متجه لأعلى في كل مرة!

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