Santé et éducation des enfants > Education bébé > Articles Liés > Intersection Rays

Intersection Rays

Être une ventouse pour les tests d'intersection rapides, je viens d'avoir à essayer d'optimiser son Trombone et mon ray-triangle intersecte ou présentés dans la revue des outils graphiques (JGT) en 1997. Eric Haines et je me suis tourné cette (et quelques autres optimisations pour le cas 2D) dans un petit article pour le Journal du Dr Dobb. Cependant, il n'y avait pas assez d'espace pour discuter de tous les détails, donc cette page exists.First de tous, je pensais que ce serait intéressant de voir ce qui se passe avec le temps d'intersection que le nombre de visites augmente de 0% à 100%. Deuxièmement, comme nous l'avons dit dans notre article de JGT, la division (après tout, la division est assez cher, ce qui explique pourquoi nous nous soucions à ce sujet) pourrait être repoussée plus tard dans le code, en faisant des tests différents en fonction du signe du déterminant . Donc, je mis en œuvre, et je crois que le code est encore plus propre maintenant (par exemple, juste enlever le "else if" et vous avez un test pour blackface culling) Troisièmement, j'ai essayé beaucoup de différentes façons de commander les calculs dans le code, et enfin réglé sur trois versions différentes: 1) Avoir la fracture à la fin de ce dernier2) Avoir la fracture au début de la Code.3) Avoir la fracture tôt dans le code ainsi que déplacer un produit en croix sur le «si -else si "-case. (la version 0 est tout simplement le code de JGT d'origine) .Le code pour ces quatre versions est disponible ci-dessous. Je lance mon programme de test (compilé avec "-O2 gcc") sur trois ordinateurs différents: un Octane SGI avec un R10K 175 MHz, un Sun UltraSPARC-IIi 333 MHz, et sur un PC Linux avec un processeur Pentium III 700 MHz pour rendre le essai et les timings raisonnables (au moins à certains égards), j'ai d'abord de façon randomisée 1000 paires différentes ray-triangle et de mettre ceux-ci dans une liste. Puis j'ai commencé l'horloge pour la première optimisation, et courir à travers la liste 10.000 fois, puis arrêté le chronomètre. Faire de cette façon, je pense que j'éviter les coups de performance de prédiction de branchement, ce que je peux obtenir si je répète le même test pour une paire de rayons-triangle 10.000 fois dans une rangée (puis la paire suivante, et ainsi de suite). Tout cela a été fait pour les quatre versions du code. 1. Utilisation de la méthode ComputeIntersectionBox (...), qui prend un rayon et une boîte comme arguments et calcule l'intersection la plus proche du rayon et la boîte. Ce procédé fonctionne en formant un plan avec chacune des faces de la boîte et la recherche d'une intersection avec chacun des plans. Une fois qu'une intersection est détectée, on vérifie si oui ou non le point se trouve sur la surface de la boîte en vérifiant que le point d'intersection se trouve entre les points d'angle. Quand je regarde les rayons après l'exécution de cet algorithme sur deux boîtes différentes, j'obtenir les intersections correctes. 2. Utilisation de la méthode ComputeIntersectionScene (...) sans utiliser les transformations de matrice sur une scène qui présente deux sphères, un dodécaèdre (un maillage triangulaire), et deux boîtes. ComputeIntersectionScene (...) traverse de manière récursive tous les noeuds du graphe de scène et calcule l'intersection la plus proche avec le rayon donné. Ce test en particulier, ne s'applique pas toutes les transformations que nœuds parents peuvent avoir que doivent également être appliquées à leurs enfants. Avec ce test, j'obtiens également les intersections correctes. 3. Utilisation de la méthode ComputeIntersectionScene (...) avec les transformations de matrice. Ce test fonctionne comme celui ci-dessus, sauf que, avant de trouver une intersection entre le rayon et un noeud dans la scène, le rayon se transforme en son cadre de coordonnées en utilisant l'inverse de la matrice de transformation du noeud et après l'intersection a été calculé le noeud, cette intersection se transforme de nouveau dans le monde coordonne en appliquant la matrice de transformation du point d'intersection.
&

Articles Liés

Articles LiésFamily EducationEcole EnfantsDifférent Child Education