Попытка создать арку для броска объектов, используя прогнозируемый путь снарядаC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Попытка создать арку для броска объектов, используя прогнозируемый путь снаряда

Сообщение Anonymous »

Я пытаюсь сделать арку, чтобы отобразить траекторию объекта при его броске. Для этого я использую предсказанный путь снаряда, чтобы сделать это, однако у меня есть несколько проблем. Это не похоже на арку и не очень хорошо предсказывает, где будет упасть объект. Bellow - это код, который я использую для прогнозирования пути, бросьте объект и отображает сплайн: < /p>

Код: Выделить всё

UTP_ThrowableItemComponent::UTP_ThrowableItemComponent()
{
TrajectorySpline = CreateDefaultSubobject(TEXT("TrajectorySpline"));
TrajectorySpline->SetupAttachment(this);
TrajectorySpline->SetMobility(EComponentMobility::Movable);
}

void UTP_ThrowableItemComponent::StartChargingThrow()
{
if (Character == nullptr)
{
UE_LOG(LogTemp, Error, TEXT("Character is null whe trying to throw item"));
return;
}

UE_LOG(LogTemp, Warning, TEXT("Start Throw item"));

CurrentChargeTime = 0.0f;
GetWorld()->GetTimerManager().SetTimer(ChargeTimerHandle, this, &UTP_ThrowableItemComponent::ChargeTick, 0.1f, true);
GetWorld()->GetTimerManager().SetTimer(UpdateArcTimerHandle, this, &UTP_ThrowableItemComponent::UpdateThrowArc, 0.1f, true);
}

void UTP_ThrowableItemComponent::ReleaseThrow()
{
GetWorld()->GetTimerManager().ClearTimer(ChargeTimerHandle);
GetWorld()->GetTimerManager().ClearTimer(UpdateArcTimerHandle);

ClearThrowArc();

UE_LOG(LogTemp, Warning, TEXT("Release Throw item"));

DetachFromComponent(FDetachmentTransformRules::KeepWorldTransform);

SetSimulatePhysics(true);

float ThrowStrength = FMath::Lerp(MinThrowStrength, MaxThrowStrength, CurrentChargeTime / MaxChargeTime);

FVector ForwardVector = Character->GetControlRotation().Vector();

FVector Impulse = ForwardVector * ThrowStrength;

AddImpulse(Impulse, NAME_None, true);

DrawDebugLine(GetWorld(), GetComponentLocation(), GetComponentLocation() + Impulse, FColor::Green, false, 2.0f, 0, 5.0f);

RemoveThrowableMappingContext();

Character->SetWeaponHidden(false);
Character->SetCanSwitchWeapon(true);
}

void UTP_ThrowableItemComponent::ChargeTick()
{
CurrentChargeTime = FMath::Min(CurrentChargeTime + 0.1f, MaxChargeTime);
}

void UTP_ThrowableItemComponent::UpdateThrowArc()
{
//TrajectoryPoints.Empty();

ClearThrowArc();

float ThrowStrength = FMath::Lerp(MinThrowStrength, MaxThrowStrength, CurrentChargeTime / MaxChargeTime);
FVector ForwardVector = Character->GetControlRotation().Vector();
FVector Impulse = ForwardVector * ThrowStrength;
FPredictProjectilePathParams PredictParams;
PredictParams.StartLocation = Character->GetActorLocation(); //GetComponentLocation(); //Character->GetActorLocation(); // *100.0f;
PredictParams.LaunchVelocity = Impulse;
PredictParams.bTraceWithCollision = true;
//PredictParams.bTraceComplex = false;
//PredictParams.ProjectileRadius = 10.0f;
PredictParams.MaxSimTime = 1.0f;
PredictParams.SimFrequency = 13.f;
TArray ActorsToIgnore;
PredictParams.ActorsToIgnore.Add(Character);
PredictParams.ActorsToIgnore.Add(this->GetOwner());

//PredictParams.OverrideGravityZ = -980.f; // Default value

FPredictProjectilePathResult PredictResult;
if (UGameplayStatics::PredictProjectilePath(GetWorld(), PredictParams, PredictResult))
{
for (const FPredictProjectilePathPointData& PointData : PredictResult.PathData)
{
//TrajectoryPoints.Add(PointData.Location);
TrajectorySpline->AddSplinePoint(PointData.Location, ESplineCoordinateSpace::World);
//Character->AddPointToSpline(PointData.Location);
}
}

//Character->UpdateSplineMeshes();
UpdateSplineMeshes();
}

void UTP_ThrowableItemComponent::ClearThrowArc()
{
//TODO: issue where following uses are getting clear without even showing in screen
UE_LOG(LogTemp, Warning, TEXT("Call clear"));
// Remove all spline meshes
TArray  AttachedComponents;
TrajectorySpline->GetChildrenComponents(false, AttachedComponents);

for (USceneComponent* Component : AttachedComponents)
{
UE_LOG(LogTemp, Warning, TEXT("Going to try to clear"));
if (USplineMeshComponent* SplineMeshComp = Cast(Component))
{
UE_LOG(LogTemp, Warning, TEXT("Going to call destroy"));
SplineMeshComp->DestroyComponent();
}
}

TrajectorySpline->ClearSplinePoints();
}

void UTP_ThrowableItemComponent::UpdateSplineMeshes()
{
if (!SplineMesh || !SplineMaterial)
{
return;
}

//ClearThrowArc();

int32 NumPoints = TrajectorySpline->GetNumberOfSplinePoints();
UE_LOG(LogTemp, Warning, TEXT("Number of spline points: %d"), NumPoints);
for (int i = 0; i < NumPoints - 2; i++)
{
FVector StartLocation, StartTangent;
FVector EndLocation, EndTangent;

TrajectorySpline->GetLocationAndTangentAtSplinePoint(i, StartLocation, StartTangent, ESplineCoordinateSpace::World);
TrajectorySpline->GetLocationAndTangentAtSplinePoint(i + 1, EndLocation, EndTangent, ESplineCoordinateSpace::World);

FVector EndLocationLerp = FMath::Lerp(StartLocation, EndLocation, 0.5f);
FVector EndTangentLerp = FMath::Lerp(StartTangent, EndTangent, 0.5f);

USplineMeshComponent* SplineMeshComp = NewObject(TrajectorySpline);
if (SplineMeshComp)
{
SplineMeshComp->SetCollisionEnabled(ECollisionEnabled::NoCollision);
SplineMeshComp->SetMobility(EComponentMobility::Movable);
SplineMeshComp->SetStaticMesh(SplineMesh);
SplineMeshComp->SetMaterial(0, SplineMaterial);
SplineMeshComp->RegisterComponent();
SplineMeshComp->AttachToComponent(TrajectorySpline, FAttachmentTransformRules::KeepRelativeTransform);

SplineMeshComp->SetStartAndEnd(StartLocation, EndLocationLerp, StartTangent, EndTangentLerp);
}
}
}
Вот как он выглядит на экране:

. Другое, что я могу, только что я могу понять, что я могу показать, что я могу показать, что я буду. Время, если я забираю другой объект и попытаюсь бросить его, он ничего не покажет. Если я удалю clearThrowarc () из updateThrowarc (), это показывает, но когда я делаю это, это создает много экземпляров сплайна и заполняет экран.>

Подробнее здесь: https://stackoverflow.com/questions/795 ... ctile-path
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»