jbi*_*lls 8 c++ opengl quaternions glm-math
我正在使用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);
}
Run Code Online (Sandbox Code Playgroud)
但是,当我打电话时LookAt(0.0f,0.0f,0.0f),我的相机没有旋转到那一点.当我glm::eulerangles(rotation)在lookat 调用之后调用时,我得到一个具有以下值的vec3:(180.0f,0.0f,180.0f).position是(0.0f,0.0f,-10.0f),所以我根本不应该有任何旋转来看0,0,0.这是构建视图矩阵的函数:
glm::mat4 Camera::GetView() {
view = glm::toMat4(rotation) * glm::translate(glm::mat4(), position);
return view;
}
Run Code Online (Sandbox Code Playgroud)
为什么我没有得到正确的四元数,如何修复我的代码?
解:
你必须通过共轭来反转四元数的旋转:
using namespace glm;
quat orientation = conjugate(toQuat(lookAt(vecA, vecB, up)));
Run Code Online (Sandbox Code Playgroud)
lookAt函数是gluLookAt的替代品,用于构造视图矩阵.
视图矩阵用于围绕观察者旋转世界,因此是相机变换的反转.
通过采用逆的倒数,您可以获得实际的变换.
我想使用 glm 预先编写的 Lookat 函数来避免重复代码。
但这不是重复代码。出来的矩阵glm::lookat只是一个mat4. 从四元数到 3 个向量的转换,只是为了glm::lookat将其转换回方向,这只是浪费时间。你已经完成了 85% 的lookat工作;剩下的就做吧。
| 归档时间: |
|
| 查看次数: |
5090 次 |
| 最近记录: |