Skeleton3D
Иерархия костей, их опорные трансформации и текущие позы в 3D.
Skeleton3D — Entity для скелетной анимации. Кости хранятся внутри скелета, а не как отдельные дочерние Entity. Rest задаёт опорную локальную трансформацию; Pose — текущую локальную трансформацию. Для корневой кости локальное пространство совпадает с пространством скелета, для дочерней — с пространством родительской кости.
GetBoneGlobalPose объединяет позы родителей, но остаётся в пространстве скелета. Пример вычисляет мировую трансформацию существующей кости у скелета в дереве. Это чтение текущего состояния; если нужен результат конкретного модификатора, согласуйте вызов с его фазой обновления.
using Reckfell;
public static class BoneWorldExample
{
public static bool TryGetWorldTransform(Skeleton3D skeleton, string boneName,
out Transform3D worldTransform)
{
worldTransform = Transform3D.Identity;
if (!skeleton.IsInsideTree())
return false;
int index = skeleton.FindBone(boneName);
if (index < 0)
return false;
worldTransform = skeleton.GlobalTransform * skeleton.GetBoneGlobalPose(index);
return true;
}
}Имена и позы при переносе анимации рассматриваются в ретаргетинге.
Объявления сверены с C# SDK 1.0.0. Раскройте имя, чтобы увидеть сигнатуры и описание.
Конструкторы1
Skeleton3DКонструктор
public Skeleton3D();Свойства4
AnimatePhysicalBonesСвойство · Устарело
public bool AnimatePhysicalBones { get; set; }Если вы следуете рекомендуемому рабочему процессу и явно указываете PhysicalBoneSimulator3D как дочерний элемент Skeleton3D, вы можете контролировать, будет ли он затронут raycasting без запуска Skeleton3D.PhysicalBonesStartSimulation, с помощью его SkeletonModifier3D.Active.
Однако для старых (устаревших) конфигураций Skeleton3D имеет внутренний виртуальный PhysicalBoneSimulator3D для совместимости. Это свойство управляет внутренним виртуальным PhysicalBoneSimulator3D SkeletonModifier3D.Active.
ModifierCallbackModeProcessСвойство
public Skeleton3D.ModifierCallbackModeProcessEnum ModifierCallbackModeProcess { get; set; }Устанавливает время обработки для модификатора.
MotionScaleСвойство
public float MotionScale { get; set; }Положительный множитель позиционных анимационных треков костей в AnimationMixer. Не меняет трансформацию Entity или напрямую заданную SetBonePosePosition позицию. Значения <= 0 нативный setter отклоняет с восстановлением 1; не используйте 0 для остановки анимации.
ShowRestOnlyСвойство
public bool ShowRestOnly { get; set; }Если true, то кости возвращаются в исходную позу покоя, независимо от их значений. В редакторе это также предотвращает редактирование костей.
Методы60
AddBoneint
public int AddBone(string name);Добавляет новую кость с указанным именем. Возвращает индекс новой кости или -1, если этот метод не срабатывает.
Примечание: Имена костей должны быть уникальными, непустыми и не могут включать символы : и /.
| Имя | Тип | По умолчанию |
|---|---|---|
name | string | — |
intAdvancevoid
public void Advance(double delta);Вручную переместите дочерние SkeletonModifier3D на указанное время (в секундах).
Примечание: delta временно накапливается в Skeleton3D, а отложенный процесс использует накопленное значение для обработки модификации.
| Имя | Тип | По умолчанию |
|---|---|---|
delta | double | — |
ClearBonesvoid
public void ClearBones();Очистите этот скелет от всех костей.
ClearBonesGlobalPoseOverridevoid · Устарело
public void ClearBonesGlobalPoseOverride();Удаляет глобальное переопределение позы для всех костей скелета.
CreateSkinFromRestTransformsSkin
public Skin CreateSkinFromRestTransforms();SkinFindBoneint
public int FindBone(string name);Возвращает индекс кости, который соответствует name в качестве имени. Возвращает -1, если кости с таким именем не существует.
| Имя | Тип | По умолчанию |
|---|---|---|
name | string | — |
intForceUpdateAllBoneTransformsvoid · Устарело
public void ForceUpdateAllBoneTransforms();Принудительно обновляет трансформации/позы костей для всех костей скелета.
ForceUpdateBoneChildTransformvoid
public void ForceUpdateBoneChildTransform(int boneIdx);Принудительно обновляет преобразование кости для кости с параметром bone_idx и всех ее дочерних элементов.
| Имя | Тип | По умолчанию |
|---|---|---|
boneIdx | int | — |
GetAnimatePhysicalBonesbool
public bool GetAnimatePhysicalBones();boolGetBoneChildrenint[]
public int[] GetBoneChildren(int boneIdx);Возвращает массив, содержащий индексы костей всех дочерних узлов переданной кости, bone_idx.
| Имя | Тип | По умолчанию |
|---|---|---|
boneIdx | int | — |
int[]GetBoneCountint
public int GetBoneCount();Возвращает количество костей в скелете.
intGetBoneGlobalPoseTransform3D
public Transform3D GetBoneGlobalPose(int boneIdx);Вычисляет текущую позу кости с учётом её родителей, в системе координат Skeleton3D. Слово Global здесь не означает мировую трансформацию. Для мира умножьте Skeleton3D.GlobalTransform на результат. Значение зависит от текущей фазы обновления анимации и модификаторов.
| Имя | Тип | По умолчанию |
|---|---|---|
boneIdx | int | — |
boneIdxИндекс существующей кости: 0 <= boneIdx < GetBoneCount(). Результат FindBone сначала проверьте на -1.
Transform3DТрансформация в системе Skeleton3D, без мировой трансформации Entity.
GetBoneGlobalPoseNoOverrideTransform3D · Устарело
public Transform3D GetBoneGlobalPoseNoOverride(int boneIdx);Возвращает общую трансформацию указанной кости относительно скелета, но без глобальных переопределений позы. Будучи относительно скелетного кадра, это не фактическая "глобальная" трансформация кости.
| Имя | Тип | По умолчанию |
|---|---|---|
boneIdx | int | — |
Transform3DGetBoneGlobalPoseOverrideTransform3D · Устарело
public Transform3D GetBoneGlobalPoseOverride(int boneIdx);Возвращает глобальное преобразование переопределения позы для bone_idx.
| Имя | Тип | По умолчанию |
|---|---|---|
boneIdx | int | — |
Transform3DGetBoneGlobalRestTransform3D
public Transform3D GetBoneGlobalRest(int boneIdx);Читает композицию Rest кости и её родителей в системе Skeleton3D. Не использует текущие анимационные позы и не включает мировую трансформацию самого скелета.
| Имя | Тип | По умолчанию |
|---|---|---|
boneIdx | int | — |
boneIdxИндекс существующей кости: 0 <= boneIdx < GetBoneCount(). Результат FindBone сначала проверьте на -1.
Transform3DТрансформация в системе Skeleton3D, без мировой трансформации Entity.
GetBoneMetaVariant
public Variant GetBoneMeta(int boneIdx, StringName key);Возвращает метаданные с заданным ключом key для кости по индексу bone_idx.
| Имя | Тип | По умолчанию |
|---|---|---|
boneIdx | int | — |
key | StringName | — |
VariantGetBoneMetaListReckfell.Collections.Array<StringName>
public Reckfell.Collections.Array<StringName> GetBoneMetaList(int boneIdx);Возвращает список всех ключей метаданных для кости по индексу bone_idx.
| Имя | Тип | По умолчанию |
|---|---|---|
boneIdx | int | — |
Reckfell.Collections.Array<StringName>GetBoneNamestring
public string GetBoneName(int boneIdx);Возвращает имя кости по индексу bone_idx.
| Имя | Тип | По умолчанию |
|---|---|---|
boneIdx | int | — |
stringGetBoneParentint
public int GetBoneParent(int boneIdx);Возвращает индекс кости, которая является родителем кости в bone_idx. Если -1, то у кости нет родителя.
Примечание: Возвращаемая родительская кость всегда будет меньше, чем bone_idx.
| Имя | Тип | По умолчанию |
|---|---|---|
boneIdx | int | — |
intGetBonePoseTransform3D
public Transform3D GetBonePose(int boneIdx);Читает текущую локальную трансформацию кости относительно родительской кости, либо скелета для корня. Это не дополнительная трансформация, автоматически умножаемая на Rest. Анимация и модификаторы могут изменить позу в своей фазе обновления.
| Имя | Тип | По умолчанию |
|---|---|---|
boneIdx | int | — |
boneIdxИндекс существующей кости: 0 <= boneIdx < GetBoneCount(). Результат FindBone сначала проверьте на -1.
Transform3DЛокальная трансформация относительно родительской кости, либо скелета для корня.
GetBonePosePositionVector3
public Vector3 GetBonePosePosition(int boneIdx);Читает позиционную часть локальной Bone Pose относительно родительской кости; для корневой кости — относительно скелета. Это не мировая позиция и не общая позиция дочерней кости в скелете.
| Имя | Тип | По умолчанию |
|---|---|---|
boneIdx | int | — |
boneIdxИндекс существующей кости: 0 <= boneIdx < GetBoneCount(). Результат FindBone сначала проверьте на -1.
Vector3Локальная позиция в системе родительской кости, либо скелета для корня.
GetBonePoseRotationQuaternion
public Quaternion GetBonePoseRotation(int boneIdx);Возвращает вращение позы кости в bone_idx. Возвращаемый Quaternion является локальным для кости по отношению к вращению любых родительских костей.
| Имя | Тип | По умолчанию |
|---|---|---|
boneIdx | int | — |
QuaternionGetBonePoseScaleVector3
public Vector3 GetBonePoseScale(int boneIdx);Возвращает масштаб позы кости в bone_idx.
| Имя | Тип | По умолчанию |
|---|---|---|
boneIdx | int | — |
Vector3GetBoneRestTransform3D
public Transform3D GetBoneRest(int boneIdx);Читает опорную трансформацию кости относительно её родительской кости, либо скелета для корня. Это отдельные данные от изменяемой текущей позы.
| Имя | Тип | По умолчанию |
|---|---|---|
boneIdx | int | — |
boneIdxИндекс существующей кости: 0 <= boneIdx < GetBoneCount(). Результат FindBone сначала проверьте на -1.
Transform3DЛокальная трансформация относительно родительской кости, либо скелета для корня.
GetBoneSkinScaleVector3
public Vector3 GetBoneSkinScale(int boneIdx);Возвращает размер кожи кости в bone_idx.
| Имя | Тип | По умолчанию |
|---|---|---|
boneIdx | int | — |
Vector3GetConcatenatedBoneNamesStringName
public StringName GetConcatenatedBoneNames();Возвращает все имена костей, объединенные запятыми (,) как один StringName.
Полезно задать его как подсказку для свойства enum.
StringNameGetModifierCallbackModeProcessSkeleton3D.ModifierCallbackModeProcessEnum
public Skeleton3D.ModifierCallbackModeProcessEnum GetModifierCallbackModeProcess();Skeleton3D.ModifierCallbackModeProcessEnumGetMotionScalefloat
public float GetMotionScale();floatGetParentlessBonesint[]
public int[] GetParentlessBones();Возвращает массив со всеми костями, которые не имеют родителей. Другой способ взглянуть на это — это то, что он возвращает индексы всех костей, которые не зависят или не изменяются другими костями в Скелете.
int[]GetVersionulong
public ulong GetVersion();Возвращает количество раз, когда иерархия костей изменялась в этом скелете, включая переименования. Версия скелета не сериализуется: используется только в одном экземпляре Skeleton3D. Используется для аннулирования кэшей в IK и других узлах, которые обрабатывают кости.
ulongHasBoneMetabool
public bool HasBoneMeta(int boneIdx, StringName key);Возвращает true, если кость с индексом bone_idx имеет метаданные с заданным key.
| Имя | Тип | По умолчанию |
|---|---|---|
boneIdx | int | — |
key | StringName | — |
boolIsBoneEnabledbool
public bool IsBoneEnabled(int boneIdx);Возвращает, включена ли поза кости для кости в bone_idx.
| Имя | Тип | По умолчанию |
|---|---|---|
boneIdx | int | — |
boolIsShowRestOnlybool
public bool IsShowRestOnly();boolLocalizeRestsvoid
public void LocalizeRests();Возвращает все кости скелета в исходное (rest) положение.
PhysicalBonesAddCollisionExceptionvoid · Устарело
public void PhysicalBonesAddCollisionException(Rid exception);Добавляет исключение столкновения к физической кости.
Работает так же, как узел RigidBody3D.
| Имя | Тип | По умолчанию |
|---|---|---|
exception | Rid | — |
PhysicalBonesRemoveCollisionExceptionvoid · Устарело
public void PhysicalBonesRemoveCollisionException(Rid exception);Удаляет исключение столкновения с физической костью.
Работает так же, как узел RigidBody3D.
| Имя | Тип | По умолчанию |
|---|---|---|
exception | Rid | — |
PhysicalBonesStartSimulationvoid · Устарело
public void PhysicalBonesStartSimulation(Reckfell.Collections.Array<StringName> bones = null);Сообщает узлам PhysicalBone3D в скелете начать симуляцию и реагировать на физический мир.
При желании можно передать список имен костей, что позволит моделировать только переданные кости.
| Имя | Тип | По умолчанию |
|---|---|---|
bones | Reckfell.Collections.Array<StringName> | null |
PhysicalBonesStopSimulationvoid · Устарело
public void PhysicalBonesStopSimulation();Сообщает узлам PhysicalBone3D в скелете о необходимости прекратить симуляцию.
RegisterSkinSkinReference
public SkinReference RegisterSkin(Skin skin);Привязывает указанный Skin к скелету.
| Имя | Тип | По умолчанию |
|---|---|---|
skin | Skin | — |
SkinReferenceResetBonePose2 перегрузки
public void ResetBonePose(int boneIdx);Копирует позицию, вращение и масштаб из Rest в текущую локальную позу одной кости. Не сбрасывает анимационный проигрыватель; следующая анимация или модификатор может снова изменить позу. Перегрузка без bool сохраняет отдельный Bone Skin Scale.
| Имя | Тип | По умолчанию |
|---|---|---|
boneIdx | int | — |
boneIdxИндекс существующей кости: 0 <= boneIdx < GetBoneCount(). Результат FindBone сначала проверьте на -1.
public void ResetBonePose(int boneIdx, bool resetBoneSkinScale = false);Копирует позицию, вращение и масштаб из Rest в текущую локальную позу одной кости. Не сбрасывает анимационный проигрыватель; следующая анимация или модификатор может снова изменить позу. Перегрузка без bool сохраняет отдельный Bone Skin Scale.
| Имя | Тип | По умолчанию |
|---|---|---|
boneIdx | int | — |
resetBoneSkinScale | bool | false |
boneIdxИндекс существующей кости: 0 <= boneIdx < GetBoneCount(). Результат FindBone сначала проверьте на -1.
resetBoneSkinScaleПри true дополнительно сбросить отдельный Bone Skin Scale к (1, 1, 1); при false сохранить его. Это не флаг сброса обычного масштаба Pose, который копируется из Rest в обоих случаях.
ResetBonePoses2 перегрузки
public void ResetBonePoses();Выполняет сброс позы из Rest для каждой кости. Не меняет сами Rest и не останавливает анимацию. Перегрузка без bool сохраняет отдельные Bone Skin Scale.
public void ResetBonePoses(bool resetBoneSkinScale = false);Выполняет сброс позы из Rest для каждой кости. Не меняет сами Rest и не останавливает анимацию. Перегрузка без bool сохраняет отдельные Bone Skin Scale.
| Имя | Тип | По умолчанию |
|---|---|---|
resetBoneSkinScale | bool | false |
resetBoneSkinScaleПри true дополнительно сбросить отдельный Bone Skin Scale к (1, 1, 1); при false сохранить его. Это не флаг сброса обычного масштаба Pose, который копируется из Rest в обоих случаях.
SetAnimatePhysicalBonesvoid
public void SetAnimatePhysicalBones(bool enabled);| Имя | Тип | По умолчанию |
|---|---|---|
enabled | bool | — |
SetBoneEnabledvoid
public void SetBoneEnabled(int boneIdx, bool enabled = true);Отключает позу кости в bone_idx если false, включает позу кости если true.
| Имя | Тип | По умолчанию |
|---|---|---|
boneIdx | int | — |
enabled | bool | true |
SetBoneGlobalPosevoid
public void SetBoneGlobalPose(int boneIdx, Transform3D pose);Устанавливает глобальное преобразование позы, pose, для кости в bone_idx.
Примечание: Если были изменены другие позы костей, этот метод выполняет грязный пересчет поз и приведет к ухудшению производительности. Если вы знаете, что будет применено несколько глобальных поз, рассмотрите возможность использования Skeleton3D.SetBonePose с предварительным расчетом.
| Имя | Тип | По умолчанию |
|---|---|---|
boneIdx | int | — |
pose | Transform3D | — |
SetBoneGlobalPoseOverridevoid · Устарело
public void SetBoneGlobalPoseOverride(int boneIdx, Transform3D pose, float amount, bool persistent = false);Устанавливает глобальное преобразование позы, pose, для кости в bone_idx.
amount — это сила интерполяции, которая будет использоваться при применении позы, а persistent определяет, останется ли примененная поза.
Примечание: Преобразование позы должно быть глобальным! Чтобы преобразовать мировое преобразование из Entity3D в глобальную позу кости, умножьте Transform3D.AffineInverse узла Entity3D.GlobalTransform на желаемое мировое преобразование.
| Имя | Тип | По умолчанию |
|---|---|---|
boneIdx | int | — |
pose | Transform3D | — |
amount | float | — |
persistent | bool | false |
SetBoneMetavoid
public void SetBoneMeta(int boneIdx, StringName key, Variant value);Устанавливает метаданные с заданным значением key равным value для кости с индексом bone_idx.
| Имя | Тип | По умолчанию |
|---|---|---|
boneIdx | int | — |
key | StringName | — |
value | Variant | — |
SetBoneNamevoid
public void SetBoneName(int boneIdx, string name);Устанавливает имя кости name для кости с параметром bone_idx.
| Имя | Тип | По умолчанию |
|---|---|---|
boneIdx | int | — |
name | string | — |
SetBoneParentvoid
public void SetBoneParent(int boneIdx, int parentIdx);Устанавливает индекс кости parent_idx как родительский для кости в bone_idx. Если -1, то у кости нет родителя.
Примечание: parent_idx должен быть меньше bone_idx.
| Имя | Тип | По умолчанию |
|---|---|---|
boneIdx | int | — |
parentIdx | int | — |
SetBonePosevoid
public void SetBonePose(int boneIdx, Transform3D pose);Устанавливает преобразование позы pose для кости с bone_idx.
| Имя | Тип | По умолчанию |
|---|---|---|
boneIdx | int | — |
pose | Transform3D | — |
SetBonePosePositionvoid
public void SetBonePosePosition(int boneIdx, Vector3 position);Заменяет позиционную часть локальной позы относительно родительской кости, либо скелета для корня. Не прибавляет position к Rest. Не меняет Rest, вращение или масштаб; последующее обновление анимации/модификаторов может перезаписать позу.
| Имя | Тип | По умолчанию |
|---|---|---|
boneIdx | int | — |
position | Vector3 | — |
boneIdxИндекс существующей кости: 0 <= boneIdx < GetBoneCount(). Результат FindBone сначала проверьте на -1.
positionНовая локальная позиция относительно родительской кости; для корневой кости — относительно Skeleton3D. Не мировая позиция и не добавка к Rest.
SetBonePoseRotationvoid
public void SetBonePoseRotation(int boneIdx, Quaternion rotation);Устанавливает вращение позы кости в bone_idx на rotation. rotation — это Quaternion, описывающий вращение в локальном координатном пространстве кости относительно вращения любых родительских костей.
| Имя | Тип | По умолчанию |
|---|---|---|
boneIdx | int | — |
rotation | Quaternion | — |
SetBonePoseScalevoid
public void SetBonePoseScale(int boneIdx, Vector3 scale);Устанавливает масштаб позы кости в bone_idx на scale.
| Имя | Тип | По умолчанию |
|---|---|---|
boneIdx | int | — |
scale | Vector3 | — |
SetBoneRestvoid
public void SetBoneRest(int boneIdx, Transform3D rest);Задаёт локальную опорную трансформацию. Сам по себе не заменяет текущую позу: для возврата к новому Rest вызовите ResetBonePose или ResetBonePoses. Изменение Rest затрагивает опорную геометрию скелета; проверяйте скин и анимацию отдельно.
| Имя | Тип | По умолчанию |
|---|---|---|
boneIdx | int | — |
rest | Transform3D | — |
boneIdxИндекс существующей кости: 0 <= boneIdx < GetBoneCount(). Результат FindBone сначала проверьте на -1.
restЛокальная опорная трансформация кости относительно родителя. Для общего пространства скелета используйте согласованное преобразование родителей.
SetBoneSkinScalevoid
public void SetBoneSkinScale(int boneIdx, Vector3 skinScale);Устанавливает размер кожи кости на bone_idx в адрес skin_scaleЭта шкала не влияет на костных детей, что полезно для изменения визуальной толщины кожи.
Даже если кожа является визуально деформированной, не происходит ни масштабирования, ни перемещения костей. Это означает, что, возможно, необходимо скорректировать происхождение детской кости для синхронизации ее сустава с масштабированием путем использования BoneSpaceAdjuster3D.
Примечание: Маскировка кожи может исказить внешний вид гизмо для некоторых классов скелета Модификатора, таких как SpringBoneSimular и SpringSimulator. IKModifier3D, которые зависят от длины костей для обнажения.
| Имя | Тип | По умолчанию |
|---|---|---|
boneIdx | int | — |
skinScale | Vector3 | — |
SetModifierCallbackModeProcessvoid
public void SetModifierCallbackModeProcess(Skeleton3D.ModifierCallbackModeProcessEnum mode);| Имя | Тип | По умолчанию |
|---|---|---|
mode | Skeleton3D.ModifierCallbackModeProcessEnum | — |
SetMotionScalevoid
public void SetMotionScale(float motionScale);| Имя | Тип | По умолчанию |
|---|---|---|
motionScale | float | — |
SetShowRestOnlyvoid
public void SetShowRestOnly(bool enabled);| Имя | Тип | По умолчанию |
|---|---|---|
enabled | bool | — |
UnparentBoneAndRestvoid
public void UnparentBoneAndRest(int boneIdx);Делает кость bone_idx без родительской, и устанавливает ее положение покоя в положение родительской кости перед сбросом.
| Имя | Тип | По умолчанию |
|---|---|---|
boneIdx | int | — |
Сигналы и события6
BoneEnabledChangedСобытие
public event Skeleton3D.BoneEnabledChangedEventHandler BoneEnabledChanged;Выдается, когда кость в bone_idx переключается с помощью Skeleton3D.SetBoneEnabled. Используйте Skeleton3D.IsBoneEnabled для проверки нового значения.
| Имя | Тип | По умолчанию |
|---|---|---|
boneIdx | long | — |
BoneListChangedСобытие
public event Action BoneListChanged;Вызывается при изменении списка костей, например, при вызове Skeleton3D.AddBone, Skeleton3D.SetBoneParent, Skeleton3D.UnparentBoneAndRest или Skeleton3D.ClearBones.
PoseUpdatedСобытие
public event Action PoseUpdated;Выдается при обновлении позы.
Примечание: Во время процесса обновления этот сигнал не срабатывает, поэтому модификация SkeletonModifier3D не обнаруживается.
RestUpdatedСобытие
public event Action RestUpdated;Выдается при обновлении rest данных.
ShowRestOnlyChangedСобытие
public event Action ShowRestOnlyChanged;Вызывается при изменении значения Skeleton3D.ShowRestOnly.
SkeletonUpdatedСобытие
public event Action SkeletonUpdated;Выдается, когда рассчитана окончательная поза, будет применена к skin'у в процессе обновления.
Это означает, что вся обработка SkeletonModifier3D завершена. Чтобы обнаружить завершение обработки каждого SkeletonModifier3D, используйте SkeletonModifier3D.ModificationProcessed.
Поля и константы1
NotificationUpdateSkeletonПоле
public const long NotificationUpdateSkeleton = 50;Уведомление получено, когда поза этого скелета должна быть обновлена. В этом случае это вызывается только один раз за кадр в отложенном процессе.
Skeleton3D.ModifierCallbackModeProcessEnum
| Значение | Описание |
|---|---|
Idle = 1 | Установите флаг для модификации процесса во время кадров процесса (см. |
Manual = 2 | Не обрабатывать модификации. Используйте |
Physics = 0 | Установите флаг для обработки изменений во время физических кадров (см. |