Die Stats sind nützlich, danke für den Tipp.
Ich habe es geschafft mein Blender Mesh zuspawnen. Jetzt hatte ich gedacht, ich könnte die Knochen ansteuern und z. B. einfach mal zum Test einen rotieren. Hierzu wollte ich eine UPoseableMeshComponent und die Funktion GetBoneRotationByName sowie SetBoneRotationByName mittels eines FRotator-Objektes nutzen. Angeblich routiert auch die Knochen, allerdings sehe ich davon in der Anwendung nichts. Was mache falsch? Code siehe unten.
Mir ist leider auch noch nicht ganz die Verkettung der ganzen Klassen klar.
Ich habe einen Pawn, dieser besitzt ein Mesh, z. B. ein USkeletalMesh oder ein UPoseableMesh? Letzteres hat Knochen, hinzu kommt noch eine USceneComponent, die ich als RootComponent nutze. Was steuert denn nun eigentlich was, wie bekomme ich die PhysikEngine hinzu, was wird wann wie angezeigt und verändert, wie verkette ich alles?
Schon mal vielen Dank für die Hilfe
UCLASS()
class SPAWNPAWN_API APawnToSpawn : public APawn
{
GENERATED_BODY()
public:
// Sets default values for this pawn's properties
APawnToSpawn();
protected:
// Called when the game starts or when spawned
virtual void BeginPlay() override;
public:
// Called every frame
virtual void Tick(float DeltaTime) override;
// Called to bind functionality to input
virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;
USkeletalMeshComponent* m_mesh;
UPoseableMeshComponent* m_mesh_posable;
USceneComponent* m_scene; //als Rootobject
};
APawnToSpawn::APawnToSpawn()
{
// Set this pawn to call Tick() every frame. You can turn this off to improve performance if you don't need it.
PrimaryActorTick.bCanEverTick = true;
m_mesh = CreateDefaultSubobject<USkeletalMeshComponent>(TEXT("Mesh_PawnToSpawn"));
//m_mesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Mesh_PawnToSpawn"));
m_mesh_posable = CreateDefaultSubobject<UPoseableMeshComponent>(TEXT("Posable_Mesh_PawnToSpawn"));
m_scene = CreateDefaultSubobject<USceneComponent>(TEXT("Scene_Object"));
RootComponent = m_scene;
ConstructorHelpers::FObjectFinder<USkeletalMesh> meshFinder(ANSI_TO_TCHAR("/Game/Assets/TableTEst3"));
//ConstructorHelpers::FObjectFinder<UStaticMesh> meshFinder(ANSI_TO_TCHAR("/Game/StarterContent/Props/SM_Chair"));
//SkeletalMesh'/Game/TableTEst3.TableTEst3'
UE_LOG(LogTemp, Log, TEXT("meshFinder.Succeeded() = %i"), meshFinder.Succeeded());
if (meshFinder.Succeeded())
{
m_mesh->SetSkeletalMesh(meshFinder.Object);// SetStaticMesh, Skeletal mesh
m_mesh_posable->SetSkeletalMesh(meshFinder.Object);
m_mesh->AttachToComponent(RootComponent, FAttachmentTransformRules::KeepRelativeTransform, TEXT("Socket1"));
m_mesh_posable->AttachToComponent(RootComponent,FAttachmentTransformRules::KeepRelativeTransform , TEXT("Socket1"));
}
}
// Called when the game starts or when spawned
void APawnToSpawn::BeginPlay()
{
Super::BeginPlay();
//m_mesh->AddForce(FVector(10.f, 0.f, 0.f));
FRotator rotator = m_mesh_posable->GetBoneRotationByName("bonedown4_end", EBoneSpaces::ComponentSpace);
UE_LOG(LogTemp, Log, TEXT("rotator bonedown4_end = %d %d %d"), rotator.Pitch, rotator.Yaw, rotator.Roll);
rotator.Pitch = rotator.Pitch + 2;
rotator.Yaw = rotator.Yaw + 1;
rotator.Roll = rotator.Roll + 2;
m_mesh_posable->SetBoneRotationByName("bonedown4_end", rotator, EBoneSpaces::ComponentSpace);
rotator = m_mesh_posable->GetBoneRotationByName("bonedown4_end", EBoneSpaces::ComponentSpace);
UE_LOG(LogTemp, Log, TEXT("rotator bonedown4_end = %d %d %d"), rotator.Pitch, rotator.Yaw, rotator.Roll);
//m_mesh_posable->GetBoneMatrix(1);
}
Alles anzeigen