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

时间:2018-05-18 01:00:43

标签: c++ math vectormath

我几天前发布了这个问题,从评论中我没有像我想象的那样提出问题。

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

我有以下内容。

enter image description here

与中心左侧对齐的一排点。

通过以下方式实现:

// 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变量控制每个Point的位置。

但是我想将它们与中心对齐而不是偏向一侧,我无法解决数学问题。

答案不一定是在C ++中,而且可以只是数学,因为如果有帮助我可以从那里解决。

感谢。

enter image description here

电流:

enter image description here

预期:

enter image description here

更新的解决方案代码:

// 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);

1 个答案:

答案 0 :(得分:1)

我做出以下假设:

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

然后问题就出现在这里:

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

如果ChildWaveActorSeperationIncrement始终为非负(并且Index为非负数),则此行始终将演员位置替换为金发女郎左侧的某处。

最大向左位移是Index最大的时间,因此它是CurrentWaveCount * ChildWaveActorSeperationIncrement。这也是RightVector单位中行的宽度。要按照要求对中心行,我们只需要通过添加(以伪代码形式)将每行向右移动此宽度的一半:

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