Question

Je suis en train de mettre en œuvre culling dans mon OpenGL tronc de cône jeu 2d. Le seul type d'objets géométriques dans mon jeu à ce point sont des rectangles, donc je pensais que ce serait assez facile, mais je reçois des résultats inattendus. J'ai installé une projection en perspective symétrique avec un angle de champ de vision de 45 degrés, et les plans proches et lointains à 0,01 et 50 respectivement. Le vecteur d'oeil est toujours parallèle à l'axe z, l'appareil ne peut se déplacer le long des axes x et y.

Mon idée était d'obtenir la zone rectangulaire de l'espace mondial qui est actuellement visible à la caméra à la coordonnée z du rectangle que je suis en train d'abattre. Parce que la caméra regarde le centre du tronc de cône, je calcule la distance par rapport aux bords de cette zone rectangulaire visible comme suit:

GLfloat maxDistance = givenRectangle.z * tanf(0.5 * (fovAngle * M_PI/180) );

Puis-je ajouter et soustrais cette distance et des coordonnées x et y de la caméra pour obtenir le x visible maximum et minimum et y, puis tester le rectangle donné pour voir si elle est entre ces valeurs.

Ma question est de savoir si je suis sur la bonne voie, et pourquoi la formule ci-dessus renvoie une valeur ridiculement faible (quelque chose * 10 ^ -37) quand j'ai un objet à z = 5, qui devrait être clairement visible avec le caméra à (0,0,0)?

Était-ce utile?

La solution

En prenant le problème à partir du haut, je l'ai vérifié votre formule -. Voir croquis pour confirmer que je vous ai bien compris

entrer image description ici

Étant donné que nous savons A et Z et nous voulons résoudre pour X, j'ai écrit:

tan (A) = X / Z

réarranger, je reçois:

X = tan Z (A)

Depuis Z = 5 et A = 22.5 degrés ...

X = 5 * tan (22,5 degrés)

X = 2.07106781

Alors, il ne semble que si vous avez le droit de maths, mais votre mauvais code - peut-être votre fonction tan attend degrés plutôt que radians, ou fovAngle n'a pas été réglée? Je pense que vous avez besoin de déboguer et de la main vérifier chaque valeur.


Pour en revenir au problème plus vaste de déterminer ce qui fonctionne et ne se trouve pas à l'intérieur de votre tronc, vous trouverez peut-être que vous pouvez utiliser un autre test pour répondre de façon plus élégante de la même question. De nombreux codeurs graphiques utilisent un test « côté du plan ». Considérons que le tronc de cône de visualisation est un volume de l'espace délimité par un ensemble de 6 plans (4 pour les côtés de la fenêtre, un plan de découpage à proximité et un plan de délimitation éloigné).

Etant donné un point sur un plan et une normale pour l'avion, vous pouvez calculer facilement l'équation d'un plan, qui à son tour il est trivial pour tester si un point donné est « à l'intérieur » (dans la direction de la normale) un plan donné. Itérer à travers tous les 6 avions et vous aurez la règle rapidement un point donné dans ou hors de votre volume de visualisation.

La chose vraiment intéressante à propos de ce test est la facilité avec laquelle vous pouvez réutiliser: tout convexe simple polygone vous arrive de vouloir faire des tests sur (par exemple un rectangle) peut être décrit comme un ensemble de plans, vous permettant de re -utiliser votre test « d'initié ou à l'extérieur ». Très général.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top