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

C0dR

Frischling

  • »C0dR« ist der Autor dieses Themas
  • Private Nachricht senden

1

17.11.2012, 10:33

aus xyz koordinaten / rotation forward vector bekommen

Hallo,

ich habe eine Kamera mit xyz koordinaten (als Vector3) und xyz Rotationen (ebenfalls als Vector3). Nun benötige ich aber für eine Verfolgerkamera den forward vector damit ich die Kamera hinter das Ziel platzieren kann. Nur wie stelle ich das an mit meinen gegebenen Werten? Alles was ich im internet gefunden hab läuft über right / up vektoren.

Meine 2. Frage wäre, wie könnte ich mit meinen Werten ein "lookat" realisieren? Hier hab ich ebenfalls nur alles mit right / up vektoren gefunden. Oder sollte ich lieber meine Kamera komplett auf eine 4x4 Matrix umstellen? (Damit kenn ich mich allerdings nicht so gut aus 8| )


Im moment sieht meine Implementierung so aus:

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
static float distance = 20.0f;
    static float height = 60.0f;
    static float heightDamping = 3.0f;
    static float rotationDamping = 3.0f;

 float wantedRotationAngle = target->GetRotation().y;
 float wantedHeight = target->GetPosition().y + height;

    float currentRotationAngle = cam->GetRotation().y;
    float currentHeight = cam->GetPos().y;

    // Damp the rotation around the y-axis
    currentRotationAngle = LerpAngle(currentRotationAngle, wantedRotationAngle, rotationDamping * deltaTime);

    // Damp the height
    if(deltaTime != 0)
     currentHeight = Lerp (currentHeight, wantedHeight, heightDamping * deltaTime);

    // Convert the angle into a rotation
    quat currentRotation(Vec3f(0, currentRotationAngle, 0));
    
    // Set the position of the camera on the x-z plane to:
// distance meters behind the targetcam->SetPos( m->GetPosition());
cam->SetPos( cam->GetPos() - (currentRotation * %forwardVector% * distance));   //hier brauch ich den ForwardVector
cam->SetPosY(currentHeight);

//cam->LookAt(m->GetPosition().x,m->GetPosition().y,m->GetPosition().z);  //TODO

    cam->rotateX(common->GetMouseMove().y * MOUSE_SPEED );
    cam->rotateY(common->GetMouseMove().x * MOUSE_SPEED );


gruß
C0dR

P.S. falls es relevant ist, ich arbeite mit OpenGL

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »C0dR« (17.11.2012, 10:39)


Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

2

17.11.2012, 13:26

Du kennst die Position und die Rotation deiner Kamera. Damit weißt du doch schon alles was du brauchst? Right- und Upvector kannst du damit ganz einfach bestimmen. Upvector zeigt nach oben und Rightvector nach rechts in deinem Koordinatensystem. Dann verschiebst du die beiden zu der Kameraposition und drehst sie wie die Kamera. Damit hast du die beiden Vektoren in den Raum der Kamera transformiert. Wie du dann weiter machst hast du ja schon gefunden.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“