Сценарные аспекты — готовые поведения
Пять аспектов, закрывающих базовые сценарии «пусть сцена ЧТО-ТО ДЕЛАЕТ» без написания кода:
доехать до точки, пройти круг по вейпоинтам, вращаться, смотреть на цель, запустить GLB-анимацию.
Они спроектированы для визуального редактора сцен (прикрепи из меню Aspects, привяжи цели выбором
узлов во вьюпорте), но это обычные аспекты — node.aspect(MoveTo, { target }) из рукописного кода
работает так же.
Всё движение выполняется покадрово в режиме Play. Пока сцена редактируется, аспекты инертны — но аспекты движения рисуют свои пути редакторными линиями (синие для движения, янтарные для look-at), так что маршрут можно видеть и настраивать, не запуская сцену.
Обычный рецепт сочетает их с узлами Empty (простые узлы-группы — см. scene-files.md): поставь Empty туда, куда что-то должно попасть, и наведи на него аспект. На узле-камере те же аспекты становятся движениями камеры.
MoveTo
Движение от стартовой позиции узла к узлу-цели.
| Поле | По умолчанию | Описание |
|---|---|---|
target |
null |
Узел назначения (ref('name') в файлах сцен) |
duration |
2 |
Секунды на весь путь |
delay |
0 |
Секунды ожидания перед стартом |
mode |
'once' |
'once' остановиться там · 'loop' заново со стартовой точки · 'pingpong' туда-обратно |
easing |
'smooth' |
'smooth' ease-in-out · 'linear' постоянная скорость |
Цель отслеживается вживую — если она движется, путь изгибается к её новой позиции (а once
держит узел прибитым к ней после прибытия).
crate: {
mesh: { kind: 'box', size: [1, 1, 1] },
position: [0, 0.5, 0],
aspects: [use(MoveTo, { target: ref('dropPoint'), duration: 3, mode: 'pingpong' })],
},
dropPoint: { position: [4, 0.5, -2] }, // EmptyFollowPath
Движение по детям узла-пути, в порядке файла сцены — добавляй по Empty на вейпоинт.
| Поле | По умолчанию | Описание |
|---|---|---|
path |
null |
Узел, чьи дети — вейпоинты |
duration |
6 |
Секунды на один полный проход |
delay |
0 |
Секунды ожидания перед стартом |
mode |
'loop' |
'loop' замкнутый круг (последний → первый) · 'once' остановиться на последней точке · 'pingpong' туда-обратно по разомкнутому пути |
orient |
true |
Поворачиваться по направлению движения |
forward |
'-z' |
Какая локальная ось ведёт при ориентации |
Скорость постоянна вдоль всего пути (длины сегментов измеряются вживую, поэтому перетаскивание
вейпоинта корректно перетаймит проход). GLB-модели обычно смотрят в +z — переверни forward,
если твоя модель едет задом наперёд.
bus: {
model: asset('./bus.glb'),
aspects: [use(FollowPath, { path: ref('route'), duration: 12, forward: 'z' })],
},
route: {
position: [0, 0, 0],
children: {
stop1: { position: [0, 0, 0] },
stop2: { position: [8, 0, 2] },
stop3: { position: [5, 0, 8] },
},
},Spin
Непрерывное вращение вокруг локальной оси — speed градусов в секунду, axis 'x' | 'y' | 'z'
(по умолчанию 'y'). Компонуется в пространстве кватернионов, поэтому корректен на заранее
повёрнутых узлах.
LookAt
Держит узел повёрнутым к узлу-цели каждый кадр.
| Поле | По умолчанию | Описание |
|---|---|---|
target |
null |
Узел, на который смотреть |
forward |
'-z' |
Какая локальная ось указывает на цель |
smoothing |
0 |
0 — мгновенный снап; иначе секунды запаздывания поворота (больше = медленнее) |
Турель, следящая за игроком, указатель или — на узле-камере — камера, которая держит движущегося
героя в кадре, пока FollowPath ведёт кран.
PlayAnimation
Запускает GLB-клип при старте сцены. Прикрепляй к узлу с model:.
| Поле | По умолчанию | Описание |
|---|---|---|
clip |
'' |
Имя клипа; пустое = первый клип модели |
loop |
true |
Зациклить клип |
speed |
1 |
Скорость воспроизведения |
В редакторе его карточка инспектора показывает клипы модели в дропдауне и умеет
Preview/Stop клипа вживую во время редактирования. Для управления в рантайме (переключение
клипов из своего кода, перемотка, события) используй model.anim напрямую — этот
аспект только нажимает play при загрузке.