Hi, ich entwickle im Moment eine App, bei der man mit der Kamera durch den Weltraum fliegt und Asteroiden ausweicht. (UE4)
Ich hab allerdings ein kleines Problem mit meiner Kollision, da ich mir nicht sicher bin, wie ich diese modellieren soll damit es sich intuitiv richtig anfühlt.
Da die Kamera ja kein richtiges Objekt mit Bounds ist, hab ich da keinen Anhaltspunkt. Seit Anfang der Entwicklung habe ich mir ein kleines Modell ausgedacht:
Ich berechne die Fläche der NearPlane und nehme einen Anteil davon als Kreis und platziere eine Kapsel mit dem Radius dieses Kreises und einer sehr geringen "Höhe" (Kapsel um 90° rotiert, also macht "Tiefe" mehr Sinn) an die Kamera. Ich bin damit aber nicht zufrieden, weil das Kollisionsverhalten mir etwas komisch vorkommt. Ich hab schon mit DebugDraws gearbeitet und mir das ganze auch von außerhalb des Spielers angeschaut, allerdings werde ich nicht wirklich schlau daraus. Ich komme einfach nicht darauf wie ich meine Kollision am besten modelliere, um ein vernünftiges Feeling zu bekommen. Nicht dass der Asteroid halb durch die Kamera fliegt und nichts passiert, aber manchmal sieht man ihn gar nicht und kriegt einen Hit.
Deshalb frage ich erfahrene Entwickler, wie sie das Problem lösen/lösen würde, oder ob mein Ansatz gar nicht mal so schlecht ist. (Um ehrlich zu sein, verwende ich für die Asteroiden performancehalber eine Kapsel für die Kollision, was komisches Verhalten auch erklären kann, allerdings wird es mit einer convex mesh collision nicht besser)
EDIT: Den Code gibts natürlich auch noch:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
NearPlaneHeight = 2 * 10.0f * FMath::Tan(FMath::DegreesToRadians(MainCamera->FieldOfView / 2));
NearPlaneWidth = MainCamera->AspectRatio * NearPlaneHeight;
for (TActorIterator<AAsteroidSpawn> Itr(GetWorld()); Itr; ++Itr)
{
CameraBoundsWidth = Itr->GetActorScale3D().Y * 0.75f * 0.5f;
CameraBoundsHeight = Itr->GetActorScale3D().Z * 0.75f * 0.5f;
}
const float Area = NearPlaneWidth * NearPlaneHeight;
const float CollisionArea = Area / 9.0f;
const float Radius = FMath::Sqrt(CollisionArea / PI);
CameraCapsule->SetCapsuleSize(Radius, 0.01f);
|