我正在使用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函数是用于构造gluLookAtview matrix的替代。

View 矩阵用于旋转查看器周围的世界,因此是摄影机变换的逆函数。

通过取逆的逆,可以得到实际的变换。

关于c++ - 将glm::lookat矩阵转换为四元数并返回,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18151845/

10-12 03:01