【UE5】CPP中使用ControlRig蓝图节点示例
基本流程

逻辑代码迁移到C++自定义ControlRig节点:
需要.Build中添加编译要用到的模块AnimationCore

RigUnit_ProceduralCharacter.h
#pragma region 计算脚部的目标朝向
//计算脚部的目标朝向
USTRUCT(meta = (DisplayName = "GetFootTargetAngle"))
struct PROCEDURALANIM_API FRigUnit_GetFootTargetAngle : public FRigUnit
{
GENERATED_BODY()
RIGVM_METHOD()
virtual void Execute() override;
UPROPERTY(meta = (Input))
FVector RigSpaceVelocity;
UPROPERTY(meta = (Output))
float FootTargetZAngle;
};
FVector EulerFromQuat(const FQuat& Rotation, EEulerRotationOrder RotationOrder = EEulerRotationOrder::ZYX, bool bUseUEHandyness = false);
FQuat FromTwoVectors(const FVector& A, const FVector& B);
#pragma endregion
RigUnit_ProceduralCharacter.cpp
#pragma region 计算脚部的目标朝向
FRigUnit_GetFootTargetAngle_Execute()
{
const float OriginalZAngle = AnimationCore::EulerFromQuat(
FromTwoVectors(FVector(0,1,0),RigSpaceVelocity)
).Z;
if (OriginalZAngle > 100)
{
FootTargetZAngle = OriginalZAngle - 180;
}
else if (OriginalZAngle < -100)
{
FootTargetZAngle = OriginalZAngle + 180;
}
else
{
FootTargetZAngle = OriginalZAngle;
}
}
FQuat FromTwoVectors(const FVector& A, const FVector& B)
{
if (A.IsNearlyZero() || B.IsNearlyZero())
{
return FQuat::Identity;
}
return FRigVMMathLibrary::FindQuatBetweenVectors(A, B);
}
#pragma endregion

对于一些蓝图和实际C++API名字不一致的节点
搜DisplayName="蓝图节点名"找对应的C++API
比如:Interpolate节点



浙公网安备 33010602011771号