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):
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:
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.
fonte
Respostas:
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:
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.
fonte