2008-09-22 33 views
8

üzerine çıkıntı klik Bu görünüşüdür kümesi vardır:OpenGL: geometri

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

ve bir fare tıklaması bir ekran konumu (sx, sy) olsun.

Bir z değeri verildiğinde, x ve y'yi sx ve sy'den 3d-boşlukta nasıl hesaplayabilirim? o Bu projeksiyon matrisinin değil, model görünümü matrisi de bağlıdır ne

cevap

11

Sen gluUnProject kullanmalıdır:

Birincisi, yakın düzleme "unprojection" hesaplamak:

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); 

ve sonra uzak düzleme:

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

Şimdi ettik 'un tüm olası noktalarını izleyen dünya koordinatlarında bir çizgi var. Şimdi sadece arasına sokmak gerekir: z koordinatı verilen konum varsayalım:

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; 
+0

noob yorum için özür dilerim. GluUnproject'deki üçüncü parametre her zaman aynıdır (0 ve 1) veya projeksiyon matrisini gluPerspective ile ayarlarken zNear ve zFar değerlerine bağlı mıdır? – rgngl

0

libqglviewer iyi bir seçim çerçevesine sahiptir. http://www.toymaker.info/Games/html/picking.html size yardımcı olmalıdır - D3D merkezlidir, ancak teori aynıdır.

Fare tabanlı seçim yapmak istiyorsanız, seçim oluşturma modunu kullanmanızı öneriyorum.

Düzeltme: Aklınızda bulundurun, model görünümü matrisi devreye girer, ancak sizinki kimliğinizden beri bu bir nonissue.

2

arıyorsanız eğer

3

Bu en iyi kaynak olan OpenGL's web site tarafından en iyi şekilde yanıtlanır.

+0

ziyade öğrenmek için linke tıklamak yerine yararlı olacaktır Yanıtınızda kaynağının adını koymak. – danio