2010-09-01 1 views
0

Im utilisant gluUnProject() pour obtenir la coordonnée 2d de l'écran dans la coordonnée du monde 3D. Je prends 4 positions de chaque coin de l'écran pour obtenir la zone des objets visibles.OpenGL: Sélection de tous les points de la zone de visualisation actuelle

Comment vérifier quels points sont à l'intérieur de ce "rectangle"?, Je n'ai aucune idée sur les termes ou quoi que ce soit. L'image ci-dessous montre ce que « rectangle » ressemble à:

alt text

Répondre

0

Êtes-vous essayer de trouver quel point 3D sont visibles par une caméra? Si oui, vous trouverez peut-être des informations intéressantes sur ce site: http://www.lighthouse3d.com/opengl/viewfrustum/. Dans l'image suivante, nous pouvons voir la vue tronc et votre tronc de sélection (en rouge). Appliquer les contrôles de visibilité de tronc à votre sélection frustum devrait le même algorithme que celui utilisé pour l'abattage de troncs.

alt text

Si vous voulez une solution rapide et non optimisé:

GLdouble model_view[16]; 
glGetDoublev(GL_MODELVIEW_MATRIX, model_view); 

GLdouble projection[16]; 
glGetDoublev(GL_PROJECTION_MATRIX, projection); 

GLint viewport[4]; 
glGetIntegerv(GL_VIEWPORT, viewport); 

for(unsigned i=0; i<points.size(); ++i){ 
    GLdouble winX, winY, winZ; 
    gluProject(points[i].x, points[i].y, points[i].z, model_view, projection, viewport, &winX, &winY, &winZ); 
    if(selectionMinX <= winX && winX <= selectionMaxX && selectionMinY <= winY && winY <= selectionMaxY && winZ>=0 && winZ<=1){ 
    /// point is selected 
    } 
} 
+0

Nope, je veux juste sélectionner les objets avec la souris. Bien que je puisse l'utiliser à cette fin aussi. Mais le point est que je ne m'inquiète pas si un polygone est partiellement visible, parce que je veux vérifier seulement les positions de point. – Newbie

+0

Mais votre question: trouver les points qui sont sur mon rectangle de sélection est le même que trouver tous les objets à l'intérieur de ma vue frustum, avec la vue tronc étant une * sélection * frustum. – tibur

+0

ouais, je ne peux pas obtenir beaucoup de cet exemple depuis son utilisation des classes dont je ne sais rien. Y at-il une fonction simple n'importe où qui renvoie 1 si son intérieur et 0 si ce n'est pas? Je ne me soucie vraiment pas de la méthode de programmation speeed ou comment high tech sont utilisés. plus simple = le meilleur – Newbie

Questions connexes