Du bist nicht angemeldet.

Werbeanzeige

birdfreeyahoo

Alter Hase

  • »birdfreeyahoo« ist der Autor dieses Themas

Beiträge: 721

Wohnort: Schorndorf

Beruf: Student der Softwaretechnik

  • Private Nachricht senden

1

26.11.2016, 01:06

Kamerakollision

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

David Scherfgen

Administrator

Beiträge: 9 679

Wohnort: Bonn

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

26.11.2016, 12:19

Kann es sein, dass einen die Asteroiden seitlich oder gar von hinten treffen? Dass man die nicht kommen sieht, ist ja klar. Vielleicht kannst du einen Warnungs-Indikator einbauen (sowas wie einen roten Pfeil in die entsprechende Richtung).

Superwayne

Treue Seele

Beiträge: 245

Beruf: Student & App Entwickler (Xamarin)

  • Private Nachricht senden

3

27.11.2016, 13:22

Ansonsten (wenn die Asteroiden nur von vorne kommen) wäre ein Tetraeder zur Kollisionserkennung vielleicht eine Option.
Der Sichtbare Bereich wird ja durch das view frustum beschrieben und durch die near und far plane begrenzt. Das Tetraeder zur Kollisionserkennung müsste dann die länge bis zur near plane haben. In folgendem Bild wären die roten gestrichelten Linien dein Tetraeder:


Aber ob sich das besser anfühlt, kann ich dir nicht beantworten.

birdfreeyahoo

Alter Hase

  • »birdfreeyahoo« ist der Autor dieses Themas

Beiträge: 721

Wohnort: Schorndorf

Beruf: Student der Softwaretechnik

  • Private Nachricht senden

4

27.11.2016, 14:59

Von hinten sollten sie einen eigentlich nicht treffen. Sie kommen von vorne und bewegen sich linear parallel zum Spieler. Möglicherweise wenn sie sich gegenseitig anstoßen und in Rotation bringen.

Aber danke schonmal für den Ansatz, ich werde ihn weiter verfolgen.

Werbeanzeige