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

Der Dude

Treue Seele

  • »Der Dude« ist der Autor dieses Themas

Beiträge: 73

Wohnort: Elleringhausen-City

Beruf: ITA

  • Private Nachricht senden

1

15.12.2005, 23:41

Kamera drehen

Hallo,

ich möchte wie in dem Index/Bufferbeispiel die Kamera "einfach" nur um die eingene Achse drehen. Dazu habe ich folgendes in die Movefunktion geschrieben:

Ich benutze C#, sollte ich vielleicht noch an dieser Stelle erwähnen

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
23
24
25
26
27
28
29
30
31
private void move()
        {
            if (m_Keyboard.UP)
            {
                v_Cameraposition = v_Cameraposition + new Vector3(v_Cameraposition.X * 10f * (float)m_Timer.StopTime, 
                                                                  v_Cameraposition.Y * 10f * (float)m_Timer.StopTime,
                                                                  v_Cameraposition.Z * -10f * (float)m_Timer.StopTime);               
            }

            if (m_Keyboard.DOWN)
            {
                v_Cameraposition = v_Cameraposition + new Vector3(v_Cameraposition.X * 10f * (float)m_Timer.StopTime,
                                                                  v_Cameraposition.Y * 10f * (float)m_Timer.StopTime,
                                                                  v_Cameraposition.Z * 10f * (float)m_Timer.StopTime);
            }

            if (m_Keyboard.LEFT)
            {   
                f_CameraAngle += 15.0f * (float)m_Timer.StopTime;

                //PI in RAD

                f_CameraAngle = (f_CameraAngle * (float)Math.PI) / 180.0f;
                
                v_CameraView.X = (float)Math.Sin((double)f_CameraAngle);
                v_CameraView.Y = 0.0f;
                v_CameraView.Z = (float)Math.Cos((double)f_CameraAngle);                
             }

            m_View = Microsoft.DirectX.Matrix.LookAtLH(v_Cameraposition, v_CameraView, v_CameraRoll));
            m_Device.SetTransform(TransformType.View, m_View);   
        }


Wieder aller Erwartungen passiert leider nichts. Die Kamera bewegt sich kein Stück.
Im Buch steht folgendes:

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
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
tbVector3 vCameraDirection;

    // Zeitzähler erhöhen

    g_fTime += fNumSecsPassed;

    // Wenn der Benutzer die Pfeiltaste nach links oder rechts drückt,

    // erhöhen bzw. verringern wir den Drehwinkel der Kamera.

    // Die Kamera soll sich mit 45° pro Sekunde drehen.

    if(GetAsyncKeyState(VK_LEFT)) g_fCameraAngle -= TB_DEG_TO_RAD(45.0f) * fNumSecsPassed;
    if(GetAsyncKeyState(VK_RIGHT)) g_fCameraAngle += TB_DEG_TO_RAD(45.0f) * fNumSecsPassed;

    // Wenn der Benutzer die Pfeiltaste nach oben oder unten drückt,

    // wird die Kamera vor- bzw. zurückbewegt. Dazu addieren wir die

    // Kamerablickrichtung zur Kameraposition bzw. subtrahieren sie.

    // Die Blickrichtung wird mit dem Sinus und dem Kosinus des Drehwinkels

    // der Kamera berechnet. Bewegung ist nur auf der xz-Ebene möglich.

    // Nun berechnen wir die Blickrichtung.

    vCameraDirection = tbVector3(sinf(g_fCameraAngle), 0.0f, cosf(g_fCameraAngle));

    // Die Kamera soll sich mit 10 Einheiten pro Sekunde bewegen.

    // Die Blickrichtung ist normalisiert und hat daher die Länge 1.

    if(GetAsyncKeyState(VK_UP)) g_vCameraPosition += vCameraDirection * 10.0f * fNumSecsPassed;
    if(GetAsyncKeyState(VK_DOWN)) g_vCameraPosition -= vCameraDirection * 10.0f * fNumSecsPassed;

    // Die Tasten "Bild auf" und "Bild ab" verändern das Sichtfeld.

    // So kann man in das Bild "hineinzoomen", mit 15 Grad pro Sekunde.

    if(GetAsyncKeyState(VK_PRIOR)) g_fFOV -= TB_DEG_TO_RAD(15.0f) * fNumSecsPassed;
    if(GetAsyncKeyState(VK_NEXT)) g_fFOV += TB_DEG_TO_RAD(15.0f) * fNumSecsPassed;

    // Das Sichtfeld darf 180° und 0° nicht erreichen.

    if(g_fFOV >= TB_DEG_TO_RAD(180.0f)) g_fFOV = TB_DEG_TO_RAD(179.9f);
    else if(g_fFOV <= TB_DEG_TO_RAD(0.0f)) g_fFOV = TB_DEG_TO_RAD(0.1f);

.
.
.
    mProjection = tbMatrixProjection(g_fFOV,    // Sichtfeld

                                     fAspect,   // Bildseitenverhältnis

                                     0.1f,      // Nahe Clipping-Ebene

                                     250.0f);   // Ferne Clipping-Ebene

    g_pD3DDevice->SetTransform(D3DTS_PROJECTION, (D3DMATRIX*)(&mProjection));


Hier ist mir unklar wieso das Sichtfeld jedes mal neu berechnet werden muss, bzw. wieso dieser Winkel nicht 0 und 180 Grad mehr/weniger haben darf.

Es wäre super, wenn ihr mir helfen könntet


TIM ;)
"Wenn ich morgens doppelt so schnell über den Flur laufe, kann ich 2 Minuten länger schlaften!" - leider war es ein Irrtum.

CW_Kovok

Alter Hase

Beiträge: 836

Wohnort: nähe Bonn

Beruf: Schüler

  • Private Nachricht senden

2

16.12.2005, 23:28

du änderst ja etwas am fov, das heißt, das die projektionsmatrix ungültig wird. Würdest du es nicht tun, so würde es hübsche verzerrungen geben, probiers mal aus, ist lustig :)
Was es alles gibt, das ich nich brauche - Aristoteles