2013-08-16 2 views
2

Je travaille sur un projet qui permet aux utilisateurs de choisir des objets 3D dans une scène et je me demandais ce que tout le monde pensait que la meilleure façon d'aborder ce scénario particulier.3D Graphics Picking - Quelle est la meilleure approche pour ce scénario

Fondamentalement, nous avons une scène avec au moins 100 objets (ils sont low-poly mais fabriqués à partir d'au moins ~ 12-15 triangles) et jusqu'à environ 1000-2000 objets.

Tous les objets ne seront pas "sélectionnables" à tout moment car certains objets occluent d'autres objets de sorte que les objets "sélectionnables" se situent probablement entre 800 et 1500 (selon la complexité de la scène). Quand un objet est "choisi", nous voulons qu'il soit surligné d'une certaine manière, cela signifie le rendre différemment, c'est trivial mais nous voulons que le choix soit fait non seulement en un clic, mais aussi en traînant - ce qui veut dire que nous voulons pour exécuter l'algorithme de picking beaucoup dans un court laps de temps. Idéalement, l'utilisateur verrait les objets mis en évidence alors qu'ils étaient encore dans une opération de «glisser» - (ce qui signifie que le choix devrait probablement être fait de manière asynchrone pour ne pas être décalé par rapport au rendu principal?).

J'ai essayé la sélection de tracé de rayons simple, mais c'est évidemment assez lent lorsque nous parcourons tous les triangles de la scène pour trouver l'objet. J'ai également essayé le picking basé sur GPU - rendre la scène en utilisant un pixelbuffer qui donne une couleur unique à chaque objet mais avec l'opération de glissement cela signifie plusieurs rendus et le transfert de données GPU-CPU qui n'a pas grand-chose performance.

Y at-il d'autres possibilités que je pourrais explorer pour essayer d'obtenir les performances et les fonctionnalités que je veux?

Merci pour votre temps.

+0

En plus de l'approche Octree, vous devez d'abord tester des volumes de délimitation plus simples. Par exemple. un test pour l'intersection sphère-rayon est très bon marché. Si le rayon n'atteint pas le volume limite, vous n'avez pas besoin d'essayer si le rayon frappe le maillage. –

+0

Donc, vous dites qu'il serait bénéfique de créer un octree de sphères ainsi que des boîtes de délimitation et de tester les sphères en premier? – poncho

+0

Non, si vous avez trouvé des hits potentiels dans l'octree, vous devez analyser s'il y a vraiment un hit. Cela peut être accéléré en vérifiant d'abord les volumes englobants. –

Répondre

1

J'ai utilisé un Octree avant pour ce genre de chose et cela semblait être ma meilleure option. Chaque objet peut être placé dans le nœud correspondant et testé par le protocole habituel Octree. Les avantages réels proviennent de la compensation du rayon lancé à la fin d'un nœud spatial lorsque le nœud actuel est vide. Cela vous donnera sûrement des gains significatifs par rapport à la force brute.

Le lien suivant devrait vous donner l » une base avec Octo et comment il est mis en place: Introduction to Octrees

Alors que le lien ne vous donne une base, l'utilisation du Octo est simplement réduire les vérifications nécessaires, donc à en juger par votre question, vous semblez avoir déjà les connaissances requises pour effectuer la cueillette proprement dite.

+0

Ah d'accord, je ne pense pas que j'ai rencontré cette méthode, avez-vous un lien vers un endroit qui l'explique bien? – poncho

+0

@poncho Je ne trouve pas de liens qui fournissent exactement cela, mais avez-vous déjà utilisé un octree auparavant? Si ce n'est pas le cas, une fois que vous vous en êtes familiarisé, vous constaterez que vous pouvez affiner les tests d'intersection que vous effectuez.Pour optimiser davantage, vous pouvez "accélérer" les rayons au-delà des nœuds vides car vous savez que vous n'avez pas à effectuer de tests là-bas. –

+0

Ah ok merci, non, je n'ai jamais utilisé Octrees auparavant mais j'ai trouvé une bonne explication ici (http://castle-engine.sourceforge.net/vrml_engine_doc/output/xsl/html/chapter.octree.html#section. octree_collision_detection) et donc j'essaierai de l'implémenter maintenant. – poncho

Questions connexes