Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

birdfreeyahoo

Alter Hase

  • »birdfreeyahoo« ist der Autor dieses Themas

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

1

27.12.2017, 22:14

Kamerarotation um fokussierten Punkt

Guten Abend,
ich benötige ein wenig Hilfe bei einer Kamerarotation die ich implementiert habe.
Ich verwende die Unreal Engine 4 und es handelt sich dabei um ein Strategiespiel, dafür möchte ich die Kamera mit dem Mausrad um den fokussierten Punkt (auf dem Boden) drehen (kennt man vielleicht aus dem ein oder anderen Spiel).
Dafür führe ich einen Trace von der Kamera in ihre Vorwärtsrichtung durch. Dieser wird vom Boden blockiert und ich erhalte damit meinen fokussierten Punkt. Mithilfe von Kugelkoordinaten berechne ich dann die neue Position der Kamera und richte sie danach wieder auf selbigen Punkt aus. Das Problem ist, dass der nächste Trace mir einen anderen Punkt liefert. Dieser liegt zwar in nächster Nähe, aber der Kamerashift, wenn sie sich plötzlich auf den neuen Punkt ausrichtet, ist deutlich bemerkbar wenn man rotieren will. Daher berechne ich den Punkt auch sobald man die Rotation beginnt und speicher ihn. Ich berechne ihn aber nicht jeden Frame von neu, sonst landet die Kamera irgendwo. Sobald man aber das Mausrad drückt rotiert die Kamera leicht und "fokussiert" einen anderen Punkt.

Hier habe ich erstmal den Quellcode (aus der Tick-Funktion):

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
        if (PC && bIsRotating)
    {
        FVector2D MousePos;
        PC->GetMousePosition(MousePos.X, MousePos.Y);
        FVector2D MouseDelta = MousePos - LastMousePosition;

        FTransform RotationCenterTransform = FTransform(FRotator::ZeroRotator, RotationCenter);
        FVector RelativeLocation = RotationCenterTransform.InverseTransformPosition(GetActorLocation());

        float Theta, Phi;
        GetSphericalCoords(RelativeLocation, Theta, Phi);
        Theta -= MouseDelta.Y * RotateSpeed * DeltaTime;
        Phi += MouseDelta.X * RotateSpeed * DeltaTime;

        Theta = FMath::DegreesToRadians(FMath::ClampAngle(FMath::RadiansToDegrees(Theta), 1.0f, 90.0f));

        FVector NewLocation = GetCartesianCoords(RelativeLocation.Size(), Theta, Phi);
        SetActorLocation(RotationCenterTransform.TransformPosition(NewLocation), true);
        SetActorRotation((RotationCenter - GetActorLocation()).Rotation());

        LastMousePosition = MousePos;
    }


Ich vermute, dass es einfach die Präzision ist, dass der LineTrace nicht denselben Punkt findet, auf den die Kamera direkt draufzeigt. Aber vielleicht habe ich auch nur einen Fehler gemacht.
Ich bräuchte dann eventuell einen anderen Ansatz um mein Problem zu umgehen. Folgende Ideen hatte ich:

  • Da der Boden uneben ist, eventuell den Trace gegen einen Ebene ausführen (also eine LinePlaneIntersection), die ungefähr auf Höhe des Bodens liegt.
  • Im ersten Frame nach dem Rotationsbeginn die neue Position speichern (diese wird "geshiftet" sein, da sich die Kamera auf das RotationCenter ausrichtet, welches davor getraced wurde, danach bleibt sie konstant auf den gleichen Punkt gerichtet) und in jedem weiteren Schritt gegen diese interpolieren, dass man keiner

Bevor ich das aber ändere, wollte ich erstmal die Meinung und Erfahrungen der anderen hören.

Danke schonmal im Voraus.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

28.12.2017, 13:42

Deine Lösung klingt so weit schon recht sinnvoll (zumindest die Beschreibung, Code habe ich mir nicht angeschaut). Ungenauigkeiten wirst du anders nie vollständig wegbekommen.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

birdfreeyahoo

Alter Hase

  • »birdfreeyahoo« ist der Autor dieses Themas

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

3

28.12.2017, 18:39

:dash: :dash: :dash:

Merkts jemand?

C-/C++-Quelltext

1
2
// Semantik der Paramter: OutHitInfo, StartLocation, EndLocation, CollisionChannel
GetWorld()->LineTraceSingleByChannel(Hit, GetActorLocation(),GetActorForwardVector() * 100000.0f, COLLISION_FLOOR);




Solved.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

28.12.2017, 23:25

EndLocation mit Richtung verwechselt :)

Werbeanzeige