我正在使用glm创建相机类,并且在lookat函数中遇到了一些问题。我正在使用四元数来表示旋转,但是我想使用glm的预先编写的lookat函数来避免重复代码。这是我现在的lookat函数:
void Camera::LookAt(float x, float y, float z) {
glm::mat4 lookMat = glm::lookAt(position, glm::vec3(x, y, z), glm::vec3(0, 1, 0));
rotation = glm::toQuat(lookMat);
}
但是,当我调用
LookAt(0.0f,0.0f,0.0f)
时,我的相机没有旋转到该点。当在lookat调用之后调用glm::eulerangles(rotation)
时,我得到一个带有以下值的vec3:(180.0f,0.0f,180.0f)。 position
是(0.0f,0.0f,-10.0f),所以我完全不应该旋转以查看0,0,0。这是构建 View 矩阵的函数:glm::mat4 Camera::GetView() {
view = glm::toMat4(rotation) * glm::translate(glm::mat4(), position);
return view;
}
为什么我没有得到正确的四元数,如何解决我的代码?
最佳答案
解决方案:
您必须通过共轭反转四元数的旋转:
using namespace glm;
quat orientation = conjugate(toQuat(lookAt(vecA, vecB, up)));
说明:
lookAt函数是用于构造gluLookAt的view matrix的替代。
View 矩阵用于旋转查看器周围的世界,因此是摄影机变换的逆函数。
通过取逆的逆,可以得到实际的变换。
关于c++ - 将glm::lookat矩阵转换为四元数并返回,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18151845/