В библиотеке A-Frame система теней построена поверх графического
движка Three.js и управляется через компонент shadow.
Поддерживаются два базовых типа взаимодействия объектов с тенями:
Тени рассчитываются источниками света, поддерживающими генерацию теней (например, направленный и точечный свет). Геометрия объектов сцены участвует в расчётах только при явном включении соответствующих параметров.
shadowКомпонент подключается к любому объекту сцены:
<a-entity shadow="cast: true; receive: true"></a-entity>
Параметры:
| Свойство | Тип | Назначение |
|---|---|---|
cast |
boolean | Отбрасывает ли объект тень |
receive |
boolean | Принимает ли объект тень |
По умолчанию оба значения равны false.
Тени работают только при выполнении трёх условий:
cast: true.receive: true.Пример базовой сцены:
<a-scene>
<a-plane rotation="-90 0 0"
width="10"
height="10"
color="#ccc"
shadow="receive: true">
</a-plane>
<a-box position="0 1 -3"
color="red"
shadow="cast: true">
</a-box>
<a-light type="directional"
position="0 10 5"
intensity="1"
castShadow="true">
</a-light>
</a-scene>
Не все типы света поддерживают тени.
directionalspotpointТип ambient не создаёт теней, так как освещает сцену
равномерно.
Пример направленного света:
<a-light type="directional"
position="0 10 5"
castShadow="true">
</a-light>
Параметр castShadow="true" обязателен для генерации
теней.
Объект, выступающий в роли caster:
Пример:
<a-sphere position="0 2 -4"
radius="1"
color="#4CC3D9"
shadow="cast: true">
</a-sphere>
Если объект находится вне зоны действия света, тень отображаться не будет.
Receiver — это поверхность, на которую проецируется тень.
Чаще всего:
Пример:
<a-plane rotation="-90 0 0"
width="20"
height="20"
material="color: #999"
shadow="receive: true">
</a-plane>
Важно учитывать:
shader: flat тени отображаться не
будут.A-Frame использует технику shadow mapping, реализованную в Three.js. Суть метода:
Это означает:
Параметры источника света позволяют управлять качеством.
Пример расширенной настройки:
<a-light type="directional"
position="0 10 5"
castShadow="true"
shadow-mapWidth="2048"
shadow-mapHeight="2048"
shadow-camera-near="0.5"
shadow-camera-far="50"
shadow-camera-left="-20"
shadow-camera-right="20"
shadow-camera-top="20"
shadow-camera-bottom="-20">
</a-light>
| Параметр | Назначение |
|---|---|
shadow-mapWidth / shadow-mapHeight |
Разрешение карты теней |
shadow-camera-near / far |
Диапазон глубины |
shadow-camera-left/right/top/bottom |
Область охвата |
Чем меньше область камеры теней, тем выше детализация в пределах этой области.
Тени — одна из самых затратных операций в WebGL.
Рекомендуется:
cast у мелких или второстепенных
объектов.Пример оптимизации:
<a-entity shadow="cast: false; receive: true"></a-entity>
Возможные причины:
castShadow у света.cast: true.receive: true.Причина — слишком маленькая область shadow-camera-*.
Решение — расширить границы камеры теней.
Причина — низкое разрешение shadow map.
Решение — увеличить shadow-mapWidth и
shadow-mapHeight.
Тени корректно работают с анимацией и перемещением объектов. При изменении позиции caster-объекта карта теней пересчитывается в реальном времени.
Пример:
<a-box position="0 1 -3"
shadow="cast: true"
animation="property: position; to: 3 1 -3; dir: alternate; loop: true; dur: 2000">
</a-box>
При движении объект продолжает отбрасывать динамическую тень.
Через системный объект сцены можно получить доступ к внутреннему экземпляру Three.js:
AFRAME.scenes[0].renderer.shadowMap.enabled = true;
Доступ к объекту:
const mesh = el.getObject3D('mesh');
mesh.castShadow = true;
mesh.receiveShadow = true;
Это позволяет управлять тенями на низком уровне, включая работу с кастомной геометрией и загруженными моделями.
При использовании gltf-model необходимо включать тени
для вложенных мешей:
el.addEventListener('model-loaded', () => {
el.getObject3D('mesh').traverse(node => {
if (node.isMesh) {
node.castShadow = true;
node.receiveShadow = true;
}
});
});
Без этой процедуры модель может отображаться без теней, даже если
компонент shadow указан.
Материалы, основанные на освещении (например, стандартный
material A-Frame), корректно работают с тенями.
Некоторые ограничения:
flat-шейдер не поддерживает освещение.По умолчанию используется базовая фильтрация. Улучшение качества достигается настройкой типа карты теней в Three.js:
AFRAME.scenes[0].renderer.shadowMap.type = THREE.PCFSoftShadowMap;
Методы:
BasicShadowMapPCFShadowMapPCFSoftShadowMapМягкие тени повышают реалистичность сцены, но требуют больше вычислительных ресурсов.
Система теней в A-Frame базируется на комбинации:
Правильная конфигурация позволяет добиться реалистичного освещения и глубины сцены при сохранении приемлемой производительности в WebXR-приложениях.