Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adjusted BB when doors are oppened. #7133

Open
wants to merge 6 commits into
base: dev
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
## Latest Changes
* Prevent from segfault on failing SignalReference identification when loading OpenDrive files
* Added vehicle doors to the recorder
* Added vehicle doors to the recorder
* Adjusted vehicle BoundingBox when the vehicle opens the doors.
* Added functions to get actor' components transform

## CARLA 0.9.15
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,17 +23,19 @@

#include "Rendering/SkeletalMeshRenderData.h"
#include "Engine/SkeletalMeshSocket.h"
#include "Kismet/KismetMathLibrary.h"

namespace crp = carla::rpc;

static FBoundingBox ApplyTransformToBB(
FBoundingBox InBB,
const FTransform& Transform)
{
auto Scale = Transform.GetScale3D();
const auto Scale = Transform.GetScale3D();
const auto TransformRotation = Transform.GetRotation().Rotator();
InBB.Origin *= Scale;
InBB.Rotation = Transform.GetRotation().Rotator();
InBB.Origin = InBB.Rotation.RotateVector(InBB.Origin) + Transform.GetLocation();
InBB.Rotation = UKismetMathLibrary::ComposeRotators(TransformRotation, InBB.Rotation);
InBB.Origin = TransformRotation.RotateVector(InBB.Origin) + Transform.GetLocation();
InBB.Extent *= Scale;
return InBB;
}
Expand Down Expand Up @@ -183,6 +185,14 @@ FBoundingBox UBoundingBoxCalculator::GetVehicleBoundingBox(
}
}

// Calculate bounding boxes of the doors.
FBoundingBox DoorsBB = GetVehicleDoorsBoundingBox(Vehicle);
if(DoorsBB.Extent != FVector::ZeroVector)
{
// Combine doors Bounding Box with the vehicle BB.
BB = CombineBBs({DoorsBB, BB});
}

// Component-to-world transform for this component
auto& CompToWorldTransform = ParentComp->GetComponentTransform();
BB = ApplyTransformToBB(BB, CompToWorldTransform);
Expand Down Expand Up @@ -445,7 +455,7 @@ TArray<FBoundingBox> UBoundingBoxCalculator::GetBBsOfActor(
{
Result.Add(BoundingBox);
}
return Result;;
return Result;
}

// Pedestrians, we just use the capsule component at the moment.
Expand Down Expand Up @@ -645,3 +655,34 @@ void UBoundingBoxCalculator::GetMeshCompsFromActorBoundingBox(
}
}
}

FBoundingBox UBoundingBoxCalculator::GetVehicleDoorsBoundingBox(const ACarlaWheeledVehicle* Vehicle)
{
FBoundingBox DoorsBB;
if(Vehicle && Vehicle->GetConstraintsComponents().Num() > 0)
{
FBox DoorsBox(ForceInit);
const FTransform& ActorToWorld = Vehicle->GetActorTransform();
const FTransform WorldToActor = ActorToWorld.Inverse();

// Iterates over all doors of the vehicle
for(const UPhysicsConstraintComponent* ConstraintComp : Vehicle->GetConstraintsComponents())
{
const UPrimitiveComponent* DoorComponent = Vehicle->GetConstraintDoor()[ConstraintComp];
if(const UStaticMeshComponent* StaticMeshComp = Cast<UStaticMeshComponent>(DoorComponent))
{
const FTransform ComponentToActor = StaticMeshComp->GetComponentTransform() * WorldToActor;
DoorsBox += StaticMeshComp->CalcBounds(ComponentToActor).GetBox();
}
}

if(DoorsBox.IsValid)
{
// DoorBB is aligned with the Vehicle orientation, for this reason it is not necessary to assign rotation.
DoorsBB.Origin = DoorsBox.GetCenter();
DoorsBB.Extent = DoorsBox.GetExtent();
}
}

return DoorsBB;
}
Original file line number Diff line number Diff line change
Expand Up @@ -110,4 +110,7 @@ class CARLA_API UBoundingBoxCalculator : public UBlueprintFunctionLibrary
const FBoundingBox& InBB,
TArray<UStaticMeshComponent*>& OutStaticMeshComps);

// Return the combined BB of all doors of the vehicle, with the same orientation.
UFUNCTION(Category = "Carla Actor", BlueprintCallable)
static FBoundingBox GetVehicleDoorsBoundingBox(const ACarlaWheeledVehicle* Vehicle);
};
Original file line number Diff line number Diff line change
Expand Up @@ -1021,6 +1021,15 @@ void ACarlaWheeledVehicle::OpenDoorPhys(const EVehicleDoor DoorIdx)
}

RecordDoorChange(DoorIdx, true);

// Wait until door is max opened to recalculate its bounds.
float TimeNeededToHaveItOpened = (AngleLimit + Constraint->ConstraintInstance.AngularRotationOffset.Yaw) / (DoorOpenStrength > 0.f ? DoorOpenStrength : 1.f);
TimeNeededToHaveItOpened = TimeNeededToHaveItOpened < 0.f ? TimeNeededToHaveItOpened * -1.f : TimeNeededToHaveItOpened;
FTimerHandle DoorMaxOpenRangeTimerHandle;
GetWorldTimerManager().SetTimer(DoorMaxOpenRangeTimerHandle, [this]()
{
AdjustVehicleBounds();
}, TimeNeededToHaveItOpened, false);
}

void ACarlaWheeledVehicle::CloseDoorPhys(const EVehicleDoor DoorIdx)
Expand All @@ -1035,6 +1044,8 @@ void ACarlaWheeledVehicle::CloseDoorPhys(const EVehicleDoor DoorIdx)
DoorComponent->AttachToComponent(
GetMesh(), FAttachmentTransformRules(EAttachmentRule::KeepWorld, true));
RecordDoorChange(DoorIdx, false);

AdjustVehicleBounds();
}

void ACarlaWheeledVehicle::RecordDoorChange(const EVehicleDoor DoorIdx, bool bIsOpen)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -428,6 +428,10 @@ class CARLA_API ACarlaWheeledVehicle : public AWheeledVehicle
UFUNCTION(Category = "CARLA Wheeled Vehicle", BlueprintCallable)
static void SetPhysicsConstraintAngle(
UPhysicsConstraintComponent*Component, const FRotator &NewAngle);

const TArray<UPhysicsConstraintComponent*>& GetConstraintsComponents() const { return ConstraintsComponents; }

const TMap<UPhysicsConstraintComponent*, UPrimitiveComponent*>& GetConstraintDoor() const {return ConstraintDoor; }

private:

Expand Down