I'm writing a camera which needs to change a quaternion to Euler angles than change them back, it only works when the yaw is less than 90 degrees, I wrote a example to check:
glm::vec3 euler_angler = {0, 0, 0};
for (int i = 0; i < 91; i++) {
std::cout << "before: " << euler_angler.x << ", " << euler_angler.y << ", " << euler_angler.z << std::endl;
euler_angler.y += 1;
glm::quat quat({glm::radians(euler_angler.x), glm::radians(euler_angler.y), glm::radians(euler_angler.z)});
glm::vec3 new_euler_angler = glm::eulerAngles(quat);
std::cout << "after: " << glm::degrees(new_euler_angler.x) << ", " << glm::degrees(new_euler_angler.y) << ", "
<< glm::degrees(new_euler_angler.z) << std::endl;
}
and when the Euler angles is {0, 89, 0}, then the Euler angles changed back to quat
is the same, which is {0, 89, 0}, but when the origin changes to {0, 90, 0}, the new_euler_angler
suddenly becomes to {180, 89.0001, 180}, and makes my camera rotation a mess.
Can someone help why this happened and what should I do?
the code of my camera:
glm::vec3 euler_angler = glm::eulerAngles(transform_data.rotation);
euler_angler.x = euler_angler.x + glm::radians(delta_y);
euler_angler.y += glm::radians(delta_x);
euler_angler.z = 0;
transform_data.rotation = glm::quat(euler_angler);
and here's my calculation of view matrix(which is a suspect because all other tutorials are using lookat matrix, I'm not sure my way is right or not):
// the position and rotation of the camera
auto transform_data = actor_.GetTransform().GetData();
glm::mat4 view = glm::mat4(1.0f);
view = glm::translate(view, -transform_data.position);
view = glm::toMat4(glm::quat(transform_data.rotation.w,
-transform_data.rotation.x,
-transform_data.rotation.y,
-transform_data.rotation.z)) * view;
render_camera_.SetViewMatrix(view);
glm::mat4 projection;
projection = glm::perspective(glm::radians(fov_), (float) aspect_, 0.1f, 100.0f);
render_camera_.SetProjectionMatrix(projection);