XRBodyModifier3D
Применение данных тела к сопоставленным костям скелета.
XRBodyModifier3D работает под Skeleton3D с данными XRBodyTracker. По умолчанию BodyTracker=/user/body_tracker, BodyUpdate включает UpperBody/LowerBody/Hands, BoneUpdate=Full. Наличие модификатора не подключает устройство и не восстанавливает скелет по нескольким трекерам.
Имена и иерархия костей должны соответствовать данным. Full применяет относительные позиции и вращения; RotationOnly оставляет большинство базовых позиций, но Hips всё равно обновляется. MotionScale умножает позиции до относительного преобразования. BodyUpdate=0 не выключает все дополнительные суставы; Active=false отключает обработку полностью.
Смена BodyTracker выбирает новый источник на следующей обработке без пересопоставления, если Skeleton и BodyUpdate не менялись. При отсутствии tracker, HasTrackingData=false или невалидном Root обновление пропускается; сохранённая pose руки здесь не воспроизводится.
Skeleton3D временно применяет модификаторы и восстанавливает базовую pose. Читайте результат внутри ModificationProcessed. Этот выполненный пример сохраняет копию для диагностики; LastModified может устареть, если обработка не выполняется:
using Reckfell;
public partial class BonePoseProbe : Entity
{
[Export] public Skeleton3D Skeleton { get; set; } = null!;
[Export] public SkeletonModifier3D Modifier { get; set; } = null!;
[Export] public int Bone { get; set; }
public Transform3D LastModified { get; private set; } = Transform3D.Identity;
public override void _Ready()
{
if (Skeleton is null || Modifier is null || Modifier.GetSkeleton() != Skeleton
|| Bone < 0 || Bone >= Skeleton.GetBoneCount())
{
ReckfellApi.PushError("BonePoseProbe: assign a matching skeleton, modifier and bone index.");
return;
}
Modifier.ModificationProcessed += Capture;
}
private void Capture() => LastModified = Skeleton.GetBonePose(Bone);
public override void _ExitTree()
{
if (Modifier is not null && ReckfellObject.IsInstanceValid(Modifier))
Modifier.ModificationProcessed -= Capture;
}
}Проверены 14 сценариев с настоящим Skeleton3D и искусственными данными всех 87 суставов. Диагностическая иерархия содержит Spine под Hips и остальные не-корневые кости под Root; это не оценка настоящего Humanoid-рига. Корректность частично невалидных родителей, skin weights, деформация, смешивание анимации, устройство и изображение не проверены. Согласованные валидные родительские суставы обязательны.
Reader и требования к поставщику: отслеживание тела.
Объявления сверены с C# SDK 1.0.0. Раскройте имя, чтобы увидеть сигнатуры и описание.
Конструкторы1
XRBodyModifier3DКонструктор
public XRBodyModifier3D();Создаёт модификатор с BodyTracker=/user/body_tracker, всеми областями BodyUpdate и BoneUpdate=Full. Для работы нужен Skeleton3D-родитель, согласованные имена костей и поставщик XRBodyTracker. Один конструктор tracking не включает.
Свойства3
BodyTrackerСвойство
public StringName BodyTracker { get; set; }Имя XRBodyTracker, изначально /user/body_tracker. Setter сохраняет только строку, не подключает поставщика и не перестраивает карту костей. Смена имени выбирает другой источник для следующей обработки; карта костей определяется Skeleton и BodyUpdate, а не именем tracker.
BodyUpdateСвойство
public XRBodyModifier3D.BodyUpdateEnum BodyUpdate { get; set; }Маска областей сопоставления: UpperBody, LowerBody, Hands; по умолчанию все три. Setter перестраивает карту костей, если модификатор в дереве. Это фильтр диапазонов основных суставов; Root и дополнительные суставы не исключаются универсально. Для полного выключения используйте унаследованное Active=false.
BoneUpdateСвойство
public XRBodyModifier3D.BoneUpdateEnum BoneUpdate { get; set; }Режим костей, изначально Full. Full обновляет позиции и вращения; RotationOnly обновляет вращения, но Hips всё равно получает позицию. Проверяется диапазон enum. Не создаёт skin weights и не решает калибровку, масштаб или размещение аватара.
Методы6
GetBodyTrackerStringName
public StringName GetBodyTracker();Настроенное имя tracker, не подтверждение его наличия или данных.
StringNameИмя поставщика, изначально /user/body_tracker.
GetBodyUpdateXRBodyModifier3D.BodyUpdateEnum
public XRBodyModifier3D.BodyUpdateEnum GetBodyUpdate();Настроенная маска фильтра сопоставления, не возможности реального тела.
XRBodyModifier3D.BodyUpdateEnumНастроенная маска регионов модификатора.
GetBoneUpdateXRBodyModifier3D.BoneUpdateEnum
public XRBodyModifier3D.BoneUpdateEnum GetBoneUpdate();Настроенный режим Full/RotationOnly; у RotationOnly сохраняется исключение позиции Hips.
XRBodyModifier3D.BoneUpdateEnumНастроенный режим костей, изначально Full.
SetBodyTrackervoid
public void SetBodyTracker(StringName trackerName);Имя XRBodyTracker, изначально /user/body_tracker. Setter сохраняет только строку, не подключает поставщика и не перестраивает карту костей. Смена имени выбирает другой источник для следующей обработки; карта костей определяется Skeleton и BodyUpdate, а не именем tracker.
| Имя | Тип | По умолчанию |
|---|---|---|
trackerName | StringName | — |
trackerNameТочное имя зарегистрированного XRBodyTracker. Смена имени не требует пересопоставления, если Skeleton и BodyUpdate не менялись.
SetBodyUpdatevoid
public void SetBodyUpdate(XRBodyModifier3D.BodyUpdateEnum bodyUpdate);Маска областей сопоставления: UpperBody, LowerBody, Hands; по умолчанию все три. Setter перестраивает карту костей, если модификатор в дереве. Это фильтр диапазонов основных суставов; Root и дополнительные суставы не исключаются универсально. Для полного выключения используйте унаследованное Active=false.
| Имя | Тип | По умолчанию |
|---|---|---|
bodyUpdate | XRBodyModifier3D.BodyUpdateEnum | — |
bodyUpdateМаска UpperBody/LowerBody/Hands; 0 не является универсальным выключателем обработки.
SetBoneUpdatevoid
public void SetBoneUpdate(XRBodyModifier3D.BoneUpdateEnum boneUpdate);Режим костей, изначально Full. Full обновляет позиции и вращения; RotationOnly обновляет вращения, но Hips всё равно получает позицию. Проверяется диапазон enum. Не создаёт skin weights и не решает калибровку, масштаб или размещение аватара.
| Имя | Тип | По умолчанию |
|---|---|---|
boneUpdate | XRBodyModifier3D.BoneUpdateEnum | — |
boneUpdateFull или RotationOnly; Max — граница enum. У Hips позиция обновляется в обоих режимах.
XRBodyModifier3D.BodyUpdateEnum
| Значение | Описание |
|---|---|
Hands = 4 | Обновить суставы рук скелета. |
LowerBody = 2 | Обновить суставы нижней части тела скелета. |
UpperBody = 1 | Обновить суставы верхней части тела скелета. |
XRBodyModifier3D.BoneUpdateEnum
| Значение | Описание |
|---|---|
Full = 0 | Кости скелета полностью обновлены (как положение, так и поворот) для соответствия отслеживаемым костям. |
Max = 2 | Представляет размер перечисления |
RotationOnly = 1 | Кости скелета поворачиваются только для того, чтобы выровняться с отслеживаемыми костями, сохраняя длину костей. |