2009-05-12 7 views
3

Je travaille avec les outils de traçage Qt et QWt3D, et les étend pour fournir des fonctionnalités de traçage 3-D et 2D dont j'ai besoin, donc je suis apprendre un peu d'OpenGL dans le processus.Dessiner des formes "point-like" dans OpenGL, indifférent au zoom

Je suis actuellement capable de tracer des points en utilisant OpenGL, mais seulement en tant que cercles (ou "carrés" en désactivant l'anti-aliasing). Ces points agissent comme je veux - c'est-à-dire qu'ils ne changent pas de taille quand je zoome, bien que leurs positions x/y/z bougent de façon appropriée lorsque j'effectue un zoom, un panoramique, etc

Ce que j'aimerais pouvoir faire est des points de l'intrigue en utilisant une myriade de formes (^, <,>, *,., etc.). D'après ce que je comprends d'OpenGL (ce qui n'est pas beaucoup), ce n'est pas trivial à accomplir car OpenGL traite tout comme un "vrai" objet 3D, donc zoomer sur n'importe quelle forme openGL mais un "point" change la projection de l'objet Taille.

Après avoir fait un peu de lecture, je pense qu'il ya (au moins) 2 solutions possibles à ce problème:

  1. utiliser des textures OpenGL. Cela ne semble pas difficile, mais je crois que les images de texture deviendront de plus en plus petites en zoomant - est-ce exact? Utilisez les polygones OpenGL, les lignes, etc., et dessinez des *, des triangles, ou quoi que ce soit d'autre. Mais là encore, je rencontre le même problème: comment empêcher OpenGL de redimensionner les "points" en zoomant?

est la solution de mordre simplement la balle et redessiner l'ensemble des données établies chaque fois que l'utilisateur effectue un zoom avant ou des casseroles pour faire en sorte que les points restent la même taille? Existe-t-il un moyen de dire à OpenGL de ne pas recalculer la taille d'un objet? Je suis désolé si cela se trouve quelque part dans le document OpenGL - je ne l'ai pas trouvé.

Répondre

0

Il n'y a pas de moyen facile de faire ce que vous voulez faire. Vous devrez redimensionner dynamiquement les primitives que vous dessinez en fonction du zoom actuel de la caméra. Vous pouvez utiliser une technique connue sous le nom billboarding pour vous assurer que vos objets sont toujours face à l'appareil photo.

2

La scène est de nouveau dessinée à chaque fois que l'utilisateur effectue un zoom ou un panoramique, de toute façon, vous pouvez ainsi recalculer la taille.

Vous avez suggéré d'utiliser un poly texturé ou d'utiliser des polygones directement, ce qui me semble être une bonne idée. Il semble que vous souhaitiez que les points de tracé restent dans la position correcte dans le graphique lorsque la caméra se déplace, mais vous voulez les empêcher de changer de taille lorsque l'utilisateur effectue un zoom. Pour ce faire, il suffit de redimensionner les polygones des points de la parcelle afin que le rapport entre la taille du polygone et la distance par rapport à la caméra reste constant. Si vous avez beaucoup de points d'intrigue, le calcul de la distance par rapport à la caméra risque d'être coûteux en raison de la racine carrée impliquée, mais une table de recherche résoudra probablement cela. En plus de redimensionner, vous devez garder les points de l'intrigue face à la caméra, alors billboarding est votre solution, là.

Une alternative est project chacun des emplacements de points de tracé 3D pour trouver leurs coordonnées d'écran 2D. Ensuite, il suffit de rendre les polygones à ces coordonnées d'écran. Aucune remise à l'échelle nécessaire. Cependant, gluProject est assez lent, donc je serais très surpris si ce n'était pas des ordres de grandeur plus lents que de simplement redimensionner les polygones des points de l'intrigue comme je l'ai d'abord suggéré.

Bonne chance!

Questions connexes