如何将向量行(点)对齐到中心?

How to align rows of Vectors(points) to center?

我几天前发布了这个问题,从评论中我没有像我认为的那样详细地阐述这个问题。

这是我的更新版本,包含更多信息。

我有以下内容。

与中心左侧对齐的点行。

通过以下方式实现:

// Loop for basically CurrentWaveCount + 1
for (int32 Index = CurrentWaveCount; Index >= 0; Index--)
{
    FHitResult HitResult(ForceInit);
    FCollisionQueryParams TraceParams = FCollisionQueryParams();
    TraceParams.AddIgnoredActor(GetOwner());
    TraceParams.AddIgnoredActor(this);

    //////////////////////////////////////////////////////////////////////////

    FVector CastLocation = (GetActorForwardVector() * (CurrentWaveCount * WaveSpawnDistanceIncrement) + GetActorLocation());
    CastLocation += (-GetActorRightVector() * (Index * ChildWaveActorSeperationIncrement));

    //////////////////////////////////////////////////////////////////////////

    CastLocation.Z += FixedCastTraceHeightOffset;

    FVector TraceStart = CastLocation;
    FVector TraceEnd = TraceStart + (-FVector::UpVector * MaxFallbackTraceDistance);

    GetWorld()->LineTraceSingleByChannel(HitResult, TraceStart, TraceEnd, ECC_FixedCastableTraceChannel, TraceParams);

CastLocation 变量控制每个点的位置。

但是我想将它们对齐到中心而不是偏移到一侧,我无法计算出这样做的数学。

答案不必使用 C++,可以只是数学,因为如果有帮助,我可以从那里算出来。

谢谢。

当前:

预计:

更新的解决方案代码:

// Loop for basically CurrentWaveCount + 1
for (int32 Index = CurrentWaveCount; Index >= 0; Index--)
{
    FHitResult HitResult(ForceInit);
    FCollisionQueryParams TraceParams = FCollisionQueryParams();
    TraceParams.AddIgnoredActor(GetOwner());
    TraceParams.AddIgnoredActor(this);

    //////////////////////////////////////////////////////////////////////////

    float HalfWidth = CurrentWaveCount * ChildWaveActorSeperationIncrement / 2;

    FVector CastLocation = (GetActorForwardVector() * (CurrentWaveCount * WaveSpawnDistanceIncrement) + GetActorLocation());
    CastLocation += -GetActorRightVector() * (Index * ChildWaveActorSeperationIncrement);
    CastLocation += GetActorRightVector() * HalfWidth;

    //////////////////////////////////////////////////////////////////////////

    CastLocation.Z += FixedCastTraceHeightOffset;

    FVector TraceStart = CastLocation;
    FVector TraceEnd = TraceStart + (-FVector::UpVector * MaxFallbackTraceDistance);

    GetWorld()->LineTraceSingleByChannel(HitResult, TraceStart, TraceEnd, ECC_FixedCastableTraceChannel, TraceParams);

我做出以下假设:

  • GetActorLocation() returns 金发角色的位置。
  • GetActorForwardVector() returns 指向金发女郎所面对方向的单位向量。
  • GetActorRightVector() returns 与 ForwardVector 正交(垂直)且与地面水平的单位向量。

那么问题就出现在这里:

CastLocation += (-GetActorRightVector() * (Index * ChildWaveActorSeperationIncrement));

如果 ChildWaveActorSeperationIncrement 始终为非负数(并且 Index 为非负数),则此行始终将施法位置移到 blondie 左侧的某处。

向左位移最大时Index最大,故为CurrentWaveCount * ChildWaveActorSeperationIncrement。这也是以 RightVector 为单位的行的宽度。要按要求将行居中,我们只需将每一行向右移动此宽度的一半,方法是添加(在伪代码中):

half_width = CurrentWaveCount * ChildWaveActorSeperationIncrement / 2
CastLocation = ExistingCastLocation + GetActorRightVector() * half_width