Как выровнять строки Векторов (точек) по центру?

Я разместил этот вопрос несколько дней назад, и из комментариев я сформулировал вопрос не так сильно, как мог бы подумать.

Вот моя обновленная версия с дополнительной информацией.

У меня есть следующее.

введите описание изображения здесь

Ряды точек выровнены по левому краю от центра.

Достигается через:

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

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
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]