Как выровнять строки Векторов (точек) по центру? - PullRequest
0 голосов
/ 18 мая 2018

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

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

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

enter image description here

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

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

// 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 - это то, что контролирует положение каждой точки.

Однако я хотел бы выровнять их по центру вместо смещения в одну сторону, и я не могу отработать математику, чтобы сделатьthis.

Ответы не обязательно должны быть на C ++ и могут быть просто Math, так как я могу оттуда разобраться, если это поможет.

Спасибо.

enter image description here

Ток:

enter image description here

Ожидаемый:

enter image description here

Обновлен код решения:

// 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 Ответ

0 голосов
/ 18 мая 2018

Я делаю следующие предположения:

  • GetActorLocation() возвращает местоположение белокурого персонажа.
  • GetActorForwardVector() возвращает единичный вектор, указывающий в направлении, к которому смотрит блонди.
  • GetActorRightVector() возвращает единичный вектор, ортогональный (перпендикулярный) к ForwardVector и горизонтальный к земле.

Тогда проблема могла бы быть здесь:

CastLocation += (-GetActorRightVector() * (Index * ChildWaveActorSeperationIncrement));

Если ChildWaveActorSeperationIncrement всегда неотрицателен (а Index неотрицателен), то эта строка всегда смещает место приведения где-то слева от блонди.

Максимальное смещение влево - это когда Index наибольшее, то есть CurrentWaveCount * ChildWaveActorSeperationIncrement. Это также ширина строки в единицах RightVector. Чтобы отцентрировать строки по запросу, нам просто нужно сместить каждую строку вправо на половину этой ширины, добавив (в псевдокоде):

half_width = CurrentWaveCount * ChildWaveActorSeperationIncrement / 2
CastLocation = ExistingCastLocation + GetActorRightVector() * half_width
...