我几天前发布了这个问题,从评论中我没有像我想象的那样提出问题。
这是我的更新版本,包含更多信息。
我有以下内容。
与中心左侧对齐的一排点。
通过以下方式实现:
// 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 ++中,而且可以只是数学,因为如果有帮助我可以从那里解决。
感谢。
电流:
预期:
更新的解决方案代码:
// 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);
答案 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