gpt4 book ai didi

c++ - 第一人称相机移动问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:23:17 26 4
gpt4 key购买 nike

我正在使用 GLM 库实现第一人称相机,它为我提供了一些计算透视和“lookAt”矩阵的有用函数。我也在使用 OpenGL,但这不会对这段代码产生影响。

基本上,我所体验的是我可以环顾四周,就像在常规 FPS 中一样,并且可以四处移动。但是运动被限制在三个轴上,如果我旋转相机,我仍然会在相同的方向上移动,就好像我没有旋转它一样......让我来说明(以二维方式,以简化事情)。 enter image description here

在此图像中,您可以看到四个相机位置。标有“一”的为运动前,标有“二”的为运动后。红色三角形表示沿 z 轴直线向前的相机。蓝色三角形表示已旋转以沿 x 轴(向左)向后看的相机。当我按下“向前移动键”时,无论相机方向如何,在这两种情况下相机都会沿 z 轴向前移动。

我想要的是更像 FPS 的行为,向前按会使我朝相机所面对的方向移动。我认为通过传递给 glm::lookAt 的参数,可以实现这一点。显然不是。

我的计算有什么问题吗?

// Calculate the camera's orientation
float angleHori = -mMouseSpeed * Mouse::x; // Note that (0, 0) is the center of the screen
float angleVert = -mMouseSpeed * Mouse::y;

glm::vec3 dir(
cos(angleVert) * sin(angleHori),
sin(angleVert),
cos(angleVert) * cos(angleHori)
);

glm::vec3 right(
sin(angleHori - M_PI / 2.0f),
0.0f,
cos(angleHori - M_PI / 2.0f)
);

glm::vec3 up = glm::cross(right, dir);

// Calculate projection and view matrix
glm::mat4 projMatrix = glm::perspective(mFOV, mViewPortSizeX / (float)mViewPortSizeY, mZNear, mZFar);
glm::mat4 viewMatrix = glm::lookAt(mPosition, mPosition + dir, up);

最佳答案

gluLookAt 有 3 个参数:eye、center 和 up。前两个是位置,而最后一个是 vector 。如果您打算使用此功能,最好只始终如一地维护这三个参数。

来到计算的问题。我看到 position 变量在整个代码中没有变化。所有改变的是观点,即仅中心。正确的做法是先执行 position += dir,这将使相机(位置)沿着 dir 指向的方向移动。现在要更新 centre,第二个参数可以保留原样:position + dir;这将起作用,因为该位置已经更新到新位置,并且从那里我们在 dir 方向上有一个更远的点可以查看。

关于c++ - 第一人称相机移动问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22823609/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com