如何将向量行(点)对齐到中心?
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
我几天前发布了这个问题,从评论中我没有像我认为的那样详细地阐述这个问题。
这是我的更新版本,包含更多信息。
我有以下内容。
与中心左侧对齐的点行。
通过以下方式实现:
// 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