आप gluUnProject
उपयोग करना चाहिए:
सबसे पहले, के पास विमान को गणना "unprojection": तो अब तक विमान को
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;
स्रोत
2008-09-23 01:24:42
नोब टिप्पणी के लिए खेद है। GluUnproject में तीसरा पैरामीटर हमेशा समान (0 और 1) कॉल करता है या यह zNear और zFar मानों पर निर्भर करता है जब हम gluPerspective के साथ प्रोजेक्शन मैट्रिक्स सेट कर रहे हैं? – rgngl