如何将向量(点)行对齐至中心?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
相关产品推荐
相关产品推荐

