2

この回答に基づいて、 glm::quat を使用して回転を表す lookat 関数を作成しようとしています。しかし、正しい角度を得るのに苦労しています。これは私のlookat関数です:

void Camera::LookAt(float x, float y, float z) {
    glm::vec3 lookVector = glm::vec3(x, y, z);
    assert(lookVector != position);

    glm::vec3 direction = glm::normalize(lookVector-position);
    float dot = glm::dot(glm::vec3(0, 0, -1), direction);
    if (fabs(dot - (-1.0f)) < 0.000001f)
        rotation = glm::quat(RadiansToDegrees(M_PI), 0.0f, 1.0f, 0.0f);
    if (fabs(dot - (1.0f)) < 0.000001f)
        rotation = glm::quat();

    float angle = RadiansToDegrees(acosf(dot));

    glm::vec3 cross = (glm::cross(glm::vec3(0, 0, -1), direction));
    rotation = glm::normalize(glm::angleAxis(angle, cross));

    std::cout << glm::eulerAngles(rotation).x  << " " << glm::eulerAngles(rotation).y << " " << glm::eulerAngles(rotation).z << "\n";
}

カメラが (0.0f, 0.0f, -10.0f) にあるときに LookAt(0.0f, 0.0f, 0.0f) を呼び出すと、正しい回転 0,0,0 が出力されます。ただし、カメラを (0.0f, -0.01f, -10.0f) 以上に移動すると、約 124,0,0 の回転が得られます。y を -0.01f だけ平行移動し続けると、これは低下します。四元数を正規化しないと、この問題は発生しません。回転は x 軸を中心に 124 のままですが、見た目は問題ありません。ただし、後でクォータニオンを正規化すると、再び約 124 に回転するように見えます。正規化できません。crossこれを行うと、アサートがスローされるためです。lookat 関数から x について 124 のオイラー角を取得する原因は何ですか?また、どうすれば修正できますか?

4

2 に答える 2