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

Marcel

Frischling

  • »Marcel« ist der Autor dieses Themas

Beiträge: 13

Beruf: Student

  • Private Nachricht senden

1

14.12.2003, 12:24

Kameraproblem

Kameraproblem

Hallo,
ich habe ein Problem mit der Kamera in meinem Programm: Am Punkt 0,0,0 befindet sich ein Gegenstand. Die Kamera befindet sich zu Beginn bei 0,0,-1 und blickt in Richtung 0,0,0. Nun habe ich, mit einer Sinusfunktion, dafür gesorgt, dass die Kamera nach rechts u. links, kreisförmig um den Gegenstand beweglich ist, sodass er rundum betrachtet werden kann (die Kamera rotiert sozusagen um die Y-Achse des Gegenstandes). - Soweit funktioniert das Ganze!

Als Nächstes wollte ich zusätzlich eine Bewegung nach oben u. unten möglich machen (um die X-Achse des Gegenstandes, um ihn auch von der Ober- u. Unterseite sehen zu können). Jetzt entstand aber ein Problem: Sobald sich die Kamera ca. im 90° Winkel über dem Gegenstand befand, schien sie sich von selbst zu drehen, sodass das Bild verkehrt herum zu sehen war!

Meine Frage ist: WAS passiert da und WARUM? Und WAS kann ich dagegen tun?

Maxi

Treue Seele

Beiträge: 136

Wohnort: Müncheberg

Beruf: Ich muss noch in die Schule

  • Private Nachricht senden

2

14.12.2003, 18:48

Code brauchen wir
Gruß, Maxi

Hier, die Homepage von meiner Band:
www.maxis-house.de

Könnt euch unsere ersten Songs saugen...

Marcel

Frischling

  • »Marcel« ist der Autor dieses Themas

Beiträge: 13

Beruf: Student

  • Private Nachricht senden

3

17.12.2003, 14:32

In der Move-Funktion:

Quellcode

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
27
28
...

    // Kamerabewegungen
    if(GetAsyncKeyState(VK_LEFT))
    {
        g_fCameraX += 0.01f;
        g_fCameraPos = tbVector3(sinf(g_fCameraX), 0.0f, cosf(g_fCameraX)) * (0.808f + 0.0155f);
    }

    if(GetAsyncKeyState(VK_RIGHT))
    {
        g_fCameraX -= 0.01f;
        g_fCameraPos = tbVector3(sinf(g_fCameraX), 0.0f, cosf(g_fCameraX)) * (0.808f + 0.0155f);
    }

    if(GetAsyncKeyState(VK_UP))
    {
        g_fCameraY += 0.01f;
        g_fCameraPos = tbVector3(0.0f, sinf(g_fCameraY), cosf(g_fCameraY)) * (0.808f + 0.0155f);
    }

    if(GetAsyncKeyState(VK_DOWN))
    {
        g_fCameraY -= 0.01f;
        g_fCameraPos = tbVector3(0.0f, sinf(g_fCameraY), cosf(g_fCameraY)) * (0.808f + 0.0155f);
    }

...


In der Render-Funktion:

Quellcode

1
2
3
4
5
6
7
8
9
10
...

        // Karmera Ausrichten ...
        mCamera = tbMatrixCamera(tbVector3(g_fCameraPos.x, g_fCameraPos.y, g_fCameraPos.z),
                                 tbVector3(0.0f, 0.0f, 0.0f),
                                 tbVector3(0.0f, 1.0f, 0.0f));
        // ... und übergeben
        g_pD3DDevice->SetTransform(D3DTS_VIEW, (D3DMATRIX*)(&mCamera));

...

4

17.12.2003, 19:45

Vermutung: Hier tritt der bei der für die Eulerschen Rotation typische "gimbal lock" auf, bei der bei der Drehung eine Rotationsachse verloren geht.
Lösung: Quaternion-Kamera benutzen.
Infos:
http://www.ais.fhg.de/ARC/3D/download/diplom/node75.html
http://www.gamedev.net/reference/articles/article1095.asp

Werbeanzeige