fix(vehicle): spawn on the road, not 2.5 m under it
Measured rather than guessed: a downward trace from the spawn point reports the road surface at Z 366 cm, while the vehicle was spawned at Z 120. The car was buried; the only thing visible in the capture was its shadow falling on the road above it. Spawn is now Z 470, the camera aims at 430, and it settles at Z 470. Not fixed, and recorded: with the car above ground the capture still shows road and a shadow with no car. Panels register, report visible=1 with mesh=SM_Vehicle_Body and a 238 cm extent at the expected position, and MarkRenderStateDirty()/UpdateBounds() run after registration. The shadow proves a collider is there; the visible geometry is not. Screenshots/README.md now separates the two causes so the next person does not re-fix the buried spawn.
This commit is contained in:
1 parent
627737062b
commit
1cddfbfc68
40 files changed
+75
-51
No files matched your search
@@ -77,6 +77,10 @@ void AGigLineVehicle::BuildVisuals()
|
||||
Component->SetCollisionEnabled(ECollisionEnabled::NoCollision);
|
||||
Component->SetMobility(EComponentMobility::Movable);
|
||||
Component->RegisterComponent();
|
||||
// Runtime-created components need their render state forced: without this the
|
||||
// panels registered and reported visible but never reached the renderer.
|
||||
Component->MarkRenderStateDirty();
|
||||
Component->UpdateBounds();
|
||||
Panels.Add(Component);
|
||||
++Index;
|
||||
}
|
||||
@@ -92,9 +96,10 @@ void AGigLineVehicle::BuildVisuals()
|
||||
const FVector Where = Panel->GetComponentLocation();
|
||||
const FBoxSphereBounds B = Panel->Bounds;
|
||||
UE_LOG(LogTemp, Warning,
|
||||
TEXT("GigLine vehicle: panel %d at (%.0f,%.0f,%.0f) visible=%d extent=%.0f"),
|
||||
TEXT("GigLine vehicle: panel %d at (%.0f,%.0f,%.0f) visible=%d extent=%.0f mesh=%s"),
|
||||
PanelIndex, Where.X, Where.Y, Where.Z,
|
||||
Panel->IsVisible() ? 1 : 0, B.BoxExtent.GetMax());
|
||||
Panel->IsVisible() ? 1 : 0, B.BoxExtent.GetMax(),
|
||||
Panel->GetStaticMesh() ? *Panel->GetStaticMesh()->GetName() : TEXT("NONE"));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -165,6 +170,21 @@ void AGigLineVehicle::BeginPlay()
|
||||
}
|
||||
BuildVisuals();
|
||||
|
||||
// Where is the road, really? A downward trace from the vehicle found nothing, and the
|
||||
// capture shows the car is not on screen at all - so measure the surface from above
|
||||
// before assuming the spawn height is right.
|
||||
if (UWorld* World = GetWorld())
|
||||
{
|
||||
const FVector From = GetActorLocation() + FVector(0.f, 0.f, 1000.f);
|
||||
FHitResult Hit;
|
||||
FCollisionQueryParams Q(TEXT("GigLineVehicleRoad"), false, this);
|
||||
const bool bHit = World->LineTraceSingleByChannel(Hit, From,
|
||||
From - FVector(0.f, 0.f, 4000.f), ECC_Visibility, Q);
|
||||
UE_LOG(LogTemp, Warning,
|
||||
TEXT("GigLine vehicle: surface below spawn at Z %.0f cm (hit=%d, actor at %.0f)"),
|
||||
bHit ? Hit.ImpactPoint.Z : -9999.f, bHit ? 1 : 0, GetActorLocation().Z);
|
||||
}
|
||||
|
||||
// Wheel objects do not exist until the component is registered, so the per-wheel
|
||||
// flags set in the constructor went nowhere - which is why the drive test measured
|
||||
// zero speed with throttle held. Apply them again now that they exist, and give the
|
||||
|
||||
Reference in new issue
Block a user