(UE4) 如何仅使用 C++ 设置骨骼的位置

Wol*_*lff 0 c++ unreal-engine4

我只是想知道是否有一种方法可以将骨架网格物体的骨骼设置到 C++ 中的特定位置。我不想使用蓝图,而且我没有找到一个好的方法。

Bas*_*eld 5

查找 UPostableMeshComponent。它允许您设置每个骨架的骨骼的变换。

编辑:

以下是我如何在项目中使用 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;
}
Run Code Online (Sandbox Code Playgroud)

接收此数据的类有一个 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));
Run Code Online (Sandbox Code Playgroud)

请注意,SkeletonDataActual 属于 FSkeletonData 类型,并且这些位置位于世界空间中。如果您希望它在本地空间中工作,您可能需要添加演员的位置和/或旋转。

希望对您有帮助,祝您好运!