You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将向量(点)行对齐至中心?UE开发技术求助

问题:将单侧偏移的向量点行调整为居中对齐

Hey 大家好,我几天前发过这个问题,但评论里说我表述得不够清楚,现在补充细节后重新来问啦!

目前我已经实现了靠左对齐的向量点行,对应的代码如下:

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

核心数学逻辑拆解

原来的左对齐逻辑里,每个点的位置是基准位置向左偏移 Index * ChildWaveActorSeperationIncrement 的距离(通过-GetActorRightVector()实现向左),导致所有点整体靠左侧排列。

要改成居中对齐,只需要两步:

  • 先算出整个点行的总宽度:因为总共有CurrentWaveCount + 1个点,相邻点间隔是ChildWaveActorSeperationIncrement,所以总宽度是 CurrentWaveCount * ChildWaveActorSeperationIncrement
  • 给每个点的位置加上总宽度一半的反向偏移:也就是 GetActorRightVector() * (总宽度 / 2),这样整个点行的中心就会和基准位置(原来的左对齐起点)对齐,实现居中效果。

简单说就是把整个点行向右平移半行的宽度,让中点落在基准线上~

内容的提问来源于stack exchange,提问作者DevilsD

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:22:52