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

Kevin

Frischling

  • »Kevin« ist der Autor dieses Themas

Beiträge: 10

Wohnort: Karlsruhe

  • Private Nachricht senden

1

04.05.2009, 19:10

First Person Camera

Hi,
Ich habe einige Probleme mit meiner FirstPersonCamera. Ich habe einen Fehler gefunden, den ich mir nicht erklären kann.
Wenn man die Camera z.B. um die Y-Achse dreht, dann dreht sie manchmal schneller und manchmal langsamer.
(mit dem bewegen stimmt auch was nicht, aber ich denke das hängt zusammen)
Das ganze ist Timer gesteuert, deshalb kann es nicht an schwankender Framerate liegen...

Ihr könnt es euch ja mal anschauen, aber ihr braucht DX 10 :!: : http://rapidshare.com/files/229120908/Sample.zip.html
(Steuerung WSAD und Pfeiltasten)

Aber jetzt werde ich euch erst mal den Code zeigen:

Die Update Methode meiner Camera:

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
42
43
44
45
46
47
48
49
50
51
52
void FirstPersonCamera::Update(GameTime* pGameTime, InputDevice* pInputDevice) {
    //Die Rotation abfragen:

    Vector3 rotDir = Vector3::Zero;
    if(pInputDevice->IsKeyDown(DIK_RIGHT)) 
        rotDir += Vector3::Up;
    if(pInputDevice->IsKeyDown(DIK_LEFT)) 
        rotDir += Vector3::Down;
    if(pInputDevice->IsKeyDown(DIK_UP)) 
        rotDir += Vector3::Left;
    if(pInputDevice->IsKeyDown(DIK_DOWN)) 
        rotDir += Vector3::Right;

    //Nur wenn die länge NICHT 0 ist soll rotiert werden, weil andernfalls wurde die Camera ohnehin nicht bewegt

    if(rotDir.Length() != 0){
        rotDir.Normalize();
        Rotate(&rotDir, pGameTime);
    }

    //Die Bewegeung abfragen:

    Vector3 moveDir = Vector3::Zero;

    if(pInputDevice->IsKeyDown(DIK_W))
        moveDir += Vector3::Forward;
    if(pInputDevice->IsKeyDown(DIK_S))
        moveDir += Vector3::Backward;
    if(pInputDevice->IsKeyDown(DIK_D))
        moveDir += Vector3::Left;
    if(pInputDevice->IsKeyDown(DIK_A))
        moveDir += Vector3::Right;

    if(moveDir.Length() != 0){
        moveDir.Normalize();
        Move(&moveDir, pGameTime);
    }

    //Das Target berechnen:

    Vector3 origTarget = Vector3::Forward;
    Matrix rotXYZ;
    rotXYZ.CreateRotationXY(m_Rotations.X, m_Rotations.Y);
    origTarget.Transform(&rotXYZ);

    m_Target = m_Position + origTarget;

    //Den Up Vector berechnen

    Vector3 origUp = Vector3::Up;
    origUp.Transform(&rotXYZ);

    m_Up = origUp;

    //Dann die View Matrix aktualiesieren

    UpdateView();
}


Und die Move und Rotate Methode:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
void FirstPersonCamera::Move(Vector3 *pDir, GameTime *pGameTime) {
    Matrix rotXYZ;
    rotXYZ.CreateRotationXY(m_Rotations.X, m_Rotations.Y);
    pDir->Transform(&rotXYZ);

    m_Position += *pDir * m_Speed * pGameTime->GetElapsedSinceLastFrame();
}

void FirstPersonCamera::Rotate(Vector3 *rot, GameTime *pGameTime) {
    m_Rotations += *rot * m_RotSpeed * pGameTime->GetElapsedSinceLastFrame();
}


Ich benutze eigene Vector und Matrix Klassen aber ich bezweifele, dass mit denen was nicht stimmt, da ich sie bereits getestet habe ;)
(zumindest wäre es schlimm wenn ich irgendwelche Fehler in den Klassen nicht entdeckt hätte :shock: )

Hoffentlich könnt Ihr mir irgendwie weiterhelfen...

MfG
Kevin

K-Bal

Alter Hase

Beiträge: 703

Wohnort: Aachen

Beruf: Student (Elektrotechnik, Technische Informatik)

  • Private Nachricht senden

2

04.05.2009, 19:24

Du sagst zwar, dass dein Code Framerate-unabhängig ist, aber dann müsstest du doch eigentlich noch irgendwo mit der Framezeit multiplizieren :?:

Edit: Ah sorry, hatte es im unteren Code übersehen.

BlackSnake

Community-Fossil

Beiträge: 1 549

Beruf: Student

  • Private Nachricht senden

3

04.05.2009, 21:51

evtl ist hier was für dich dabei: http://www.dhpoware.com/demos/index.html
;)

Kevin

Frischling

  • »Kevin« ist der Autor dieses Themas

Beiträge: 10

Wohnort: Karlsruhe

  • Private Nachricht senden

4

05.05.2009, 11:46

Ok danke,
ich werde mir mal das Beispiel da anschauen vllt hilft es ja den Fehler zu finden.

MfG
Kevin

Kevin

Frischling

  • »Kevin« ist der Autor dieses Themas

Beiträge: 10

Wohnort: Karlsruhe

  • Private Nachricht senden

5

05.05.2009, 15:07

Hi,
noch eine Frage, ich transformiere ja meine Vectoren.
Und wollte mal fragen ob das so überhaupt richtig ist:

C-/C++-Quelltext

1
2
3
4
5
void Vector3::Transform(Matrix* m) {
    X = ((X * m->m[0][0]) + (Y * m->m[1][0]) + (Z * m->m[2][0])) + m->m[3][0];
    Y = ((X * m->m[0][1]) + (Y * m->m[1][1]) + (Z * m->m[2][1])) + m->m[3][1];
    Z = ((X * m->m[0][2]) + (Y * m->m[1][2]) + (Z * m->m[2][2])) + m->m[3][2];
}


MfG
Kevin

Kevin

Frischling

  • »Kevin« ist der Autor dieses Themas

Beiträge: 10

Wohnort: Karlsruhe

  • Private Nachricht senden

6

07.05.2009, 22:04

Hmm...es klappt immer noch nicht... :(
Hat den niemand eine Idee :?:

MfG
Kevin

Werbeanzeige