J'appelle actuellement Trace (méthode ci-dessous) à partir d'une boucle de jeu. À l'heure actuelle, tout ce que j'essaie de faire, c'est d'obtenir les coordonnées du monde à partir de la souris de l'écran pour pouvoir déplacer des objets dans l'espace du monde. Les valeurs que j'obtiens de gluUnProject sont cependant; me déroutant. J'utilisais glReadPixel (...) pour obtenir la valeur Z mais cela produisait peu ou pas de mouvement dans l'objet que je dessinais et le vecteur résultant finissait par être le même que l'emplacement de mes caméras (à l'exception de la minuscule décimale changements dus au mouvement de la souris), j'ai donc décidé de me débarrasser de l'appel et de remplacer la valeur Z par 1.Problèmes de coordonnées mondiales avec gluUnProject()
Ma question est la suivante: Le code suivant vous semble-t-il correct? Tous les exemples que j'ai pu voir sont soit identiques, soit très similaires, mais je n'arrive pas à produire des résultats corrects, même si je verrouille l'axe Y. Si le code est correct, alors je devine que je n'utilise pas correctement le vecteur résultant. Ne devrais-je pas être en mesure de dessiner un objet ou un point directement avec le vecteur résultant ou dois-je faire quelque chose d'autre avec lui, comme normaliser? Le mode de rendu actuel est GL_RENDER et j'utilise glFrustum avec une valeur NearZ de 1 et une valeur FarZ de 2048 pour créer une perspective. Il y a aussi une série de viewports créés avec des ciseaux, avec une taille et une largeur de 512x768 et positionnés dans chaque coin d'une fenêtre 1024x768. La trace (...) est appelée entre le rendu de la fenêtre supérieure gauche et est la seule projection perspective, tandis que les autres fenêtres sont orthographiques. FOV est mis à 45.
void VideoWindow::Trace(int cursorX, int cursorY)
{
double objX, objY, objZ;//holder for world coordinates
GLint view[4];//viewport dimensions+pos
GLdouble p[16];//projection matrix
GLdouble m[16];//modelview matrix
GLdouble z;//Z-Buffer Value?
glGetDoublev (GL_MODELVIEW_MATRIX, m);
glGetDoublev (GL_PROJECTION_MATRIX,p);
glGetIntegerv(GL_VIEWPORT, view);
//view[3]-cursorY = conversion from upper left (0,0) to lower left (0,0)
//Unproject 2D Screen coordinates into wonderful world coordinates
gluUnProject(cursorX, view[3]-cursorY, 1, m, p, view, &objX, &objY, &objZ);
//Do something useful here???
}
Des idées? Editer: J'ai changé la valeur de winZ à 0.5 au lieu de 1 ce qui donne un vecteur plus raisonnable mais dessiner un point ne correspondait toujours pas à la souris. J'ai découvert que la valeur de view [3] était 384 ce qui est correct pour la fenêtre que j'utilise mais je l'ai remplacé par 768 (la taille réelle de la fenêtre) et le point a suivi la souris à 100%. Une autre expérimentation révèle que je ne peux pas utiliser les coordonnées pour se déplacer autour d'un objet 3D dans l'espace du monde en perspective en utilisant ces coordonnées, mais déplacer l'objet 3D dans l'espace orthographique fonctionne bien.
Après avoir regardé le didacticiel NEHE sur gluUnProject, il m'a semblé que le didacticiel était identique à celui que j'avais, en utilisant glReadPixel.J'ai décidé de revenir sur mon code et d'utiliser glReadPixel et tout semble fonctionner correctement. –