本文整理汇总了C++中FVector::Size2D方法的典型用法代码示例。如果您正苦于以下问题:C++ FVector::Size2D方法的具体用法?C++ FVector::Size2D怎么用?C++ FVector::Size2D使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类FVector
的用法示例。
在下文中一共展示了FVector::Size2D方法的5个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: moveCamera
void AFRCameraController::moveCamera(AScenePoint* destPosition)
{
FVector departureLocation = currentCameraPosition->GetActorLocation();
FVector destLocation = destPosition->GetActorLocation();
FVector routeVector = destLocation - departureLocation;
float routeLength = routeVector.Size2D();
stepsToDest = FPlatformMath::RoundToInt(routeLength / cameraSpeed);
isometricCoeff = routeLength / cameraSpeed;
routeStep = routeVector / isometricCoeff;
isCameraMoving = true;
}
示例2: CalculateRange
float UAblTargetingBox::CalculateRange() const
{
FVector RotatedBox;
FQuat Rotation = FQuat(m_Location.GetRotation());
RotatedBox = Rotation.GetForwardVector() + m_HalfExtents.X;
RotatedBox += Rotation.GetRightVector() + m_HalfExtents.Y;
RotatedBox += Rotation.GetUpVector() + m_HalfExtents.Z;
if (m_CalculateAs2DRange)
{
return m_Location.GetOffset().Size2D() + RotatedBox.Size2D();
}
return m_Location.GetOffset().Size() + RotatedBox.Size();
}
示例3: AdjustCollisionResultForShape
bool AGameplayAbilityTargetActor_GroundTrace::AdjustCollisionResultForShape(const FVector OriginalStartPoint, const FVector OriginalEndPoint, const FCollisionQueryParams Params, FHitResult& OutHitResult) const
{
UWorld *ThisWorld = GetWorld();
//Pull back toward player to find a better spot, accounting for the width of our object
FVector Movement = (OriginalEndPoint - OriginalStartPoint);
FVector MovementDirection = Movement.GetSafeNormal();
float MovementMagnitude2D = Movement.Size2D();
if (bDebug)
{
if (CollisionShape.ShapeType == ECollisionShape::Capsule)
{
DrawDebugCapsule(ThisWorld, OriginalEndPoint, CollisionHeight * 0.5f, CollisionRadius, FQuat::Identity, FColor::Black);
}
else
{
DrawDebugSphere(ThisWorld, OriginalEndPoint, CollisionRadius, 8, FColor::Black);
}
}
if (MovementMagnitude2D <= (CollisionRadius * 2.0f))
{
return false; //Bad case!
}
//TODO This increment value needs to ramp up - the first few increments should be small, then we should start moving in larger steps. A few ideas for this:
//1. Use a curve! Even one defined by a hardcoded formula would be fine, this isn't something that should require user tuning, or that the user should really know/care about.
//2. Use larger increments as the object is further from the player/camera, since the user can't really perceive precision at long range.
float IncrementSize = FMath::Clamp<float>(CollisionRadius * 0.5f, 20.0f, 50.0f);
float LerpIncrement = IncrementSize / MovementMagnitude2D;
FHitResult LocalResult;
FVector TraceStart;
FVector TraceEnd;
for (float LerpValue = CollisionRadius / MovementMagnitude2D; LerpValue < 1.0f; LerpValue += LerpIncrement)
{
TraceEnd = TraceStart = OriginalEndPoint - (LerpValue * Movement);
TraceEnd.Z -= 99999.0f;
SweepWithFilter(LocalResult, ThisWorld, Filter, TraceStart, TraceEnd, FQuat::Identity, CollisionShape, TraceProfile.Name, Params);
if (!LocalResult.bStartPenetrating)
{
if (!LocalResult.bBlockingHit || (LocalResult.Actor.IsValid() && Cast<APawn>(LocalResult.Actor.Get())))
{
//Off the map, or hit an actor
if (bDebug)
{
if (CollisionShape.ShapeType == ECollisionShape::Capsule)
{
DrawDebugCapsule(ThisWorld, LocalResult.Location, CollisionHeight * 0.5f, CollisionRadius, FQuat::Identity, FColor::Yellow);
}
else
{
DrawDebugSphere(ThisWorld, LocalResult.Location, CollisionRadius, 8, FColor::Yellow);
}
}
continue;
}
if (bDebug)
{
if (CollisionShape.ShapeType == ECollisionShape::Capsule)
{
DrawDebugCapsule(ThisWorld, LocalResult.Location, CollisionHeight * 0.5f, CollisionRadius, FQuat::Identity, FColor::Green);
}
else
{
DrawDebugSphere(ThisWorld, LocalResult.Location, CollisionRadius, 8, FColor::Green);
}
}
//TODO: Test for flat ground. Concept: Test four corners and the center, make triangles out of the center and adjacent corner points. Check normal.Z of triangles against a minimum Z value.
OutHitResult = LocalResult;
return true;
}
if (bDebug)
{
if (CollisionShape.ShapeType == ECollisionShape::Capsule)
{
DrawDebugCapsule(ThisWorld, TraceStart, CollisionHeight * 0.5f, CollisionRadius, FQuat::Identity, FColor::Red);
}
else
{
DrawDebugSphere(ThisWorld, TraceStart, CollisionRadius, 8, FColor::Red);
}
}
}
return false;
}
示例4: AdjustCollisionResultForShape
bool AGameplayAbilityTargetActor_GroundTrace::AdjustCollisionResultForShape(const FVector OriginalStartPoint, const FVector OriginalEndPoint, const FCollisionQueryParams Params, FHitResult& OutHitResult) const
{
UWorld *ThisWorld = GetWorld();
//Pull back toward player to find a better spot, accounting for the width of our object
FVector Movement = (OriginalEndPoint - OriginalStartPoint);
FVector MovementDirection = Movement.SafeNormal();
float MovementMagnitude2D = Movement.Size2D();
if (bDebug)
{
if (CollisionHeight > 0.0f)
{
DrawDebugCapsule(ThisWorld, OriginalEndPoint, CollisionHeight * 0.5f, CollisionRadius, FQuat::Identity, FColor::Black);
}
else
{
DrawDebugSphere(ThisWorld, OriginalEndPoint, CollisionRadius, 8, FColor::Black);
}
}
if ((MovementMagnitude2D < (CollisionRadius * 2.0f)) || (CollisionRadius <= 1.0f))
{
return false; //Bad case!
}
float IncrementSize = FMath::Clamp<float>(CollisionRadius * 0.5f, 25.0f, 250.0f);
float LerpIncrement = IncrementSize / MovementMagnitude2D;
FHitResult LocalResult;
FVector TraceStart;
FVector TraceEnd;
//This needs to ramp up - the first few increments should be small, then we should start moving in larger steps.
for (float LerpValue = CollisionRadius / MovementMagnitude2D; LerpValue < 1.0f; LerpValue += LerpIncrement)
{
TraceEnd = TraceStart = OriginalEndPoint - (LerpValue * Movement);
TraceEnd.Z -= 99999.0f;
ThisWorld->SweepSingle(LocalResult, TraceStart, TraceEnd, FQuat::Identity, TraceChannel, CollisionShape, Params);
if (!LocalResult.bStartPenetrating)
{
if (!LocalResult.bBlockingHit)
{
//This is probably off the map and should not be considered valid. This should not happen in a non-debug map.
if (bDebug)
{
if (CollisionHeight > 0.0f)
{
DrawDebugCapsule(ThisWorld, LocalResult.Location, CollisionHeight * 0.5f, CollisionRadius, FQuat::Identity, FColor::Yellow);
}
else
{
DrawDebugSphere(ThisWorld, LocalResult.Location, CollisionRadius, 8, FColor::Yellow);
}
}
continue;
//LocalResult.Location = TraceStart;
}
if (bDebug)
{
if (CollisionHeight > 0.0f)
{
DrawDebugCapsule(ThisWorld, LocalResult.Location, CollisionHeight * 0.5f, CollisionRadius, FQuat::Identity, FColor::Green);
}
else
{
DrawDebugSphere(ThisWorld, LocalResult.Location, CollisionRadius, 8, FColor::Green);
}
}
OutHitResult = LocalResult;
return true;
}
if (bDebug)
{
if (CollisionHeight > 0.0f)
{
DrawDebugCapsule(ThisWorld, TraceStart, CollisionHeight * 0.5f, CollisionRadius, FQuat::Identity, FColor::Red);
}
else
{
DrawDebugSphere(ThisWorld, TraceStart, CollisionRadius, 8, FColor::Red);
}
}
}
return false;
}
示例5: GetAvoidanceVelocity_Internal
//RickH - We could probably significantly improve speed if we put separate Z checks in place and did everything else in 2D.
FVector UAvoidanceManager::GetAvoidanceVelocity_Internal(const FNavAvoidanceData& inAvoidanceData, float DeltaTime, int32* inIgnoreThisUID)
{
#if !(UE_BUILD_SHIPPING || UE_BUILD_TEST)
if (!bSystemActive)
{
return inAvoidanceData.Velocity;
}
#endif
if (DeltaTime <= 0.0f)
{
return inAvoidanceData.Velocity;
}
FVector ReturnVelocity = inAvoidanceData.Velocity * DeltaTime;
float MaxSpeed = ReturnVelocity.Size2D();
float CurrentTime;
UWorld* MyWorld = Cast<UWorld>(GetOuter());
if (MyWorld)
{
CurrentTime = MyWorld->TimeSeconds;
}
else
{
//No world? OK, just quietly back out and don't alter anything.
return inAvoidanceData.Velocity;
}
bool Unobstructed = true;
#if !(UE_BUILD_SHIPPING || UE_BUILD_TEST)
bool DebugMode = IsDebugOnForAll() || (inIgnoreThisUID ? IsDebugOnForUID(*inIgnoreThisUID) : false);
#endif
//If we're moving very slowly, just push forward. Not sure it's worth avoiding at this speed, though I could be wrong.
if (MaxSpeed < 0.01f)
{
return inAvoidanceData.Velocity;
}
AllCones.Empty(AllCones.Max());
//DrawDebugDirectionalArrow(GetWorld(), inAvoidanceData.Center, inAvoidanceData.Center + inAvoidanceData.Velocity, 2.5f, FColor(0,255,255), true, 0.05f, SDPG_MAX);
for (auto& AvoidanceObj : AvoidanceObjects)
{
if ((inIgnoreThisUID) && (*inIgnoreThisUID == AvoidanceObj.Key))
{
continue;
}
FNavAvoidanceData& OtherObject = AvoidanceObj.Value;
//
//Start with a few fast-rejects
//
//If the object has expired, ignore it
if (OtherObject.ShouldBeIgnored())
{
continue;
}
//If other object is not in avoided group, ignore it
if (inAvoidanceData.ShouldIgnoreGroup(OtherObject.GroupMask))
{
continue;
}
//RickH - We should have a max-radius parameter/option here, so I'm just going to hardcode one for now.
//if ((OtherObject.Radius + _AvoidanceData.Radius + MaxSpeed + OtherObject.Velocity.Size2D()) < FVector::Dist(OtherObject.Center, _AvoidanceData.Center))
if (FVector2D(OtherObject.Center - inAvoidanceData.Center).SizeSquared() > FMath::Square(inAvoidanceData.TestRadius2D))
{
continue;
}
if (FMath::Abs(OtherObject.Center.Z - inAvoidanceData.Center.Z) > OtherObject.HalfHeight + inAvoidanceData.HalfHeight + HeightCheckMargin)
{
continue;
}
//If we are moving away from the obstacle, ignore it. Even if we're the slower one, let the other obstacle path around us.
if ((ReturnVelocity | (OtherObject.Center - inAvoidanceData.Center)) <= 0.0f)
{
continue;
}
//Create data for the avoidance routine
{
FVector PointAWorld = inAvoidanceData.Center;
FVector PointBRelative = OtherObject.Center - PointAWorld;
FVector TowardB, SidewaysFromB;
FVector VelAdjustment;
FVector VelAfterAdjustment;
float RadiusB = OtherObject.Radius + inAvoidanceData.Radius;
PointBRelative.Z = 0.0f;
TowardB = PointBRelative.GetSafeNormal2D(); //Don't care about height for this game. Rough height-checking will come in later, but even then it will be acceptable to do this.
if (TowardB.IsZero())
{
//Already intersecting, or aligned vertically, scrap this whole object.
continue;
//.........这里部分代码省略.........