Повтор текстуры: repeat и wrap

В A-Frame работа с текстурами предоставляет широкие возможности для управления визуальным оформлением объектов. Среди ключевых инструментов — свойства repeat и wrap, которые отвечают за повторение и способ отображения текстуры на поверхности геометрии.


Свойство repeat

repeat определяет, сколько раз текстура повторяется по осям X и Y. Это особенно важно для больших поверхностей, где одна текстура может выглядеть растянутой или размывшейся при стандартном масштабировании.

Синтаксис:

<a-box src="#texture" repeat="2 3"></a-box>
  • Первое значение (2) — количество повторов по оси X.
  • Второе значение (3) — количество повторов по оси Y.

Если указано одно значение, оно применяется ко обеим осям:

<a-plane src="#texture" repeat="4"></a-plane>

Текстура повторится 4 раза по X и по Y.

Особенности:

  • Значения repeat могут быть дробными, что позволяет создавать частичное повторение текстуры. Например, repeat="1.5 2" повторит текстуру 1.5 раза по X и 2 раза по Y.
  • Для корректного отображения повторов необходимо, чтобы свойство wrap было установлено в repeat (по умолчанию может быть clamp-to-edge).

Свойство wrap

wrap управляет поведением текстуры при выходе за пределы координат [0,1]. Основные режимы:

  1. repeat – текстура повторяется бесконечно, исходя из значения repeat.
  2. clamp-to-edge – текстура растягивается до края, что предотвращает повторение, но может вызывать размытие на границах.
  3. mirrored-repeat – текстура повторяется с зеркальным отражением при каждом повторе.

Пример использования:

<a-plane src="#texture" repeat="3 2" wrap="repeat"></a-plane>

Текстура повторяется 3 раза по X и 2 по Y, а режим repeat обеспечивает цикличное повторение без искажений.

Пример с зеркальным повторением:

<a-box src="#texture" repeat="2 2" wrap="mirrored-repeat"></a-box>

Здесь каждый второй повтор текстуры по обеим осям будет зеркально отражён, что создаёт интересный визуальный эффект.


Комбинация repeat и wrap для сложных материалов

При работе с текстурами важно помнить:

  • Для натурального повторения текстуры всегда использовать wrap="repeat".
  • Для симметричных паттернов можно применять wrap="mirrored-repeat", что позволяет избежать резких границ между повторениями.
  • Свойство repeat можно динамически изменять через JavaScript, чтобы создавать анимации масштабирования или движения текстуры:
const plane = document.querySelector('#myPlane');
let offset = 0;

AFRAME.registerComponent('animate-texture', {
  tick: function (time, timeDelta) {
    offset += timeDelta * 0.001;
    plane.setAttribute('material', 'repeat', `${2 + Math.sin(offset)} 2`);
  }
});

Это позволяет, например, анимировать волны воды или бегущие полосы на поверхности.


Ограничения и советы

  • Большие значения repeat могут привести к резкому повторению текстуры, если она не рассчитана на тайловость. В таких случаях рекомендуется использовать текстуры с сшиваемыми краями.
  • Не все режимы wrap поддерживаются всеми типами материалов. Например, mirrored-repeat чаще работает с текстурами типа map в стандартных материалах.
  • Текстуры с прозрачностью (alphaMap или PNG) требуют корректного включения transparent: true, иначе повторение может визуально конфликтовать с фоном.

Практические примеры

  1. Пол с плиткой:
<a-plane src="#tileTexture" width="10" height="10" repeat="5 5" wrap="repeat"></a-plane>
  • Текстура плитки повторяется 5×5, создавая эффект настоящего пола.
  1. Дорожная разметка с движением:
<a-plane id="road" src="#roadTexture" width="20" height="5" repeat="10 1" wrap="repeat"></a-plane>
  • Можно анимировать текстуру по оси X для эффекта движения автомобиля.
  1. Зеркальный узор на стене:
<a-box src="#pattern" width="4" height="4" depth="0.1" repeat="3 3" wrap="mirrored-repeat"></a-box>
  • Эффект симметричного орнамента без видимых границ повторений.

Использование repeat и wrap в сочетании открывает возможности точного контроля текстурирования, позволяя создавать как реалистичные поверхности, так и декоративные узоры с динамическими эффектами. Эти свойства являются ключевыми при разработке интерактивных и визуально насыщенных сцен в A-Frame.