Also arbeite ich an einer 3D-Malanwendung. Ich habe es geschafft, einen einfachen Renderer und Modelllader zu erstellen.

Ich habe ein Kamerasystem erstellt, mit dem ich durch die Szene navigieren kann (Maus / Tastatur), aber das ist nicht das, was ich will. Deshalb habe ich diese Kamera statisch gemacht und jetzt versuche ich , das Modell zu drehen / schwenken / zoomen selbst . Ich habe es geschafft, das Schwenken und Zoomen zu implementieren. Zum Schwenken ändere ich die x / y-Position entsprechend der Maus und zum Zoomen addiere oder subtrahiere ich die Z-Achse entsprechend der Mausrolle.

Aber jetzt möchte ich in der Lage sein, das 3D-Modell mit der Maus zu drehen. Beispiel: Wenn ich die rechte Maustaste gedrückt halte und die Maus nach oben bewege, sollte sich das Modell auf der x-Achse (Teilung) drehen. Wenn ich die Maus nach links / rechts bewege, sollte sie sich auf drehen y-Achse (Gieren) . Und ich konnte es einfach nicht tun.

Der folgende Code zeigt xpos / ypos des Cursors auf dem Bildschirm, berechnet den Versatz und " versucht den Würfel zu drehen ". Das einzige Problem ist, dass ich den Cuber nicht normal drehen kann, wenn ich die Maus nach oben bewege. Das Modell auf der x- und y-Achse mit einer kleinen Neigung drehen und umgekehrt.

Dies ist der Code in meiner Rendering-Schleife:

    shader.use();
    glm::mat4 projection = glm::perspective(glm::radians(45.0f), 
    (float)SCR_WIDTH/(float)SCR_HEIGHT, 0.01f, 100.0f);
    shader.setMat4f("projection", projection);

    glm::mat4 view = camera.getViewMatrix();
    shader.setMat4f("view", view);

    glm::mat4 modelm = glm::mat4(1.0f);
    modelm = glm::translate(modelm, object_translation);
    // Should rotate cube according to mouse movement
    //modelm = glm::rotate(modelm, glm::radians(angle), glm::vec3(0.0f));
    shader.setMat4f("model", modelm);

    renderer.draw(model, shader);

Dies ist der Anruf, bei dem ich den Rückruf der Mausbewegung abwickle:

void mouseCallback(GLFWwindow* window, double xpos, double ypos)
{
if (is_rotating)
{
    if (is_first_mouse)
    {
        lastX = xpos;
        lastY = ypos;
        is_first_mouse = false;
    }

    // xpos and ypos are the cursor coords i get those with the 
    mouse_callback
    double xoffset = xpos - lastX;
    double yoffset = lastY - ypos;

    lastX = xpos;
    lastY = ypos;

    object_rotation.y += xoffset; // If i use yoffset the rotation flips
    object_rotation.x += yoffset;

    rotation_angle += (xoffset + yoffset) * 0.25f;
}
}

Das Schwenken der Maus funktioniert auch einwandfrei. Das gilt nicht für die Drehung.

0
Abdelbaki Boukerche 14 Aug. 2020 im 21:28

2 Antworten

Beste Antwort

Ich habe es repariert. Nach einigen Recherchen und Fragen wurde mir gesagt, dass Sie nur eine Umdrehung gleichzeitig ausführen können und ich habe versucht, beide x / y-Achsen gleichzeitig auszuführen . Sobald ich die beiden Umdrehungen trenne . Objekt dreht sich jetzt zuerst auf der x-Achse und dann auf der y-Achse. Das Problem wurde gelöst.

Der Code sollte folgendermaßen aussehen:

shader.use();
    glm::mat4 projection = glm::perspective(glm::radians(45.0f), (float)SCR_WIDTH/(float)SCR_HEIGHT, 0.01f, 100.0f);
    shader.setMat4f("projection", projection);

    glm::mat4 view = camera.getViewMatrix();
    shader.setMat4f("view", view);

    glm::mat4 modelm = glm::mat4(1.0f);
    modelm = glm::scale(modelm, glm::vec3(1.0f));
    modelm = glm::translate(modelm, glm::vec3(0.0f, 0.0f, -5.0f));
    // Handle x-axis rotation
    modelm = glm::rotate(modelm, glm::radians(object_orientation_angle_x), glm::vec3(object_rotation_x, 0.0f, 0.0f));
    // Handle y-axis rotation
    modelm = glm::rotate(modelm, glm::radians(object_orientation_angle_y), glm::vec3(0.0f, object_rotation_y, 0.0f));
    shader.setMat4f("model", modelm);

    renderer.draw(model, shader);
0
Abdelbaki Boukerche 15 Aug. 2020 im 09:21

Sie speichern Ihre Drehung als Euler-Winkel in object_rotation.

Ich habe dir geraten zu verwenden:

glm::mat4 rotation = glm::eulerAngleYX(object_rotation.y, object_rotation.x); // pitch then yaw

Oder

glm::mat4 rotation = glm::eulerAngleXY(object_rotation.x, object_rotation.y); // yaw then roll

In Ihrem Fall sollten beide die Arbeit erledigen. Ich habe Ihnen in Zukunft geraten, diese Informationen in Ihrer Kamera (Auge, oben, Mitte) anstelle Ihres Objekts zu speichern. Alles wird einfacher.

0
Paltoquet 14 Aug. 2020 im 20:59