سؤال

أنا خلق بسيطة 2D تطبيق OpenGL ولكن يبدو لي أن تكون تعاني من بعض قضايا كاميرا.عندما رسم مستطيل في (20,20) فإنه يتم رسمها في (25,20) أو نحو ذلك.عندما أرسم في (100, 20) فإنه يتم رسمها في 125 أو نحو ذلك.لبعض الأسباب كل ما يجري تحويلها إلى الحق قبل بضعة %.

يجب لصق قلصت إلى أسفل نسخة هنا http://pastebin.com/m56491c4c

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

شكرا مقدما.

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

المحلول

تحتاج إلى تعيين مصفوفة الإسقاط داخل تشكيل وظيفة (resize()) أيضا تلقائيا يحل مشكلة للمستخدم تغيير حجم النافذة:

void resize(int w, int h)
{
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  gluOrtho2D(0, w, h, 0);
}

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

void draw()
{
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();
  ...
}

مشاكل أخرى مع الكود الخاص بك:

  • وربما كنت لا ينبغي أن تكون الدعوة glutPostRedisplay() في نهاية draw().هذا هو الذهاب إلى جعل وحدة المعالجة المركزية الخاصة بك تشغيل في 100%.يمكنك بدلا من ذلك استخدام glutTimerFunc() لا تزال لدينا بعض التحديثات كل عدد المللي ثانية.
  • في processMouse(), أنت باستخدام wsprintf() على مجموعة من chars: wsprintf() يأخذ مجموعة واسعة من الشخصيات (wchar_t) ، لذلك يجب أن تجعل المتغير المحلي s من نوع wchar_t[], أو استخدام sprintf() و MessageBoxA() بدلا من wsprintf() و MessageBoxW() (التي MessageBox() يوسع كما ماكرو عند ترجمة Unicode التطبيق الذي أفترض أنك تفعل).أنت أيضا عرضة تجاوز سعة المخزن المؤقت -- يجب استخدام المخزن مؤقت لا يقل عن 12 حرفا ، على الرغم من واقعية لن تكون مرت كبير جدا x القيمة.أخيرا, يجب عليك أيضا استخدام snprintf()/wsnprintf() بدلا من sprintf()/wsprintf() حماية ضد تجاوز سعة المخزن المؤقت.

نصائح أخرى

ويبدو أنك تدعو glOrtho2D الخاصة بك على مصفوفة ModelView الخاص بك. أشك في أن هذه هي المشكلة (منذ أعتقد في هذه الحالة، يجب أن يكون الإسقاط الخاص بك الهوية)، ولكن يجب أن لا يزال يطلق عليه في مصفوفة الإسقاط بدلا من ذلك.

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

وذلك يعتمد على ما النظام الذي تعمل عليه، ولكن عادة معظم النوافذ تنسيق أنظمة تبدأ في أسفل الزاوية اليسرى وعد إلى أعلى وإلى اليمين. في هذه الحالة دعوة gluOrth02D الخاص بك سيكون من الخطأ.

ولديك:

gluOrtho2D(0, appWidth, appHeight, 0);

والذي لديه أعلى تعيين النافذة إلى أسفل، نائب الآية.

ومعظم الوقت انها:

gluOrtho2D(0, appWidth, 0, appHeight);

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

ومجرد شيء آخر للتحقق من فقط في حال تؤثر الشوائب.

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