c-glm :: look当z <= 0时垂直照相机翻转
作者:互联网
我正在使用FPS风格的相机,使用OpenGL在3D场景中飞行.我正在使用GLM进行数学运算,并使用glm :: mouse移动在x轴和y轴上计算方向向量.我有一个静态的up矢量,因为我可以在水平轴上进行扫射并且不需要任何滚动.
但是,当我朝负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;
}
解决方法:
我并不完全确定问题出在哪里,但是当我将LookAt用于FPS cam时,我还会包含一个正向单位矢量.
例如(从我拥有的某些代码中复制的相关段)-使用四元数(方向),但我确定矩阵将具有相同的结果)
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,视图为mat4
希望这可以帮助.
编辑:我注意到您正在使用方向,所以我可能会看看您使用旋转的位置.
这将为无滚动的FPS凸轮设置准位
pLocalOrientation =
glm::angleAxis(pLocalEularAngles.x, glm::vec3(1, 0, 0)) *
glm::angleAxis(pLocalEularAngles.y, glm::vec3(0, 1, 0));
pLocalOrientation ==方向(例如)
如果您决定使用quats.
标签:glm-math,c,opengl 来源: https://codeday.me/bug/20191009/1878710.html