Skip to content

Commit

Permalink
Control manual camera speed through LShift and LCtrl
Browse files Browse the repository at this point in the history
  • Loading branch information
saihv committed Dec 16, 2020
1 parent a53bf40 commit 2e3c03f
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 4 deletions.
25 changes: 23 additions & 2 deletions Unreal/Plugins/AirSim/Source/ManualPoseController.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ void UManualPoseController::initializeForPlay()
left_yaw_mapping_ = FInputAxisKeyMapping("inputManualLeftYaw", EKeys::A); right_yaw_mapping_ = FInputAxisKeyMapping("inputManualRightYaw", EKeys::D);
left_roll_mapping_ = FInputAxisKeyMapping("inputManualLefRoll", EKeys::Q); right_roll_mapping_ = FInputAxisKeyMapping("inputManualRightRoll", EKeys::E);
up_pitch_mapping_ = FInputAxisKeyMapping("inputManualUpPitch", EKeys::W); down_pitch_mapping_ = FInputAxisKeyMapping("inputManualDownPitch", EKeys::S);

inc_speed_mapping_ = FInputAxisKeyMapping("inputManualSpeedIncrease", EKeys::LeftShift); dec_speed_mapping_ = FInputAxisKeyMapping("inputManualSpeedDecrease", EKeys::LeftControl);
input_positive_ = inpute_negative_ = last_velocity_ = FVector::ZeroVector;
}

Expand All @@ -22,6 +22,7 @@ void UManualPoseController::clearBindings()
left_binding_ = right_binding_ = up_binding_ = down_binding_ = nullptr;
forward_binding_ = backward_binding_ = left_yaw_binding_ = up_pitch_binding_ = nullptr;
right_yaw_binding_ = down_pitch_binding_ = left_roll_binding_ = right_roll_binding_ = nullptr;
inc_speed_binding_ = dec_speed_binding_ = nullptr;
}

void UManualPoseController::setActor(AActor* actor)
Expand Down Expand Up @@ -97,6 +98,10 @@ void UManualPoseController::removeInputBindings()
UAirBlueprintLib::RemoveAxisBinding(up_pitch_mapping_, up_pitch_binding_, actor_);
if (down_pitch_binding_)
UAirBlueprintLib::RemoveAxisBinding(down_pitch_mapping_, down_pitch_binding_, actor_);
if (inc_speed_binding_)
UAirBlueprintLib::RemoveAxisBinding(inc_speed_mapping_, inc_speed_binding_, actor_);
if (dec_speed_binding_)
UAirBlueprintLib::RemoveAxisBinding(dec_speed_mapping_, dec_speed_binding_, actor_);

clearBindings();
}
Expand All @@ -117,14 +122,16 @@ void UManualPoseController::setupInputBindings()
right_roll_binding_ = & UAirBlueprintLib::BindAxisToKey(right_roll_mapping_, actor_, this, &UManualPoseController::inputManualRightRoll);
up_pitch_binding_ = & UAirBlueprintLib::BindAxisToKey(up_pitch_mapping_, actor_, this, &UManualPoseController::inputManualUpPitch);
down_pitch_binding_ = & UAirBlueprintLib::BindAxisToKey(down_pitch_mapping_, actor_, this, &UManualPoseController::inputManualDownPitch);
inc_speed_binding_ = &UAirBlueprintLib::BindAxisToKey(inc_speed_mapping_, actor_, this, &UManualPoseController::inputManualSpeedIncrease);
dec_speed_binding_ = &UAirBlueprintLib::BindAxisToKey(dec_speed_mapping_, actor_, this, &UManualPoseController::inputManualSpeedDecrease);
}

void UManualPoseController::updateDeltaPosition(float dt)
{
FVector input = input_positive_ - inpute_negative_;
if (!FMath::IsNearlyZero(input.SizeSquared())) {
if (FMath::IsNearlyZero(acceleration_))
last_velocity_ = input * 1000;
last_velocity_ = input * speed_scaler_;
else
last_velocity_ += input * (acceleration_ * dt);
delta_position_ += actor_->GetActorRotation().RotateVector(last_velocity_ * dt);
Expand All @@ -133,6 +140,20 @@ void UManualPoseController::updateDeltaPosition(float dt)
}
}

void UManualPoseController::inputManualSpeedIncrease(float val)
{
if (!FMath::IsNearlyEqual(val, 0.f))
speed_scaler_ += val * 20;
}
void UManualPoseController::inputManualSpeedDecrease(float val)
{
if (!FMath::IsNearlyEqual(val, 0.f))
speed_scaler_ -= val * 20;

if (speed_scaler_ <= 0.0)
speed_scaler_ = 20.0;
}

void UManualPoseController::inputManualLeft(float val)
{
inpute_negative_.Y = val;
Expand Down
7 changes: 5 additions & 2 deletions Unreal/Plugins/AirSim/Source/ManualPoseController.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ class AIRSIM_API UManualPoseController : public UObject {
void inputManualRightRoll(float val);
void inputManualUpPitch(float val);
void inputManualDownPitch(float val);
void inputManualSpeedIncrease(float val);
void inputManualSpeedDecrease(float val);

void setupInputBindings();
void removeInputBindings();
Expand All @@ -41,18 +43,19 @@ class AIRSIM_API UManualPoseController : public UObject {
FInputAxisBinding *left_binding_, *right_binding_, *up_binding_, *down_binding_;
FInputAxisBinding *forward_binding_, *backward_binding_, *left_yaw_binding_, *right_yaw_binding_;
FInputAxisBinding *up_pitch_binding_, *down_pitch_binding_, *left_roll_binding_, *right_roll_binding_;
FInputAxisBinding* inc_speed_binding_, *dec_speed_binding_;

FInputAxisKeyMapping left_mapping_, right_mapping_, up_mapping_, down_mapping_;
FInputAxisKeyMapping forward_mapping_, backward_mapping_, left_yaw_mapping_, right_yaw_mapping_;
FInputAxisKeyMapping up_pitch_mapping_, down_pitch_mapping_, left_roll_mapping_, right_roll_mapping_;

FInputAxisKeyMapping inc_speed_mapping_, dec_speed_mapping_;

FVector delta_position_;
FRotator delta_rotation_;

AActor *actor_;

float acceleration_ = 0;
float acceleration_ = 0, speed_scaler_ = 1000;
FVector input_positive_, inpute_negative_;
FVector last_velocity_;
};

2 comments on commit 2e3c03f

@rajrana22
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What exactly is the "speed_scaler" value measured in? I know that AirSim uses SI units and Unreal Engine uses cm, but neither of those would make sense as values (too large). Is it meters per second? Is it cm per second? Or is it not a speed but an absolute distance moved with each press of the forward button?

@jonyMarino
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

answered here #3783 (comment)

Please sign in to comment.