Я разместил этот вопрос несколько дней назад, и из комментариев я сформулировал вопрос не так сильно, как мог бы подумать.
Вот моя обновленная версия с дополнительной информацией.
У меня есть следующее.
Ряды точек выровнены по левому краю от центра.
Достигается через:
// 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 ++ и могут быть просто Math, так как я могу решить их оттуда, если это поможет.
Благодарю.
Текущий:
Ожидаемое:
Обновленный код решения:
// 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()
возвращает местоположение блондинкиGetActorForwardVector()
возвращает единичный вектор, указывающий в направлении, на которое смотрит блонди.GetActorRightVector()
возвращает единичный вектор, ортогональный (перпендикулярный) к ForwardVector и горизонтальный к земле.Тогда проблема, казалось бы, здесь:
CastLocation += (-GetActorRightVector() * (Index * ChildWaveActorSeperationIncrement));
Если ChildWaveActorSeperationIncrement
всегда неотрицателен (и Index
является неотрицательным), то эта строка всегда смещает местоположение приведения где-то слева от блонди.
Максимальное смещение влево — это когда Index
самый большой, так что это CurrentWaveCount * ChildWaveActorSeperationIncrement
, Это также ширина строки в единицах RightVector. Чтобы отцентрировать строки по запросу, нам просто нужно сместить каждую строку вправо на половину этой ширины, добавив (в псевдокоде):
half_width = CurrentWaveCount * ChildWaveActorSeperationIncrement / 2
CastLocation = ExistingCastLocation + GetActorRightVector() * half_width
Других решений пока нет …