From 76ad143dbe28c6b0fa65aca8033b50ef96150163 Mon Sep 17 00:00:00 2001 From: Axel Date: Thu, 7 Oct 2021 10:54:49 +0200 Subject: [PATCH] Disabled physics for closed doors. --- .../Carla/Vehicle/CarlaWheeledVehicle.cpp | 136 ++++++++++-------- .../Carla/Vehicle/CarlaWheeledVehicle.h | 22 +-- 2 files changed, 84 insertions(+), 74 deletions(-) diff --git a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Vehicle/CarlaWheeledVehicle.cpp b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Vehicle/CarlaWheeledVehicle.cpp index 5d6f152ae..4998962a2 100644 --- a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Vehicle/CarlaWheeledVehicle.cpp +++ b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Vehicle/CarlaWheeledVehicle.cpp @@ -44,9 +44,6 @@ ACarlaWheeledVehicle::ACarlaWheeledVehicle(const FObjectInitializer& ObjectIniti BaseMovementComponent = CreateDefaultSubobject(TEXT("BaseMovementComponent")); - // We create a vector to store the update values for the animation - static uint8 MaxDoorNumber = (uint8) EVehicleDoor::All; - DoorAnimAlpha.Init(0.0, MaxDoorNumber); } ACarlaWheeledVehicle::~ACarlaWheeledVehicle() {} @@ -84,34 +81,59 @@ void ACarlaWheeledVehicle::BeginPlay() UDefaultMovementComponent::CreateDefaultMovementComponent(this); // Get constraint components and their initial transforms + FTransform ActorInverseTransform = GetActorTransform().Inverse(); ConstraintsComponents.Empty(); + DoorComponentsTransform.Empty(); + ConstraintDoor.Empty(); for (FName& ComponentName : ConstraintComponentNames) { - UPhysicsConstraintComponent* ConstraintComponent = Cast(GetDefaultSubobjectByName(ComponentName)); + UPhysicsConstraintComponent* ConstraintComponent = + Cast(GetDefaultSubobjectByName(ComponentName)); if (ConstraintComponent) { - ConstraintsComponents.Add(ConstraintComponent); - } - } - DoorComponentsTransform.Empty(); - FTransform ActorInverseTransform = GetActorTransform().Inverse(); - for (UPhysicsConstraintComponent * Constraint: ConstraintsComponents) - { - UPrimitiveComponent* DoorComponent = Cast(GetDefaultSubobjectByName(Constraint->ComponentName1.ComponentName)); - if(DoorComponent) - { - UE_LOG(LogCarla, Warning, TEXT("Door name: %s"), *(DoorComponent->GetName())); - FTransform ComponentWorldTransform = DoorComponent->GetComponentTransform(); - FTransform RelativeTransform = ComponentWorldTransform * ActorInverseTransform; - DoorComponentsTransform.Add(DoorComponent, RelativeTransform); - } - else - { - UE_LOG(LogCarla, Error, TEXT("Missing component for constraint: %s"), *(Constraint->GetName())); + UPrimitiveComponent* DoorComponent = Cast( + GetDefaultSubobjectByName(ConstraintComponent->ComponentName1.ComponentName)); + if(DoorComponent) + { + UE_LOG(LogCarla, Warning, TEXT("Door name: %s"), *(DoorComponent->GetName())); + FTransform ComponentWorldTransform = DoorComponent->GetComponentTransform(); + FTransform RelativeTransform = ComponentWorldTransform * ActorInverseTransform; + DoorComponentsTransform.Add(DoorComponent, RelativeTransform); + ConstraintDoor.Add(ConstraintComponent, DoorComponent); + ConstraintsComponents.Add(ConstraintComponent); + ConstraintComponent->TermComponentConstraint(); + } + else + { + UE_LOG(LogCarla, Error, TEXT("Missing component for constraint: %s"), *(ConstraintComponent->GetName())); + } } } ResetConstraints(); + // get collision disable constraints (used to prevent doors from colliding with each other) + CollisionDisableConstraints.Empty(); + TArray Constraints; + GetComponents(Constraints); + for (UPhysicsConstraintComponent* Constraint : Constraints) + { + if (!ConstraintsComponents.Contains(Constraint)) + { + UPrimitiveComponent* CollisionDisabledComponent1 = Cast( + GetDefaultSubobjectByName(Constraint->ComponentName1.ComponentName)); + UPrimitiveComponent* CollisionDisabledComponent2 = Cast( + GetDefaultSubobjectByName(Constraint->ComponentName2.ComponentName)); + if (CollisionDisabledComponent1) + { + CollisionDisableConstraints.Add(CollisionDisabledComponent1, Constraint); + } + if (CollisionDisabledComponent2) + { + CollisionDisableConstraints.Add(CollisionDisabledComponent2, Constraint); + } + } + } + float FrictionScale = 3.5f; UWheeledVehicleMovementComponent4W *Vehicle4W = Cast( @@ -611,32 +633,19 @@ void ACarlaWheeledVehicle::SetSimulatePhysics(bool enabled) { bPhysicsEnabled = enabled; - // Set simulate physics for doors - for (auto& ComponentTransform : DoorComponentsTransform) - { - UPrimitiveComponent* Component = ComponentTransform.Key; - Component->SetSimulatePhysics(bPhysicsEnabled); - } + ResetConstraints(); - if (bPhysicsEnabled) - { - FTransform ActorTransform = GetActorTransform(); - // recreate physics constraints - for (auto& ComponentTransform : DoorComponentsTransform) - { - UPrimitiveComponent* Component = ComponentTransform.Key; - FTransform ComponentWorldTransform = ComponentTransform.Value * ActorTransform; - Component->SetWorldTransform(ComponentWorldTransform); - } - ResetConstraints(); - } } void ACarlaWheeledVehicle::ResetConstraints() { - for (UPhysicsConstraintComponent* Constraint : ConstraintsComponents) + for (int i = 0; i < ConstraintsComponents.Num(); i++) { - Constraint->InitComponentConstraint(); + OpenDoorPhys(EVehicleDoor(i)); + } + for (int i = 0; i < ConstraintsComponents.Num(); i++) + { + CloseDoorPhys(EVehicleDoor(i)); } } @@ -687,34 +696,43 @@ void ACarlaWheeledVehicle::CloseDoor(const EVehicleDoor DoorIdx) { void ACarlaWheeledVehicle::OpenDoorPhys(const EVehicleDoor DoorIdx) { UPhysicsConstraintComponent* Constraint = ConstraintsComponents[static_cast(DoorIdx)]; + UPrimitiveComponent* DoorComponent = ConstraintDoor[Constraint]; + DoorComponent->DetachFromComponent( + FDetachmentTransformRules(EDetachmentRule::KeepWorld, false)); + FTransform DoorInitialTransform = + DoorComponentsTransform[DoorComponent] * GetActorTransform(); + DoorComponent->SetWorldTransform(DoorInitialTransform); + DoorComponent->SetSimulatePhysics(true); + DoorComponent->SetCollisionProfileName(TEXT("BlockAll")); float AngleLimit = Constraint->ConstraintInstance.GetAngularSwing1Limit(); FRotator AngularRotationOffset = Constraint->ConstraintInstance.AngularRotationOffset; + if (Constraint->ConstraintInstance.AngularRotationOffset.Yaw < 0.0f) { AngleLimit = -AngleLimit; } Constraint->SetAngularOrientationTarget(FRotator(0, AngleLimit, 0)); Constraint->SetAngularDriveParams(DoorOpenStrength, 1.0, 0.0); + + Constraint->InitComponentConstraint(); + + UPhysicsConstraintComponent** CollisionDisable = + CollisionDisableConstraints.Find(DoorComponent); + if (CollisionDisable) + { + (*CollisionDisable)->InitComponentConstraint(); + } } void ACarlaWheeledVehicle::CloseDoorPhys(const EVehicleDoor DoorIdx) { UPhysicsConstraintComponent* Constraint = ConstraintsComponents[static_cast(DoorIdx)]; - float AngleLimit = Constraint->ConstraintInstance.GetAngularSwing1Limit(); - if (Constraint->ConstraintInstance.AngularRotationOffset.Yaw < 0.0f) - { - AngleLimit = -AngleLimit; - } - Constraint->SetAngularOrientationTarget(FRotator(0, -AngleLimit, 0)); - Constraint->SetAngularDriveParams(DoorCloseStrength, 1.0, 0.0); -} - -void ACarlaWheeledVehicle::OpenDoorAnim_Implementation(const EVehicleDoor DoorIdx) -{ - UE_LOG(LogTemp, Warning, TEXT("OpenDoorAnim_Implementation.")); -} - -void ACarlaWheeledVehicle::CloseDoorAnim_Implementation(const EVehicleDoor DoorIdx) -{ - UE_LOG(LogTemp, Warning, TEXT("CloseDoorAnim_Implementation.")); + UPrimitiveComponent* DoorComponent = ConstraintDoor[Constraint]; + FTransform DoorInitialTransform = + DoorComponentsTransform[DoorComponent] * GetActorTransform(); + DoorComponent->SetSimulatePhysics(false); + DoorComponent->SetCollisionProfileName(TEXT("NoCollision")); + DoorComponent->SetWorldTransform(DoorInitialTransform); + DoorComponent->AttachToComponent( + GetMesh(), FAttachmentTransformRules(EAttachmentRule::KeepWorld, true)); } diff --git a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Vehicle/CarlaWheeledVehicle.h b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Vehicle/CarlaWheeledVehicle.h index fa17b5cc2..b72e42e8d 100644 --- a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Vehicle/CarlaWheeledVehicle.h +++ b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Vehicle/CarlaWheeledVehicle.h @@ -266,21 +266,12 @@ protected: UFUNCTION(BlueprintCallable, CallInEditor) void AdjustVehicleBounds(); - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Door Animation") - TArray DoorAnimMaxAngle; - - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Door Animation") - TArray DoorAnimAlpha; - UPROPERTY(Category="Door Animation", EditAnywhere, BlueprintReadWrite) TArray ConstraintComponentNames; UPROPERTY(Category="Door Animation", EditAnywhere, BlueprintReadWrite) float DoorOpenStrength = 100.0f; - UPROPERTY(Category="Door Animation", EditAnywhere, BlueprintReadWrite) - float DoorCloseStrength = 1000.0f; - UFUNCTION(BlueprintCallable, CallInEditor) void ResetConstraints(); @@ -330,12 +321,6 @@ public: UFUNCTION(Category = "CARLA Wheeled Vehicle", BlueprintCallable) void CloseDoorPhys(const EVehicleDoor DoorIdx); - UFUNCTION(BlueprintNativeEvent, Category = "CARLA Wheeled Vehicle") - void OpenDoorAnim(const EVehicleDoor DoorIdx); - - UFUNCTION(BlueprintNativeEvent, Category = "CARLA Wheeled Vehicle") - void CloseDoorAnim(const EVehicleDoor DoorIdx); - virtual FVector GetVelocity() const override; //-----CARSIM-------------------------------- @@ -355,7 +340,14 @@ private: UPROPERTY(Category="CARLA Wheeled Vehicle", VisibleAnywhere, BlueprintReadOnly, meta = (AllowPrivateAccess = "true")) TArray ConstraintsComponents; + UPROPERTY(Category="CARLA Wheeled Vehicle", VisibleAnywhere, BlueprintReadOnly, meta = (AllowPrivateAccess = "true")) + TMap ConstraintDoor; + + // container of the initial transform of the door, used to reset its position UPROPERTY(Category="CARLA Wheeled Vehicle", VisibleAnywhere, BlueprintReadOnly, meta = (AllowPrivateAccess = "true")) TMap DoorComponentsTransform; + UPROPERTY(Category="CARLA Wheeled Vehicle", VisibleAnywhere, BlueprintReadOnly, meta = (AllowPrivateAccess = "true")) + TMap CollisionDisableConstraints; + };