この回答に基づいて、 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 のオイラー角を取得する原因は何ですか?また、どうすれば修正できますか?