XRHandModifier3D
Применение суставов руки к именованным костям скелета.
XRHandModifier3D применяется под Skeleton3D. Он ищет Left/Right-prefixed Humanoid-кости по руке tracker, например LeftHand и LeftIndexProximal. Полностью согласованные имена и иерархия нужны до проверки деформации настоящей модели.
Full меняет позиции и вращения, RotationOnly — вращения. Вычисляются трансформы относительно родительского сустава; MotionScale скелета применяется к позициям. При HasTrackingData=false после первой валидной обработки повторяется сохранённая pose. При невалидной Palm с HasTrackingData=true обработка пропускается; это другой случай.
Результат модификатора временный: читайте pose внутри ModificationProcessed, до восстановления базовой pose Skeleton3D. Пример ниже сохраняет копию; LastModified может устареть при отключении модификатора или потере источника:
using Reckfell;
public partial class HandPoseProbe : Entity
{
[Export] public Skeleton3D Skeleton { get; set; } = null!;
[Export] public XRHandModifier3D 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("HandPoseProbe: 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;
}
}Важное ограничение исходника: проверка ORIENTATION_VALID не превращается в проверку каждого дочернего сустава перед применением. Частично невалидные дочерние данные этим тестом не приняты; для используемой иерархии нужен согласованный валидный набор суставов и родителей. Active=false отключает обработку. Не пытайтесь скрыть невалидность ручной подстановкой флагов у настоящего поставщика.
Выполнены 14 проверок с настоящим Skeleton3D, всеми 26 сопоставленными костями и искусственными суставами. Проверены режимы, cache, MotionScale, смена tracker и точный HandPoseProbe. Реальные руки, skin weights, деформация, смешивание анимации и качество изображения не проверены. Настройка и pinch: отслеживание рук.
Объявления сверены с C# SDK 1.0.0. Раскройте имя, чтобы увидеть сигнатуры и описание.
Конструкторы1
XRHandModifier3DКонструктор
public XRHandModifier3D();Создаёт модификатор с левым HandTracker и BoneUpdate=Full. Добавьте под Skeleton3D с согласованными именами костей и поставщиком XRHandTracker. Сам не создаёт модель, skin weights, коллизии или XR-сеанс.
Свойства2
BoneUpdateСвойство
public XRHandModifier3D.BoneUpdateEnum BoneUpdate { get; set; }Режим обновления, изначально Full. Full применяет относительные позиции и вращения; RotationOnly оставляет базовые позиции костей и применяет вращения. Позиции данных умножаются на MotionScale скелета, не на WorldScale автоматически. При потере данных всей руки может повторно применяться предыдущая относительная pose.
HandTrackerСвойство
public StringName HandTracker { get; set; }Имя XRHandTracker, изначально /user/hand_tracker/left. В дереве setter перестраивает сопоставление костей и очищает сохранённые относительные трансформы, даже при повторе имени. Не присваивайте каждый кадр. Не создаёт tracker и не включает аппаратное tracking.
Методы4
GetBoneUpdateXRHandModifier3D.BoneUpdateEnum
public XRHandModifier3D.BoneUpdateEnum GetBoneUpdate();Настроенный Full/RotationOnly. Это не состояние tracking или успешность обработки скелета.
XRHandModifier3D.BoneUpdateEnumСохранённый режим костей.
GetHandTrackerStringName
public StringName GetHandTracker();Настроенное имя tracker; не проверяет его наличие или свежесть данных.
StringNameСохранённое имя tracker.
SetBoneUpdatevoid
public void SetBoneUpdate(XRHandModifier3D.BoneUpdateEnum boneUpdate);Режим обновления, изначально Full. Full применяет относительные позиции и вращения; RotationOnly оставляет базовые позиции костей и применяет вращения. Позиции данных умножаются на MotionScale скелета, не на WorldScale автоматически. При потере данных всей руки может повторно применяться предыдущая относительная pose.
| Имя | Тип | По умолчанию |
|---|---|---|
boneUpdate | XRHandModifier3D.BoneUpdateEnum | — |
boneUpdateFull или RotationOnly; Max — граница, не режим. Диапазон проверяется native setter.
SetHandTrackervoid
public void SetHandTracker(StringName trackerName);Имя XRHandTracker, изначально /user/hand_tracker/left. В дереве setter перестраивает сопоставление костей и очищает сохранённые относительные трансформы, даже при повторе имени. Не присваивайте каждый кадр. Не создаёт tracker и не включает аппаратное tracking.
| Имя | Тип | По умолчанию |
|---|---|---|
trackerName | StringName | — |
trackerNameИмя левого/правого или собственного зарегистрированного XRHandTracker; повтор setter в дереве также сбрасывает cache.
XRHandModifier3D.BoneUpdateEnum
| Значение | Описание |
|---|---|
Full = 0 | Кости скелета полностью обновлены (как положение, так и поворот) для соответствия отслеживаемым костям. |
Max = 2 | Представляет размер перечисления |
RotationOnly = 1 | Кости скелета поворачиваются только для того, чтобы выровняться с отслеживаемыми костями, сохраняя длину костей. |