reckfellENGINE

XRHandModifier3D

Применение суставов руки к именованным костям скелета.

На этой странице
class XRHandModifier3DReckfellSharpНаследует SkeletonModifier3D

XRHandModifier3D применяется под Skeleton3D. Он ищет Left/Right-prefixed Humanoid-кости по руке tracker, например LeftHand и LeftIndexProximal. Полностью согласованные имена и иерархия нужны до проверки деформации настоящей модели.

Full меняет позиции и вращения, RotationOnly — вращения. Вычисляются трансформы относительно родительского сустава; MotionScale скелета применяется к позициям. При HasTrackingData=false после первой валидной обработки повторяется сохранённая pose. При невалидной Palm с HasTrackingData=true обработка пропускается; это другой случай.

Результат модификатора временный: читайте pose внутри ModificationProcessed, до восстановления базовой pose Skeleton3D. Пример ниже сохраняет копию; LastModified может устареть при отключении модификатора или потере источника:

C#
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Конструктор
# XRHandModifier3D
C#
public XRHandModifier3D();

Создаёт модификатор с левым HandTracker и BoneUpdate=Full. Добавьте под Skeleton3D с согласованными именами костей и поставщиком XRHandTracker. Сам не создаёт модель, skin weights, коллизии или XR-сеанс.

Свойства2

BoneUpdateСвойство
# BoneUpdate
C#
public XRHandModifier3D.BoneUpdateEnum BoneUpdate { get; set; }

Режим обновления, изначально Full. Full применяет относительные позиции и вращения; RotationOnly оставляет базовые позиции костей и применяет вращения. Позиции данных умножаются на MotionScale скелета, не на WorldScale автоматически. При потере данных всей руки может повторно применяться предыдущая относительная pose.

HandTrackerСвойство
# HandTracker
C#
public StringName HandTracker { get; set; }

Имя XRHandTracker, изначально /user/hand_tracker/left. В дереве setter перестраивает сопоставление костей и очищает сохранённые относительные трансформы, даже при повторе имени. Не присваивайте каждый кадр. Не создаёт tracker и не включает аппаратное tracking.

Методы4

GetBoneUpdateXRHandModifier3D.BoneUpdateEnum
# GetBoneUpdate
C#
public XRHandModifier3D.BoneUpdateEnum GetBoneUpdate();

Настроенный Full/RotationOnly. Это не состояние tracking или успешность обработки скелета.

Возвращает XRHandModifier3D.BoneUpdateEnum

Сохранённый режим костей.

GetHandTrackerStringName
# GetHandTracker
C#
public StringName GetHandTracker();

Настроенное имя tracker; не проверяет его наличие или свежесть данных.

Возвращает StringName

Сохранённое имя tracker.

SetBoneUpdatevoid
# SetBoneUpdate
C#
public void SetBoneUpdate(XRHandModifier3D.BoneUpdateEnum boneUpdate);

Режим обновления, изначально Full. Full применяет относительные позиции и вращения; RotationOnly оставляет базовые позиции костей и применяет вращения. Позиции данных умножаются на MotionScale скелета, не на WorldScale автоматически. При потере данных всей руки может повторно применяться предыдущая относительная pose.

Параметры
ИмяТипПо умолчанию
boneUpdateXRHandModifier3D.BoneUpdateEnum—
boneUpdate

Full или RotationOnly; Max — граница, не режим. Диапазон проверяется native setter.

SetHandTrackervoid
# SetHandTracker
C#
public void SetHandTracker(StringName trackerName);

Имя XRHandTracker, изначально /user/hand_tracker/left. В дереве setter перестраивает сопоставление костей и очищает сохранённые относительные трансформы, даже при повторе имени. Не присваивайте каждый кадр. Не создаёт tracker и не включает аппаратное tracking.

Параметры
ИмяТипПо умолчанию
trackerNameStringName—
trackerName

Имя левого/правого или собственного зарегистрированного XRHandTracker; повтор setter в дереве также сбрасывает cache.

XRHandModifier3D.BoneUpdateEnum

ЗначениеОписание
Full = 0

Кости скелета полностью обновлены (как положение, так и поворот) для соответствия отслеживаемым костям.

Max = 2

Представляет размер перечисления XRHandModifier3D.BoneUpdateEnum.

RotationOnly = 1

Кости скелета поворачиваются только для того, чтобы выровняться с отслеживаемыми костями, сохраняя длину костей.

Документация Reckfell EngineНаверх ↑
БЫСТРЫЙ ПЕРЕХОДНачало работыEntity и иерархияC# & .NET 10Сцены и префабы
Руководства и полный API Reckfell K
reckfellENGINE
RECKFELL ACCOUNT

Вход в аккаунт

Войдите в аккаунт Reckfell.

Один аккаунт для всей платформы Reckfell.