Polygone de triangulation dans le triangle des bandes pour OpenGL ES
Je suis à la recherche d'un rapide polygone algorithme de triangulation qui peut trianguler pas très complexe 2D polygones concaves (sans trous) dans triangle bandes prêts à être envoyés à OpenGL ES pour le dessin à l'aide de GL_TRIANGLE_STRIP
.
Je suis au courant de certains algorithmes, mais je ne pouvais pas en trouver un qui répondra à mes besoins:
- http://www.flipcode.com/archives/Efficient_Polygon_Triangulation.shtml
- cet algorithme fonctionne ok mais le problème est qu'il renvoie de simples triangles qui vous ne pouvez pas dessiner avec
GL_TRIANGLE_STRIP
, vous devez utiliserGL_TRIANGLES
qui n'est pas très efficace sur un grand nombre de sommets.
- cet algorithme fonctionne ok mais le problème est qu'il renvoie de simples triangles qui vous ne pouvez pas dessiner avec
- http://code.google.com/p/iphone-glu/
- il ne dispose pas d'exemple associé et je ne pouvais pas trouver quelqu'un qui a utilisé avec succès sur iOS avec OpenGL ES 2.0
- Je ne sais pas de quoi il retourne et il me semble qu'il appelle également le correspondant de commandes OpenGL que je ne veux pas - je n'ai besoin que les triangles arrière
- il des fuites de mémoire de
La plate-forme que je suis en train d'élaborer pour: iOS, OpenGL ES 2.0, cocos2d 2.0.
Quelqu'un peut m'aider avec un tel algorithme? Ou de tout autre conseil sera grandement apprécié.
Bien qu'une liste de triangles peut sembler moins efficace qu'un seul triangle strip, il paye, quand vous avez plus d'un de ces polygones concaves à dessiner comme un véritable objet 3d construit à partir d'eux). Dans ce cas, vous pouvez dessiner l'ensemble de multi-objet polygone avec un seul appel (beaucoup de tri-les listes peuvent être concaténés en un seul), alors qu'avec un triangle-bande de solution que vous avez à tirer chaque polygone indivdually. Aujourd'hui, la réduction du nombre d'appels de dessin est souvent mieux que de croquer des objets dans certains sophistiqué primitives, comme le tri-bandes. Je suppose que cela s'applique aussi aujourd'hui, pour les dispositifs ES.
Si vous avez un objet entier, il est préférable de le transformer en triangles et de le donner à une bibliothèque qui permettrait de générer triangle des bandes, tels que nvTriStrip ou Stripifier. Qui peut être fait en mode hors connexion sur PC de sorte que l'on n'a pas besoin de s'embêter à le portage de la bibliothèque pour iOS. Les appareils aussi généralement en charge la primitive de redémarrer, ce qui permet de concaténer les tristrips pour être en mesure de rendre à l'aide d'une seule commande. Et puis il y a glMultiDrawElements() ou dégénérées bandes.
Si vous avez un objet entier, il est préférable de le transformer en triangles et de le donner à une bibliothèque qui permettrait de générer triangle des bandes, tels que nvTriStrip ou Stripifier. Qui peut être fait en mode hors connexion sur PC de sorte que l'on n'a pas besoin de s'embêter à le portage de la bibliothèque pour iOS. Les appareils aussi généralement en charge la primitive de redémarrer, ce qui permet de concaténer les tristrips pour être en mesure de rendre à l'aide d'une seule commande. Et puis il y a glMultiDrawElements() ou dégénérées bandes.
OriginalL'auteur Calin | 2012-01-24
Vous devez vous connecter pour publier un commentaire.
En 2D et sans trous, c'est assez facile. Tout d'abord, vous devez rompre votre polygone à un ou plusieurs monotone des polygones.
Le ton monotone de polygones sont assez simples pour se transformer en tristrips, juste trier les valeurs par
y
, trouver le plus haut et le plus bas du vertex, et puis vous avez des listes de sommets vers la droite et vers la gauche (parce que les sommets viennent dans certains régimes de, dire dans le sens horaire, de l'ordre). Ensuite, vous commencez avec le plus haut sommet et ajouter des sommets de la gauche et de la droite en alternance.Que cette technique fonctionne pour toutes les polygones 2D sans auto-intersection d'arêtes, qui comprend certains cas de polygones avec des trous (les trous doivent être correctement de la plaie).
Vous pouvez essayer de jouer avec ce code:
Ce code n'est pas optimal, mais il doit être facile à comprendre. Au départ, un polygone concave est créé. Ensuite, un "travail" de sommets est créé. Sur ce jeu de travail, une permutation est calculée qui trie les sommets par leur
y
coordonner. Cette permutation est alors bouclé, à la recherche de points de scission. Une fois le point de split est trouvé, une nouvelle monotone polygone est créé. Ensuite, les sommets utilisé dans le nouveau polygone sont retirés de l'ensemble de travail et l'ensemble du processus se répète. Enfin, l'ensemble de travail contient la dernière polygone qui pourrait ne pas être divisé. À la fin, le ton monotone de polygones sont rendus, avec triangle strip de la commande. C'est un peu bordélique, mais je suis sûr que vous allez le comprendre (c'est du code C++, il suffit de le mettre à l'intérieur d'une SURABONDANCE de fenêtre et de voir ce qu'elle fait).Espère que cela aide ...
Si la gauche monotone polyligne a moins de sommets que le droit, et si d'autres sommets être ajoutés artificiellement à la gauche de la polyligne de laisser l'algorithme continue?..
Il n'y a généralement pas beaucoup de sens d'ajouter de dupliquer des sommets qu'ils n'apparaissent pas de toute façon. Je pense que dans l'exemple, la gauche / droite n'est pas équilibré.
OriginalL'auteur the swine
Vous pouvez extraire de la tesselation algorithme d'OpenGL Exemple de mise en Œuvre, comme décrit dans ce post http://choruscode.blogspot.de/2013/03/extracting-tesselation-from-opengl.html , il dispose également d'un exemple.
OriginalL'auteur southerton