-
Précision Z Buffer
Bonjour,
Je cherche à utiliser un Z Buffer avec un code glut pour éliminer les parties cachées de ma scène et je voudrais avoir une précision sur la distance de l'ordre du millimètre.
Le centre de ma scène se situe à environ environ 1500m (ca peut varier jusquà 5-6km) de ma caméra. La zone d'intérêt (en profondeur) est de 500m autour du centre de la scène. J'ai donc réglé le near range et le far range à respectivement 1000m et 2000m
Quelle est la précision théorique dans ce cas ?
Mes tests montrent que j'ai plus une précision de l'ordre de 10cm... Comment puis je augmenter la précision en glut ?
Merci pour votre aide
-
Bonjour,
Ce qui m'étonne c'est que vous parliez d'unité de mesure.
Il faut savoir qu'OpenGL n'utilise pas d'unité de mesure. Je ne sais pas trop comment le dire. Mais les cm dans OpenGL ne réprésente absolument rien. ( ni les mètres )
Lorsque l'on déplace un objet de 1 ( glTranslated(1,0,0) ), ce n'est ni des cm, ni des pixels ...
-
Bonjour,
Je ne savais pas à propos des unités de mesure. Merci pour l'info :)
Voilà le raisonnement (qui peut être faux) que j'ai utilisé pour faire mes tests de précision. J'ai l'impression que le raisonnement qui suit reste valable si on met des "mètres" à la place des "unités de mesure" mais je me trompe peut être.
Je me suis fabriqué un cube de 1 unité de mesure de coté en openGL centré sur (0,0,0).
J'ai placé une caméra à une distance d'environ 10000 unité de mesure du centre du cube.
J'ai calculé le Zbuffer pour obtenir ce cube sur 1 seul pixel de mon image et j'ai comparé les mesures de distance entre le centre du cube et ma caméra. Il y a une différence. Ca parait normal car après tout la facette que je regarde est plus proche de la caméra que le centre du cube.
Donc ce que j'ai fait c'est déplacer la caméra suivant un axe parallèle à une face du cube. Par rapport au centre du cube, la distance suit théoriquement une parabole. Les variations de distances le long de ma trajectoire sont de l'ordre de 1 unité de mesure (elle varie entre 9985 et 9986).
Avec le ZBuffer, j'ai toujours la même valeur : 9985.19xxx. J'ai mis le near range à 9000 et le far à 20000. Je me dis donc qu'il y a un problème de précision mais après je peux avoir mal configuré également le ZBuffer. Qu'en pensez vous ?
-
En utilisant la routine gluUnProject pour connaitre la position des points 3D à partir du ZBuffer et des coordonnées de l'image du ZBuffer, je trouve effectivement que mes points ne sont pas sur les surfaces des cubes mais à 0.1, 0.2 unité de mesure ce qui n'est pas assez précis pour mon appli :cry:
-
Je suis un peu perdu il faut dire,
mais je pense que si tu veux des trucs plus précis, il faudrait que vous changiez vos valeurs pour des floats. Pour l'instant j'ai l'impression que vous utilisez juste des ints
-
Désolé si je ne suis pas clair :oops:
Mes valeurs sont effectivement en float en non en int.
Pour mon problème, je pense avoir trouver une solution:
-Calculer la position 3D approchée du point avec gluUnproject()
-Récupérer l'indice de facette à travers le color buffer
-projeter orthogonalement le point sur la facette
de cette façon le point 3D fourni par mon Z buffer me permettra d'obtenir un point 3D sur mes facettes.
-
Salut,
C'est la méthode que j'allais te proposer... si tu dois travailler sur des valeurs précises, fait-le sur des objets gardé en mémoire et pas sur des valeurs récupérées de la fenêtre OpenGL. Donc obtenir l'objet depuis la fenêtre (point et index de facette), et aller récupérer les coordonnées associées depuis la géométrie ayant servi à construire les objets OpenGL pour travailler dessus semble être une bonne solution pour garantir la précision que tu demandes.
Pour info, un petit lien causant de la précision du Z buffer et un autre de la FAQ OpenGL