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

Lemming

Alter Hase

  • »Lemming« ist der Autor dieses Themas

Beiträge: 550

Beruf: Schüler

  • Private Nachricht senden

1

07.01.2006, 22:55

wie funktioniert eine verfolger kamera

hi,
wie die überschrift schon sagt versuche ich gerade eine verfolger kamera zu schreiben.
als vorlage hab ich einfach die aus galactica von david genommen.
aber meine verfolger kamera soll das schiff mit zeitverzögerung verfolgen, sodass sie die bewegung des schiffes nachfährt, wie zb bei den neueren starwars spielen.

meine überlegung, war, das ich 5 alte positionen und geschwindigkeiten und achsen des schiffes speichere und die 5 mal in der sekunde erneuere.
die aktuelle kamera position wird dann durch interpolation mit nem timer bestimmt.
hier ein stück code:

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
// erneuerung

    m_fCameraTimer += 5.0f * fTime;
    if(m_fCameraTimer > 1.0f)
    {
        m_fCameraTimer = 0.0f;
        // Positionen

        m_vLastPos[4] = m_vLastPos[3];
        m_vLastPos[3] = m_vLastPos[2];
        m_vLastPos[2] = m_vLastPos[1];
        m_vLastPos[1] = m_vLastPos[0];
        m_vLastPos[0] = m_pPlayer->GetPosition();
        // Geschwindigkeiten

        m_fLastSpeed[4] = m_fLastSpeed[3];
        m_fLastSpeed[3] = m_fLastSpeed[2];
        m_fLastSpeed[2] = m_fLastSpeed[1];
        m_fLastSpeed[1] = m_fLastSpeed[0];
        m_fLastSpeed[0] = m_pPlayer->GetVelocity().z;
        // Y-Achsen

        m_vLastYAxis[4] = m_vLastYAxis[3];
        m_vLastYAxis[3] = m_vLastYAxis[2];
        m_vLastYAxis[2] = m_vLastYAxis[1];
        m_vLastYAxis[1] = m_vLastYAxis[0];
        m_vLastYAxis[0] = m_pPlayer->GetYAxis();
        // Z-Achsen

        m_vLastZAxis[4] = m_vLastZAxis[3];
        m_vLastZAxis[3] = m_vLastZAxis[2];
        m_vLastZAxis[2] = m_vLastZAxis[1];
        m_vLastZAxis[1] = m_vLastZAxis[0];
        m_vLastZAxis[0] = m_pPlayer->GetZAxis();
    }
// Kamera position

        m_vCameraPos = 
              tbVector3InterpolateCoords(m_vLastPos[4], m_vLastPos[3], m_fCameraTimer)
            - tbVector3InterpolateNormal(m_vLastZAxis[4], m_vLastZAxis[3], m_fCameraTimer)
                * m_pPlayer->m_pType->pModel->GetBoundingSphereRadius() * 2.5f
                * (( m_pPlayer->m_fThrottle > 0.0f ) ? ( 1.0f - m_pPlayer->m_fThrottle ) : ( 1.0f ))
            + tbVector3InterpolateNormal(m_vLastYAxis[4], m_vLastYAxis[3], m_fCameraTimer)
                * m_pPlayer->m_pType->pModel->GetBoundingSphereRadius() * 1.0f;
        m_vCameraLookAt = m_vCameraPos + tbVector3InterpolateNormal(m_vLastZAxis[4], m_vLastZAxis[3], m_fCameraTimer);
        m_vCameraUp = tbVector3InterpolateNormal(m_vLastYAxis[4], m_vLastYAxis[3], m_fCameraTimer);


meine erstes problem ist, dass das ganze ruckelt und nicht wirklich weiß wieso, das ruckeln wird stärker, wenn ich die erneuerung zB 10 mal in der sekunde mache...
außerdem frag ich mich ob es nicht einen einfacheren weg gibt sone verfolger kamera zu schreiben.

freue mich schon auf eure antworten....
Es gibt Probleme, die kann man nicht lösen.
Für alles andere gibt es C++...

Phil_GDM

Alter Hase

Beiträge: 443

Wohnort: Graz

Beruf: Student-Softwareentwicklung u. Wissensmanagement

  • Private Nachricht senden

2

08.01.2006, 01:45

Wieso 5 alte Positionen?
Weiso 5 mal in der Sekune erneuern?

PS: Bei 5 mal in der Skeunde aktualisieren: da wundert mich ein ruckelt nicht

mfg Philipp

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

3

08.01.2006, 14:05

Du brauchst keine alten Positionen zu speichern.
Du musst einfach nur die Kamera so programmieren, dass sie ihre Position langsam an ihre Zielposition anpasst. Also nimmst Du z.B. immer die Differenz zwischen aktueller Position und Zielposition und verschiebst sie dann ein Stückchen in diese Richtung. Wenn der Spieler sich nicht mehr bewegt, erreicht die Kamera dann irgendwann die richtige Position.

Lemming

Alter Hase

  • »Lemming« ist der Autor dieses Themas

Beiträge: 550

Beruf: Schüler

  • Private Nachricht senden

4

08.01.2006, 16:43

wieso einfach wenns auch kompliziert geht...
dau ich sollte mir nicht nachts irgendwelche sachen überlegen
danke
Es gibt Probleme, die kann man nicht lösen.
Für alles andere gibt es C++...

Lemming

Alter Hase

  • »Lemming« ist der Autor dieses Themas

Beiträge: 550

Beruf: Schüler

  • Private Nachricht senden

5

08.01.2006, 17:20

habs jetzt so gemacht

C-/C++-Quelltext

1
2
3
4
5
        // Die Kamera befindet sich hinter und über dem Schiff.

        m_vCameraPos = tbVector3InterpolateCoords(m_vCameraPos, m_pPlayer->RelToAbsPos(tbVector3(0.0f, m_pPlayer->m_pType->pModel->GetBoundingSphereRadius() * 0.5f, -m_pPlayer->m_pType->pModel->GetBoundingSphereRadius() * 2.5f)), fFactor);
        m_vCameraLookAt = tbVector3InterpolateCoords(m_vCameraLookAt, m_pPlayer->GetPosition() + m_pPlayer->m_vZAxis, fFactor);
        m_vCameraUp = tbVector3InterpolateNormal(m_vCameraUp, m_pPlayer->m_vYAxis, fFactor);
        m_fFOV = TB_DEG_TO_RAD(80.0f);

sieht bei nem faktor von 0.1 bis 0.2 gar nicht schlecht aus.

das ruckelt liegt wahrscheinlich an meinem rechner, denn auch bei der freechase cam ruckelts und an der hab ich noch nichts verändert...
mal schaun
Es gibt Probleme, die kann man nicht lösen.
Für alles andere gibt es C++...

Werbeanzeige