void UCharacterMovementComponent::PerformMovement(float DeltaSeconds)
{
.....
// 2162行, 如果通过LaunchCharacter 进行了速度设定, 直接替换成该速度,
// 并且不会进行最大速度限制的检测, 即你输入的是什么, 就设置为什么.
// Character::LaunchCharacter() has been deferred until now.
HandlePendingLaunch();
// change position 2302行, 这里进行位置的更新
StartNewPhysics(DeltaSeconds, 0);
// 2314行, 这里进行旋转的更新.
if ((bAllowPhysicsRotationDuringAnimRootMotion || !HasAnimRootMotion()) && !CharacterOwner->IsMatineeControlled())
{
PhysicsRotation(DeltaSeconds);
}
}
整个旋转计算过程, 这里有个bug, 当加速度Acceleration为(0, 0, z)格式的时候, 这里会把Character朝向X轴方向. 所以加了修正代码
void UCharacterMovementComponent::PhysicsRotation(float DeltaTime)
{
if (!(bOrientRotationToMovement || bUseControllerDesiredRotation))
{
return;
}
if (!HasValidData() || (!CharacterOwner->Controller && !bRunPhysicsWithNoController))
{
return;
}
FRotator CurrentRotation = UpdatedComponent->GetComponentRotation(); // Normalized
CurrentRotation.DiagnosticCheckNaN(TEXT("CharacterMovementComponent::PhysicsRotation(): CurrentRotation"));
FRotator DeltaRot = GetDeltaRotation(DeltaTime);
DeltaRot.DiagnosticCheckNaN(TEXT("CharacterMovementComponent::PhysicsRotation(): GetDeltaRotation"));
FRotator DesiredRotation = CurrentRotation;
if (bOrientRotationToMovement)
{
DesiredRotation = ComputeOrientToMovementRotation(CurrentRotation, DeltaTime, DeltaRot);
}
else if (CharacterOwner->Controller && bUseControllerDesiredRotation)
{
DesiredRotation = CharacterOwner->Controller->GetDesiredRotation();
}
else
{
return;
}
if (ShouldRemainVertical())
{
DesiredRotation.Pitch = 0.f;
DesiredRotation.Yaw = FRotator::NormalizeAxis(DesiredRotation.Yaw);
DesiredRotation.Roll = 0.f;
}
else
{
if (Acceleration.X==0.f && Acceleration.Y==0.f) {
// 当加速度格式为(0, 0, z)的时候, Character朝向不变
DesiredRotation = CurrentRotation ;
}
DesiredRotation.Normalize();
}
// Accumulate a desired new rotation.
const float AngleTolerance = 1e-3f;
if (!CurrentRotation.Equals(DesiredRotation, AngleTolerance))
{
// PITCH
if (!FMath::IsNearlyEqual(CurrentRotation.Pitch, DesiredRotation.Pitch, AngleTolerance))
{
DesiredRotation.Pitch = FMath::FixedTurn(CurrentRotation.Pitch, DesiredRotation.Pitch, DeltaRot.Pitch);
}
// YAW
if (!FMath::IsNearlyEqual(CurrentRotation.Yaw, DesiredRotation.Yaw, AngleTolerance))
{
DesiredRotation.Yaw = FMath::FixedTurn(CurrentRotation.Yaw, DesiredRotation.Yaw, DeltaRot.Yaw);
}
// ROLL
if (!FMath::IsNearlyEqual(CurrentRotation.Roll, DesiredRotation.Roll, AngleTolerance))
{
DesiredRotation.Roll = FMath::FixedTurn(CurrentRotation.Roll, DesiredRotation.Roll, DeltaRot.Roll);
}
// Set the new rotation.
DesiredRotation.DiagnosticCheckNaN(TEXT("CharacterMovementComponent::PhysicsRotation(): DesiredRotation"));
MoveUpdatedComponent( FVector::ZeroVector, DesiredRotation, /*bSweep*/ false );
}
}
网友评论