برنامج OpenGL:إسقاط النقر بالماوس على الهندسة

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

  •  02-07-2019
  •  | 
  •  

سؤال

لدي مجموعة العرض هذه:

glMatrixMode(GL_MODELVIEW); //Switch to the drawing perspective
glLoadIdentity(); //Reset the drawing perspective

وأحصل على موضع الشاشة (sx, sy) من خلال النقر بالماوس.

بالنظر إلى قيمة z، كيف يمكنني حساب x وy في مساحة ثلاثية الأبعاد من sx وsy؟

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

المحلول

يجب عليك استخدام gluUnProject:

أولاً، قم بحساب "عدم الإسقاط" على المستوى القريب:

GLdouble modelMatrix[16];
GLdouble projMatrix[16];
GLint viewport[4];

glGetIntegerv(GL_VIEWPORT, viewport);
glGetDoublev(GL_MODELVIEW_MATRIX, modelMatrix);
glGetDoublev(GL_PROJECTION_MATRIX, projMatrix);

GLdouble x, y, z;
gluUnProject(sx, viewport[1] + viewport[3] - sy, 0, modelMatrix, projMatrix, viewport, &x, &y, &z);

ثم إلى المستوى البعيد:

// replace the above gluUnProject call with
gluUnProject(sx, viewport[1] + viewport[3] - sy, 1, modelMatrix, projMatrix, viewport, &x, &y, &z);

الآن لديك خط في الإحداثيات العالمية يتتبع جميع النقاط المحتملة لك استطاع لقد تم النقر على.والآن تحتاج فقط إلى الاستيفاء:لنفترض أنك أعطيت الإحداثي z:

GLfloat nearv[3], farv[3];  // already computed as above

if(nearv[2] == farv[2])     // this means we have no solutions
   return;

GLfloat t = (nearv[2] - z) / (nearv[2] - farv[2]);

// so here are the desired (x, y) coordinates
GLfloat x = nearv[0] + (farv[0] - nearv[0]) * t,
        y = nearv[1] + (farv[1] - nearv[1]) * t;

نصائح أخرى

والإجابة على هذا أفضل من المصدر الأكثر موثوقية ، موقع ويب OpenGL.

ويعتمد هذا في الواقع على مصفوفة الإسقاط، وليس مصفوفة عرض النموذج. http://www.toymaker.info/Games/html/picking.html يجب أن تساعدك - إنها تتمحور حول D3D ولكن النظرية هي نفسها.

إذا كنت تتطلع إلى إجراء انتقاء يعتمد على الماوس، فأنا أقترح استخدام وضع عرض التحديد.

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

libqglviewer لديه إطار اختيار جيد إذا كان هذا هو ما تبحث عنه

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