Mapper une texture sur un triangle hyperbolique

9

Je suis coincé sur la façon d'aborder cela depuis un moment, donc toutes les suggestions seraient grandement appréciées!

Je veux mapper une texture sous la forme d'un triangle euclidien inférieur droit à un triangle hyperbolique sur le disque de Poincaré.

Voici la texture (le triangle supérieur gauche de la texture est transparent et inutilisé). Vous pourriez reconnaître cela comme faisant partie du cercle limite d'Escher I

Désolé, voir le commentaire car je ne suis pas autorisé à poster plus de deux liens semble-t-il!

Et voici à quoi ressemble mon polygone (il est centré à l'origine, ce qui signifie que deux arêtes sont des lignes droites, mais en général, les trois arêtes seront des arcs de cercle):

Polygone filaire

Le centre du polygone est l'incentre du triangle euclidien formé par ses sommets et je mappe la texture UV à l'aide de son incentre, la divisant en le même nombre de faces que le polygone et mappant chaque face sur la face du polygone correspondante. Cependant, le résultat ressemble à ceci:

Polygone texturé

Si quelqu'un pense que cela est résoluble en utilisant le mappage UV, je serais heureux de fournir un exemple de code, mais je commence à penser que cela pourrait ne pas être possible et je devrai écrire mes propres fonctions de mappage.

RESOLU avec un certain raffinement de la réponse de @ Nathan ci-dessous car les lignes AB, AC, BC peuvent en fait être des arcs et non des lignes.

Méthode: choisissez le côté le plus long, disons BC, puis subdivisez-le en un nombre pair de pièces. Subdivisez les deux autres côtés en le même nombre de pièces. Ensuite, les lignes qui les relient (DE dans la réponse ci-dessous) doivent également être des arcs et non des lignes droites. Subdivisez ces nouveaux arcs selon vos besoins, ajoutez les nouveaux triangles en tant que faces puis mappez UV le triangle inférieur droit de la texture à ces nouvelles faces.

Facile? Pas du tout. Mais ça a marché. Poisson 1 Poisson 2

Bleu Lewy
la source
Voici la texture que j'utilise: i.stack.imgur.com/SEi0G.png
Lewy Blue
1
Je suppose que le problème est le cisaillement de l'image? Je vois que cela se produit lorsque vous avez un espacement incohérent entre les sommets de la subdivision triangulaire. Je suppose que vous utilisez des étapes cohérentes pour votre cartographie uv, vous donnant l'effet de cisaillement.
Daniel M Gessel
J'ai en fait corrigé que peu de temps après la publication de cela en rendant les subdivisions cohérentes et plus petites, cela corrige le cisaillement quelque peu (mais pas complètement). Cependant la texture est encore très déformée. Je travaille sur la suggestion @nathan ci-dessous, qui permettra au moins une subdivision beaucoup plus fine.
Lewy Blue
1
@Looeee Pourriez-vous passer votre code s'il vous plaît, je suis très intéressé par ce domaine graphique
x-rw
Oui, vous pouvez trouver mon code ici: github.com/looeee/blackthread-heroku/tree/master/assets/js/src/… Et la version live: blackthread.io/experiments/eschersketch Honnêtement, c'est si longtemps que j'ai regardé à cela, je ne me souviens pas où dans le code les fonctions qui résolvent cela sont, mais si vous avez du mal à le comprendre, envoyez-moi un autre commentaire ici et je vais y jeter un œil.
Lewy Blue

Réponses:

8

Je suppose que pour obtenir une texture correcte, vous devrez également subdiviser l'intérieur du triangle et approximer la cartographie UV non linéaire à l'intérieur.

Actuellement, il semble que vous vous subdivisiez autour des bords du triangle et que vous formiez un éventail de triangles plus petits entre le bord et l'incitateur. Ce serait bien si vous deviez simplement rendre le triangle d'une couleur unie. Mais lorsque vous appliquez une texture, vous obtenez des discontinuités aux limites de ces subdivisions, car la texture est simplement étirée linéairement à travers chaque triangle subdivisé et n'approximant pas correctement le mappage hyperbolique le long de la direction radiale.

Vous devrez subdiviser le long des deux axes, quelque chose comme ceci:

entrez la description de l'image ici

et positionnez tous les sommets de manière appropriée dans l'espace d'écran et l'espace UV pour approximer les coordonnées hyperboliques à l'intérieur du triangle. Si vous subdivisez assez finement, cela devrait produire l'illusion d'un mappage de texture incurvé en continu.

Nathan Reed
la source
1
Merci, je vais essayer ça. C'était l'une de mes méthodes originales de construction du polygone, mais beaucoup plus complexe mathématiquement, j'ai donc opté pour la méthode la plus simple. Je vais lui donner un autre coup et faire rapport.
Lewy Blue
Je vous remercie. J'ai pu transformer votre suggestion en solution. Voir ma modification ci-dessus.
Lewy Blue