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

Pixma

Frischling

  • »Pixma« ist der Autor dieses Themas

Beiträge: 35

Wohnort: Mainz

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

1

13.05.2017, 15:15

Kamera und Objekt zusammenkoppeln

Hallo alle zusammen,

ich habe ein Problem an dem ich zurzeit sitze und zwar möchte ich meine Kamera an das Objekt koppeln wie in einer Third Person Kamera.
Jedoch bekomme ich das nicht richtig hin.

Die Methode soll bewirken, dass die Kamera sich um das Objekt dreht, das funktioniert auch.

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
void CameraManager::setThirdPersonCamera(float mouseX, float mouseY, float *differenceOffsetX)
{
    //= 43.9;
    // = 114.73;

    float offsetX = mouseX - oldMousePositionX;
    float offsetY = oldMousePositionY - mouseY;

    oldMousePositionX = mouseX;
    oldMousePositionY = mouseY;

    float sensitivity = 0.005;

    offsetX *= sensitivity;
    offsetY *= sensitivity;

    

    pitch -= offsetY;
    yaw += offsetX;

    if (pitch > 89.0f)
        pitch = 89.0f;

    if (pitch < -89.0f)
        pitch = -89.0f;

    *differenceOffsetX = yaw;

    cameraPositionX = 10 * cos(pitch) * cos(yaw);
    cameraPositionY = 10 * sin(pitch);
    cameraPositionZ = 10 * cos(pitch) * sin(yaw);
}


Diese Methode positioniert meine Kamera in der Welt

C-/C++-Quelltext

1
2
3
4
void CameraManager::repositionCamera()
{
    gluLookAt(this->cameraPositionX, this->cameraPositionY, this->cameraPositionZ, this->viewAtPositionX, this->viewAtPositionY,this->viewAtPositionZ, 0., 1., 0.); // // Ansicht Schräg oben
}


Die Funktion zeichnet einfach das Bild in den Viewport

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void RenderScene() //Zeichenfunktion
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity ();   // Aktuelle Model-/View-Transformations-Matrix zuruecksetzen

    cameraManager.repositionCamera(); // positioniert meine Kamera immer um das Objekt, wenn ich die Maus bewege wie in CAD Programmen


    glPushMatrix();
    //glRotatef(tesst += 0.2, 0, 1, 0);
    glRotatef(tesst, 0, 1, 0); // Die Variable tesst ist zurzeit einfach eine Variable, worüber ich den Winkel erhöhe zum rotieren
    oldPitch = xRotation - oldPitch;
    glEnable(GL_TEXTURE_2D);
    polgen.createShip(3);
    glDisable(GL_TEXTURE_2D);
    glPopMatrix();

    glutSwapBuffers();
    glFlush();
}


Die Funktion ruft einfach meine Funktion auf um die kamera zu bewegen (x und y sind die Mauskoordinaten)

C-/C++-Quelltext

1
2
3
4
5
void mouseMove(int x, int y)
{
    cameraManager.setThirdPersonCamera(x, y, &xRotation);
        tesst += xRotation ;
}


Ich bin echt am verzweifeln, ich habe bereits im Internet geschaut, jedoch finde ich nur Ressourcen, welche einen zeigen wie man die Kamera um das Objekt rotiert, aber nicht das Objekt
an die Kamera koppelt.
Durch die Funktion glRotatef(tesst += xRotation, 0, 1, 0); will ich das Objekt immer um den Pitch Winkel drehen. So das sozusagen die Nase meines Schiffes (mein Objekt) immer in einer Linie mit meiner Kamera ist. Jedoch erreiche ich dadurch nur, dass sich das Objekt wie wild dreht.

Vielen Dank für eure Hilfe schon im voraus :)

Gruß Dennis

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Pixma« (13.05.2017, 16:13)


SlinDev

Treue Seele

Beiträge: 142

Wohnort: Lübeck

Beruf: Programmierer

  • Private Nachricht senden

2

14.05.2017, 14:07

Wenn ich dein Problem richtig verstehe, möchtest du, dass die Kamera immer dein Schiff anguckt und immer wenn du die Kamera drehst, dass Schiff sich entsprechend genauso weit mitdreht? Eine Variante wäre weder die Kamera noch das Schiff zu drehen, für alle anderen Objekte aber die Kamera zu drehen.
Dein Hauptproblem ist aber wahrscheinlich, dass sin und cos den Winkel in Radian erwarten, glRotatef aber in Grad. Außerdem willst du die Kamerarotation ja eigentlich ausgleichen, deshalb müsste es glaube ich auch noch negiert werden. Was ich jetzt nicht so ganz verstehe ist warum sich dein Schiff wie wild dreht, eigentlich sollte das eher die Kamera tun, wobei das ohne andere Objekte als Referenz eh beides gleiche aussieht.
Was steht bei dir in viewAtPositionX/Y/Z?

Ähnliche Themen