Hi, I have been working with Unreal for only the past few days and am trying to rotate a bone in an armature but am having no success.
I used my armature “simple.fbx” in my scene and have added the MyActor component directly to it. I see the category labeled “My Category” and have two variables there, one for assigning the skeleton mesh and the other a vector so I may manually adjust a FRotator that is passed into SetBoneRotationByName
for rotating the “Chest” bone.
Despite my best efforts this line just does not seem to work:
myMesh->SetBoneRotationByName(TEXT("Chest"), r, EBoneSpaces::WorldSpace);
Here is my scene and the SkeletalMesh object:
And this is the armature’s skeleton tree:
When I press play I see the UE_LOG printing for each tick, but if I change the values of the myRotation
vector I do not see any changes on the armature.
I was wondering if I am doing something wrong with my code. I have very little experience with Unreal but have been trying to follow tutorials as best I can (there are so few good tutorials).
This script took me days to write/understand but I still can’t make it work. Why is the Chest bone of my armature not rotating at all?
Thank you for looking at my post!
MyActor.h
#pragma once
#include "CoreMinimal.h"
#include "Components/ActorComponent.h"
#include "Components/PoseableMeshComponent.h"
#include "MyActor.generated.h"
UCLASS( ClassGroup=(Custom), meta=(BlueprintSpawnableComponent) )
class FIRSTCPPGAMELESSON_API UMyActor : public UActorComponent
{
GENERATED_BODY()
public:
UMyActor();
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "MyCategory")
FVector myRotation;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "MyCategory")
UPoseableMeshComponent* myMesh = nullptr;
protected:
virtual void BeginPlay() override;
public:
virtual void TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override;
};
MyActor.cpp
#include "MyActor.h"
UMyActor::UMyActor()
{
PrimaryComponentTick.bCanEverTick = true;
}
void UMyActor::BeginPlay()
{
Super::BeginPlay();
}
void UMyActor::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction)
{
Super::TickComponent(DeltaTime, TickType, ThisTickFunction);
//int32 numBones = mesh2->GetNumBones();
FRotator r;
r.Roll = myRotation.X;
r.Pitch = myRotation.Y;
r.Yaw = myRotation.Z;
UE_LOG(LogTemp, Log, TEXT("Rot I %d"), r.Yaw );
//DIDNT WORK: //mesh2->SetBoneRotationByName("Chest", r, EBoneSpaces::WorldSpace);
myMesh->SetBoneRotationByName(TEXT("Chest"), r, EBoneSpaces::WorldSpace);
}