(UE4) 我如何仅使用 C++ 设置骨骼的位置
(UE4) How can i set the position of bones using c++ only
我只想知道在 C++ 中是否有办法将骨架网格物体的骨骼设置到特定位置。我不想使用蓝图,也没有找到一个好的方法。
查找 UPoseableMeshComponent。它允许您为每个骨骼的骨骼设置变换。
编辑:
下面是我如何在项目中使用 PoseableMeshComponent 的示例。在我的例子中,我正在复制一个由动作捕捉数据驱动的骨架。动作捕捉数据从网络套接字接收并存储到如下所示的结构中:
USTRUCT()
struct FSkeletonData
{
GENERATED_USTRUCT_BODY()
FSkeletonData()
: Scale(1.0f)
{}
/**
* The bones' location
*/
UPROPERTY(VisibleAnywhere)
TArray<FVector> Locations;
/**
* The bones' rotation
*/
UPROPERTY(VisibleAnywhere)
TArray<FQuat> Rotations;
/**
* Scale of the skeletal mesh
*/
UPROPERTY(VisibleAnywhere)
float Scale;
}
接收此数据的 class 有一个 PoseableMeshComponent 并基于此结构更新它,如下所示:
int32 NumBones = PoseableMeshComponent->GetNumBones();
for (int32 i = 0; i < NumBones; ++i)
{
FName const BoneName = PoseableMeshComponent->GetBoneName(i);
FTransform Transform(SkeletonDataActual.Rotations[i], SkeletonDataActual.Locations[i], FVector(SkeletonDataActual.Scale));
PoseableMeshComponent->SetBoneTransformByName(BoneName, Transform, EBoneSpaces::WorldSpace);
}
PoseableMeshComponent->SetWorldScale3D(FVector(SkeletonDataActual.Scale));
注意SkeletonDataActual是FSkeletonData类型,这些位置在WorldSpace中。如果您希望它在本地 space.
中工作,您可能需要添加演员的位置 and/or 旋转
希望对你有所帮助,祝你好运!
我只想知道在 C++ 中是否有办法将骨架网格物体的骨骼设置到特定位置。我不想使用蓝图,也没有找到一个好的方法。
查找 UPoseableMeshComponent。它允许您为每个骨骼的骨骼设置变换。
编辑:
下面是我如何在项目中使用 PoseableMeshComponent 的示例。在我的例子中,我正在复制一个由动作捕捉数据驱动的骨架。动作捕捉数据从网络套接字接收并存储到如下所示的结构中:
USTRUCT()
struct FSkeletonData
{
GENERATED_USTRUCT_BODY()
FSkeletonData()
: Scale(1.0f)
{}
/**
* The bones' location
*/
UPROPERTY(VisibleAnywhere)
TArray<FVector> Locations;
/**
* The bones' rotation
*/
UPROPERTY(VisibleAnywhere)
TArray<FQuat> Rotations;
/**
* Scale of the skeletal mesh
*/
UPROPERTY(VisibleAnywhere)
float Scale;
}
接收此数据的 class 有一个 PoseableMeshComponent 并基于此结构更新它,如下所示:
int32 NumBones = PoseableMeshComponent->GetNumBones();
for (int32 i = 0; i < NumBones; ++i)
{
FName const BoneName = PoseableMeshComponent->GetBoneName(i);
FTransform Transform(SkeletonDataActual.Rotations[i], SkeletonDataActual.Locations[i], FVector(SkeletonDataActual.Scale));
PoseableMeshComponent->SetBoneTransformByName(BoneName, Transform, EBoneSpaces::WorldSpace);
}
PoseableMeshComponent->SetWorldScale3D(FVector(SkeletonDataActual.Scale));
注意SkeletonDataActual是FSkeletonData类型,这些位置在WorldSpace中。如果您希望它在本地 space.
中工作,您可能需要添加演员的位置 and/or 旋转希望对你有所帮助,祝你好运!