基于四元数的相机不需要的卷轴
Quaternion-Based-Camera unwanted roll
我正在尝试实现基于四元数的相机,但是当围绕X轴和Y轴移动时,相机会在Z轴上产生不需要的滚动。我希望能够在所有轴上自由地环顾四周。我已经阅读了有关此问题的其他主题(例如:http://www.flipcode.com/forums/thread/6525),但我不明白"通过围绕 WORLD 轴旋转来连续重建旋转矩阵来解决此问题,即围绕 <1,0,0>、<0,1,0>、<0,0,1>,而不是您的本地坐标,无论它们是什么。
//Camera.hpp
glm::quat rotation;
//Camera.cpp
void Camera::rotate(glm::vec3 vec)
{
glm::quat paramQuat = glm::quat(vec);
rotation = paramQuat * rotation;
}
我像这样调用旋转函数:
cam->rotate(glm::vec3(0, 0.5, 0));
这一定与局部/世界坐标有关,对吧?我只是不明白,因为我认为四元数总是相互基于的(因此四元数不能在"世界"或"局部"空间中?另外,我应该为相机使用多个四元数吗?
据我了解,从您提供的代码来看,它们的意思是,您不应该通过一直对旋转四重数应用旋转来增量存储和应用旋转,而是跟踪每个轴的两个四元数(世界空间中的 X 和 Y)并计算旋转矢量作为它们的乘积。
[编辑:一些添加的(伪)代码]
// Camera.cpp
void Camera::SetRotation(glm::quat value)
{
rotation = value;
}
// controller.cpp --> probably a place where you'd want to translate user input and store your rotational state
xAngle += deltaX;
yAngle += deltaY;
glm::quat rotationX = QuatAxisAngle(X_AXIS, xAngle);
glm::quat rotationY = QuatAxisAngle(Y_AXIS, yAngle);
camera.SetRotation(rotationX * rotationY);
相关文章:
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 是否有类似std::lower_bound的函数,而不需要排序/分区输入
- 为什么output_editor Concept不需要output_e迭代器标记
- 在除法中不需要四舍五入
- 与C代码相比,为什么C++代码不需要"#define _POSIX_C_SOURCE 200809L"?
- 将值从另一个数组写入数组,不包括不需要的值 C++
- C++ 写入路径名中包含不需要的空字符的文件
- 是否有必要获取锁并在不需要唤醒线程时通知condition_variable?
- 使用 assimp 加载模型 - 不需要提升?
- 为什么转换函数声明不需要至少一个定义类型说明符
- 返回不需要的值的二叉搜索程序
- 当我不需要数据库中的所有值时,如何部分初始化 c++ 对象?
- C++:用户输入会产生不需要的行为
- 如何在不需要LIBCD.lib的情况下在Visual Studio 6中编译C项目
- 为什么python需要全局关键字而C/C++不需要?
- 将一个宏传递到另一个宏而不是直接传递内容时会出现不需要的额外"空"参数
- 为什么我们需要在 C++ 中检查空指针,而在 Java 中不需要?
- FPS相机上不需要的胶卷
- 基于四元数的相机不需要的卷轴
- OpenGL尝试翻译对象,但相机也会翻译,我不需要