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

Tankard

Treue Seele

  • »Tankard« ist der Autor dieses Themas

Beiträge: 192

Beruf: Student, Hardware- und Softwareentwicklung als wissenschaftliche Hilfskraft

  • Private Nachricht senden

1

02.01.2014, 17:56

[Unity] Camera Orbit Skript, Problem bei Sicht von Oben

Moin,

ich habe ein kleines Problem mit meinem Orbit Skirpt für eine freie Kamera. Ich möchte damit die Kamera um ein Objekt herum rotieren lassen will. Ich habe nun ein Problem, wenn ich eine Rotation von x = 90° erreicht habe, also von oben auf mein Objekt gucke. Dabei kann ich teilweise nicht mehr weiter um die x-Achse rotieren. Wenn ich versuche die Kamera zu rotieren, dann tut sich entweder garnichts, es zittert oder es macht einen kleinen Sprung und dann geht wieder alles normal. Auch habe ich manchmal Sprünge um die y-Achse von +-180°.

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
    void LateUpdate ()
    {
        var angles = transform.eulerAngles;
        angleHor = angles.y;
        angleVert = angles.x;
        
/*
 * Andere Bewegungen der Kamera
 */
        
        if ((target != null) && Input.GetKey(KeyCode.LeftControl)) // Orbiting
        {
            var rotVert = angleHor + Input.GetAxis("Mouse X") * orbitSpeed;
            var rotHor = angleVert - Input.GetAxis("Mouse Y") * orbitSpeed;
            
            var rotation = Quaternion.Euler(rotHor, rotVert, 0);
            transform.rotation = rotation;
            
            var targetPos = targetTransform.position;
            
            var distance = Vector3.Distance(this.transform.position, targetPos);
            
            var position = rotation * new Vector3(0.0f, 0.0f, -distance) + targetPos;
            transform.position = position;
        }
    }


Weiß jemand woran es liegt bzw. wie man das fixen kann?

Und noch als kleine Zwischenfrage:
Gibt es irgendwelche Richtlinien/Best-Practice wie man das Frustrum einer Kamera konfiguriert? Vorallem für das FoV wüsste ich nicht, was ich da am besten nehmen soll.

Renegade123

Alter Hase

Beiträge: 494

Wohnort: Berlin

Beruf: Certified Unity Developer

  • Private Nachricht senden

2

04.01.2014, 02:27

Mit Transform.Rotate klappt es:

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
public class Orbitting : MonoBehaviour {

    public Transform target = null;
    public float speed = 2.0f;
    
    void Update () {
        if (Input.GetKey(KeyCode.LeftControl)) {
            transform.Rotate(Input.GetAxis("Mouse Y") * speed, Input.GetAxis("Mouse X") * speed, 0.0f);
            transform.position = transform.rotation * new Vector3(0.0f, 0.0f, -Vector3.Distance(transform.position, target.position)) + target.position;
        }
    }
}


PS: Ich kenne keine allgemein gültigen Richtlinien in Unity für das Frustum bzw. FoV. Was hast du denn damit vor?
Liebe Grüße,
René

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

3

04.01.2014, 09:32

Stichwort Gimbal Lock.
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]

Tankard

Treue Seele

  • »Tankard« ist der Autor dieses Themas

Beiträge: 192

Beruf: Student, Hardware- und Softwareentwicklung als wissenschaftliche Hilfskraft

  • Private Nachricht senden

4

04.01.2014, 13:08

Mit Transform.Rotate klappt es:

Meine erste Version (für die normale Rotation) war mit transform.Rotate, aber da "kippt" die Kamera. Ich will/muss sicherstellen, dass die y-Achse wirklich immer nach oben zeigt. Rotationen um z müssen also vermieden werden, aber mit der normalen Rotation kann man ja mit Rotationen um 2 Achsen bereits alle Posen erreichen.

PS: Ich kenne keine allgemein gültigen Richtlinien in Unity für das Frustum bzw. FoV. Was hast du denn damit vor?

Ich mach ein TBS bei dem ich mich mit der Kamera frei über die Map bewegen kann. FoV steht standardmäßig auf 60, ich habe aber keine Ahnung was man da am besten nimmt. Letztendlich funktioniert es im Grunde ja mit jedem Wert. Die Near-Plane hab ich auf 0.3. Ich denke da sollte man einfach irgendwas kleines nehmen und dann passt das schon. Die Far-Plane steht derzeit auf 100. Ich denke bei der Far-Plane wird man nachher einfach gucken müssen wie weit man Rendern will/muss/sollte.
Ich hatte mich halt gefragt ob es da irgendwelche Faustregeln gitb um diese Werte zu setzen.

Stichwort Gimbal Lock.

Es werden doch intern eh Quaternionen benutzt, ist das trotzdem noch ein Problem?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

5

04.01.2014, 14:31

Das Problem tritt immer auf, wenn Du mit Euler-Winkeln rechnest.
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]

Tankard

Treue Seele

  • »Tankard« ist der Autor dieses Themas

Beiträge: 192

Beruf: Student, Hardware- und Softwareentwicklung als wissenschaftliche Hilfskraft

  • Private Nachricht senden

6

04.01.2014, 14:43

Ich dachte das wird umgangen da letztendlich ja trotzdem mit Quaternionen gerechnen wird. Bleibt mir also nichts anderes übrig als diese Situation zu vermeiden?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

7

04.01.2014, 14:45

Wie gesagt, solange Du selbst mit Euler-Winkeln hantierst, können auch Quaternionen das nicht einfach so beheben.
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]

Werbeanzeige