Mapear uma textura em um triângulo hiperbólico

9

Eu estive preso em como abordar isso por um tempo, para que todas as sugestões sejam apreciadas com gratidão!

Quero mapear uma textura na forma de um triângulo euclidiano inferior direito para um triângulo hiperbólico no disco de Poincaré.

Aqui está a textura (o triângulo superior esquerdo da textura é transparente e não utilizado). Você pode reconhecer isso como parte do limite de círculo I de Escher

Desculpe, veja o comentário, pois não tenho permissão para postar mais de dois links!

E é assim que meu polígono se parece (está centrado na origem, o que significa que duas arestas são linhas retas, no entanto, em geral, todas as três arestas serão arcos circulares):

Wireframe Polygon

O centro do polígono é o incentivo do triângulo euclidiano formado por seus vértices e eu estou mapeando UV a textura usando seu incentre, dividindo-a no mesmo número de faces que o polígono possui e mapeando cada face na face correspondente do polígono. No entanto, o resultado fica assim:

Polígono texturizado

Se alguém achar que isso é solucionável usando o mapeamento UV, eu ficaria feliz em fornecer algum código de exemplo, no entanto, estou começando a pensar que isso pode não ser possível e terei que escrever minhas próprias funções de mapeamento.

RESOLVIDO com algum refinamento da resposta de @ Nathan abaixo, pois as linhas AB, AC, BC podem na verdade ser arcos, não linhas.

Método: escolha o lado mais longo, digamos BC, e subdividi-lo em um número par de partes. Subdividir os outros dois lados no mesmo número de partes. Então as linhas que os conectam (DE na resposta abaixo) também devem ser arcos, não linhas retas. Subdividir esses novos arcos conforme necessário, adicione os novos triângulos como faces e, em seguida, UV mapeie o triângulo inferior direito da textura para essas novas faces.

Simples? De modo nenhum. Mas funcionou. Peixe 1 Peixe 2

Lewy Blue
fonte
Aqui está a textura que estou usando: i.stack.imgur.com/SEi0G.png
Lewy Blue
11
Suponho que o problema é o corte da imagem? Vejo que isso acontece quando você tem espaçamento inconsistente entre os vértices da subdivisão triangular. Meu palpite é que você está usando etapas consistentes para o seu mapeamento uv, proporcionando o efeito de cisalhamento.
Daniel M Gessel 01/03
Na verdade, eu corrigi que, logo após postar isso, tornando as subdivisões consistentes e menores, corrige um pouco o cisalhamento (embora não completamente). No entanto, a textura ainda está muito distorcida. Estou trabalhando na sugestão @nathan abaixo, que pelo menos permitirá uma subdivisão muito mais refinada.
Lewy Azul
11
@Looeee Você poderia passar o seu código por favor, eu estou muito interessado nesta área de gráficos
x-rw
Sim, você pode encontrar meu código aqui: github.com/looeee/blackthread-heroku/tree/master/assets/js/src/… E a versão ao vivo: blackthread.io/experiments/eschersketch Honestamente, faz tanto tempo que eu olhei por isso, não consigo me lembrar onde estão as funções que resolvem isso no código, mas se você tiver problemas para entender isso, envie-me outro comentário aqui e vou dar uma olhada.
Lewy Azul

Respostas:

8

Meu palpite é que, para que a textura pareça correta, você também deverá subdividir o interior do triângulo e aproximar o mapeamento UV não linear dentro dele.

Atualmente, parece que você está subdividindo-se nas bordas do triângulo e formando um leque de triângulos menores entre a borda e o incentor. Isso seria bom se você estivesse apenas renderizando o triângulo em uma cor sólida. Mas ao aplicar uma textura, você obtém descontinuidades nos limites dessas subdivisões, porque a textura é esticada linearmente em cada triângulo subdividido e não se aproximando corretamente do mapeamento hiperbólico na direção radial.

Você precisará subdividir-se ao longo dos dois eixos, algo como isto:

insira a descrição da imagem aqui

e posicione todos os vértices adequadamente no espaço da tela e no espaço UV para aproximar as coordenadas hiperbólicas no interior do triângulo. Se você subdividir o suficiente, isso deve gerar a ilusão de um mapeamento de textura em curva contínua.

Nathan Reed
fonte
11
Obrigado, vou tentar isso. Era um dos meus métodos originais de construção do polígono, por mais matematicamente muito mais complexo, por isso fui com o método mais simples. Vou tentar outra vez e relatar de volta.
Lewy Blue
Obrigado. Consegui modificar sua sugestão em uma solução. Veja minha edição acima.
Lewy Azul