glm::lookAt 垂直相机翻转时 z <= 0
glm::lookAt vertical camera flips when z <= 0
我正在开发一台FPS风格的相机,以便使用OpenGL在3D场景中飞行。我使用GLM进行数学运算,并使用鼠标移动在x轴和y轴上使用GLM::旋转来计算方向向量。我有一个静态的向上矢量,因为我可以在水平轴上扫射,不需要任何滚动。
但是,当我朝着负z方向向前移动并最终到达场景的中心点(z=0)时,垂直摄影机会翻转(y方向)。向下移动鼠标将导致向上移动。方向向量是按照应该的方式计算的,所以我猜这与glm::lookAt如何计算其视图矩阵有关?
以下是相关代码:
// Player movement
glm::vec3 position(0.0f, 0.0f, 5.0f);
glm::vec3 direction(0.0f, 0.0f, -1.0f);
glm::vec3 up(0.0f, 1.0f, 0.0f);
float speed = 0.05f;
bool warped = false;
...
void render()
{
...
view = glm::lookAt(position, position + direction, up);
glUniformMatrix4fv(glGetUniformLocation(basicShader.shaderProgram, "view"), 1, GL_FALSE, glm::value_ptr(view));
...
}
void handleKeyboard()
{
float speed = 0.05f;
if(keys['w'])
position += speed * direction;
if(keys['s'])
position -= speed * direction;
if(keys['a'])
position -= speed * glm::cross(direction, up);
if(keys['d'])
position += speed * glm::cross(direction, up);
if(keys['q'])
exit(1);
}
// Set with following callbacks:
// glutMotionFunc(mouse);
// glutPassiveMotionFunc(mouse);
void mouse(int x, int y)
{
if(!warped)
{
float mouseSensitivity = 15.0f;
float horizontal = (width / 2) - x;
float vertical = (height / 2) - y;
horizontal /= mouseSensitivity;
vertical /= mouseSensitivity;
direction = glm::rotate(direction, horizontal, glm::vec3(0.0f, 1.0f, 0.0f));
direction = glm::rotate(direction, vertical, glm::vec3(1.0f, 0.0f, 0.0f));
warped = true;
glutWarpPointer((width / 2), (height / 2));
}
else
warped = false;
}
我不完全确定问题是什么,但当我对FPS凸轮使用LookAt时,我还包括一个前向单位向量。
E.g(从我的一些代码中复制了相关片段)-使用四元数(方向),但我相信矩阵会有相同的结果)
static glm::vec3 defaultUpVector() { return glm::vec3(0, 1, 0); }
static glm::vec3 defaultForwardVector() { return glm::vec3(0, 0, -1); }
pUpVector = defaultUpVector() * orientation;
pLookAt = position + (defaultForwardVector() * orientation);
pView = glm::lookAt(position, pLookAt, pUpVector);
upvector和lookat都是vec3,view是mat4
希望这能有所帮助。
编辑:我注意到你在使用方向,所以我可能会看看你在哪里使用旋转。
这将为没有滚动的FPS凸轮设置quat
pLocalOrientation =
glm::angleAxis(pLocalEularAngles.x, glm::vec3(1, 0, 0)) *
glm::angleAxis(pLocalEularAngles.y, glm::vec3(0, 1, 0));
pLocalOrientation==方向(例如)
如果你决定使用quats。
相关文章:
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- 如何显式调用运算符<<
- 在 X 轴上移动摄像机 glm::lookat()
- 从固定函数迁移到 GLSL OpenGL:我应该如何修改我的视图(lookAt)矩阵和透视矩阵?
- 模板操作员&lt;未打电话
- C / CUDA中的模板方法是3个角括号(&lt;&lt;&lt;)
- GLM :: perspective()和glm :: lookat()一起工作
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 错误:调用"std::vector<:vector<int>>::p ush_back(std::vector<std::__cxx11::basic_string<
- C 建造者Clang STD :: Sill,找不到超载的操作员&lt;
- 为什么STD :: MAP需要操作员&lt;以及我如何写一个
- 为什么“操作员”需要const但不是为“运营商&lt;”
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- C :对矢量进行排序&lt; struct&gt;(结构有2个整数)基于结构的整数之一
- 明确的专业化“ CheckIntmap&lt;&gt;”实例化
- 什么是模板&lt;&gt;inline bla bla
- 左角支架解释为操作员&lt;而不是模板参数