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

1

01.06.2014, 13:41

Beschränkung der Kamerarotation

Weiß jmd wie ich die Rotation der Kamera so beschränken kann das die Kamera nicht kopfüber ist?
Ich benutze eine etwas andere Version der 3D Game Engine(https://github.com/BennyQBD/3DGameEngine) von TheBennyBox.

Ausschnitt von FreeLook.java:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        if(mouseLocked)
        {
            Vector2f deltaPos = Input.getMousePosition().sub(centerPosition);

            boolean rotY = deltaPos.getX() != 0;
            boolean rotX = deltaPos.getY() != 0;

            if(rotY)
                getTransform().rotate(yAxis, (float) Math.toRadians(deltaPos.getX() * sensitivity));
            if(rotX)
                getTransform().rotate(getTransform().getRot().getRight(), (float) Math.toRadians(-deltaPos.getY() * sensitivity));

            if(rotY || rotX)
                Input.setMousePosition(centerPosition);
        }

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

2

01.06.2014, 13:47

Wenn du eine typische Shooterkamera haben willst, könnte man sogar noch akzeptabel mit Eulerwinkeln arbeiten und dann wäre das Beschränken sehr einfach.
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

3

01.06.2014, 14:06

Vier Möglichkeiten, die ich sehe:
  • Hol dir das rotation-quaternion (Transform.getRot()) nach der jetzigen Transformation einer temporären Transform-Instanz, wandel es in euler-winkel um und prüfe dann den Yaw-Euler-Winkel
  • Berechne selbst einen Look-At-Point mithilfe der trigonometrischen Funktionen und selbst gehandhabten euler-winkeln. Prüfe dann entsprechend den Yaw-Euler-Winkel und setze die Rotation mithilfe des Look-At-Point (Transform.lookAt(Vector3f point, Vector3f up))
  • Handhabe euler-winkel selbst, prüfe den Yaw-Winkel, konvertiere die euler-winkel selbst in ein Quaternion (siehe http://tog.acm.org/resources/GraphicsGem…e/EulerAngles.c) und setzte diesen direkt in die Transformation (Transform.setRot(Quaternion rotation))
  • Handhabe euler-winkel selbst, prüfe den Yaw-Winkel, konvertiere die euler-winkel selbst in eine Rotation matrix (siehe http://en.wikipedia.org/wiki/Euler_angles#Rotation_matrix) und nutze dann den Quaternion.Quaternion(Matrix4f rot)-Konstruktur, um daraus ein Quaternion zu machen, welchen du Transform.setRot übergeben kannst
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »iSmokiieZz« (01.06.2014, 14:12)


DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

4

01.06.2014, 14:27

Zwei Winkel: einen für die Hochachse, um sich drehen zu können, und eine für die Rechtsachse, um neigen zu können.
Damit transformierst du alles außer dem Spieler selbst. So rotierst du also die Welt, nicht den Spieler. Das verhindert dass man nichts mehr gerendert bekommt, wenn z.B. genau nach oben oder unten guckt (weil sonst Blickachse = Hochachse).
Beschränken kannst du dass dann einfach über den Winkel.

Hier ein Beispiel (header, source) für eine 3rd Person Kamera (rotiert um den lookAt Punkt, aber das ließe sich ja tauschen).

Werbeanzeige