Нанести текстуру на гиперболический треугольник

9

Я застрял на том, как подойти к этому некоторое время, поэтому любые предложения будут с благодарностью!

Я хочу отобразить текстуру в форме нижнего правого евклидова треугольника на гиперболический треугольник на диске Пуанкаре.

Вот текстура (верхний левый треугольник текстуры прозрачен и не используется). Вы можете узнать это как часть ограничения круга Эшера I

Извините, смотрите комментарий, так как мне не разрешено публиковать более двух ссылок!

И вот как выглядит мой многоугольник (он центрирован в начале координат, что означает, что два ребра являются прямыми линиями, однако в целом все три ребра будут дугами окружности):

Каркасный полигон

Центр многоугольника является центром евклидова треугольника, образованного его вершинами, и я наносю на карту UV текстуру, используя ее центр, разделяя ее на то же количество граней, что и у многоугольника, и сопоставляя каждую грань с соответствующей гранью многоугольника. Однако результат выглядит так:

Текстурированный Полигон

Если кто-то думает, что это можно решить с помощью УФ-картографирования, я был бы рад предоставить пример кода, однако я начинаю думать, что это может быть невозможно, и мне придется написать свои собственные функции картографирования.

Решено с некоторым уточнением ответа @ Натана ниже, так как линии AB, AC, BC на самом деле могут быть дугами, а не линиями.

Метод: выберите самую длинную сторону, скажем BC, затем разделите ее на четное количество частей. Разделите две другие стороны на одинаковое количество частей. Тогда соединяющие их линии (DE в ответе ниже) также должны быть дугами, а не прямыми. Подразделите эти новые дуги по мере необходимости, добавьте новые треугольники в качестве граней, затем UV-отображение нижнего правого треугольника текстуры на эти новые грани.

Просто? Не за что. Но это сработало. Рыба 1 Рыба 2

Льюи Блю
источник
Вот текстура, которую я использую: i.stack.imgur.com/SEi0G.png
Lewy Blue
1
Я предполагаю, что проблема заключается в стрижке изображения? Я вижу, что это происходит, когда у вас есть противоречивый интервал между вершинами треугольного подразделения. Я предполагаю, что вы используете последовательные шаги для вашего УФ-картирования, что дает вам эффект сдвига.
Даниэль М Гессель
Я на самом деле исправил это вскоре после публикации, сделав подразделения единообразными и меньшими, это несколько исправляет сдвиг (хотя и не полностью). Однако текстура все еще очень искажена. Я работаю над предложением @nathan ниже, которое, по крайней мере, позволит получить более точное подразделение.
Леви Блю
1
@Looeee Не могли бы вы передать свой код, пожалуйста, я очень заинтересован в этой области графики
x-rw
Да, вы можете найти мой код здесь: github.com/looeee/blackthread-heroku/tree/master/assets/js/src/… И живая версия: blackthread.io/experiment/eschersketch Честно говоря, я так долго смотрел при этом я не могу вспомнить, где в коде находятся функции, которые решают это, но если у вас возникли проблемы с его пониманием, напишите мне еще один комментарий, и я посмотрю.
Lewy Blue

Ответы:

8

Я предполагаю, что для того, чтобы текстура выглядела правильно, вам нужно будет также разделить внутреннюю часть треугольника и приблизить нелинейное UV-отображение внутри него.

В настоящее время, похоже, что вы делитесь вокруг краев треугольника и формируете веер из меньших треугольников между ребром и стимулятором. Это было бы хорошо, если бы вы только рендерили треугольник в сплошной цвет. Но при применении текстуры вы получаете разрывы на границах этих подразделений, потому что текстура просто растягивается линейно по каждому подразделенному треугольнику и не корректно аппроксимирует гиперболическое отображение вдоль радиального направления.

Вам нужно будет разделить вдоль обеих осей, что-то вроде этого:

введите описание изображения здесь

и расположите все вершины соответствующим образом в пространстве экрана и в пространстве UV, чтобы приблизить гиперболические координаты внутри треугольника. Если вы поделите достаточно точно, это должно создать иллюзию непрерывно изгибающегося текстурного наложения.

Натан Рид
источник
1
Спасибо, я попробую это. Это был один из моих оригинальных методов построения многоугольника, однако математически он был намного сложнее, поэтому я выбрал более простой метод. Я сделаю еще один снимок и доложу.
Lewy Blue
Спасибо. Я смог изменить ваше предложение в решение. Смотрите мое редактирование выше.
Леви Блю