跨产品混淆



我有一个关于教程的问题,我一直在关注OpenGL中相机视角方向的旋转。

虽然我很欣赏潜在的受访者不是本教程的作者,但我认为这可能是大多数中级经验丰富的图形程序员以前遇到过的情况,所以我将就这个主题征求成员的建议。

这是我参考的视频的链接:https://www.youtube.com/watch?v=7oNLw9Bct1k。

本教程的目标是创建一个基本的第一人称摄像机,用户通过移动鼠标来控制它。

以下是处理光标移动的函数(重命名了一些变量/成员以符合我的个人约定):

glm::vec2 Movement { OldCursorPosition - NewCursorPosition };
// camera rotates on y-axis when mouse moved left/right (orientation is { 0.0F, 1.0F, 0.0F }):
MVP.view.direction = glm::rotate(glm::mat4(1.0F), glm::radians(Movement.x) / 2, MVP.view.orientation) 
* glm::vec4(MVP.view.direction, 0.0F);
glm::vec3 RotateAround { glm::cross(MVP.view.direction, MVP.view.orientation) };
/* why is camera rotating around cross product of view direction and view orientation 
rather than just rotating around x-axis when mouse is moved up/down..? : */
MVP.view.direction = glm::rotate(glm::mat4(1.0F), glm::radians(Movement.y) / 2, RotateAround) 
* glm::vec4(MVP.view.direction, 0.0F);
OldCursorPosition = NewCursorPosition;

我难以理解的是为什么甚至需要获得交叉乘积。我自然期望的是,当鼠标从左向右移动时,相机绕y轴旋转,当鼠标上下移动时,相机绕x轴旋转。我只是无法理解为什么交叉乘积甚至相关。

根据我的理解,叉积将返回一个垂直于另外两个向量的向量;在这种情况下,这是视图方向和视图方向的交叉乘积,但是为什么需要这两个向量的交叉乘积呢?相机不应该只是在x轴上旋转以进行向上/向下移动,然后在y轴上旋转以进行左/右移动吗?我在这里错过/忽略了什么?

最后,当我运行程序时,我无法直观地检测到 z 轴上的任何旋转,尽管旋转标量"RotateAround"在每次调用第一个函数之后的函数时都有大于或小于 0 的 z 值(这表明相机应该至少部分在 z 轴上旋转)。

也许这只是由于我缺乏直觉,但如果我换行:

MVP.view.direction = glm::rotate(glm::mat4(1.0F), glm::radians(Movement.y) / 2, RotateAround)
* glm::vec4(MVP.view.direction, 0.0F);

自:

MVP.view.direction = glm::rotate(glm::mat4(1.0F), glm::radians(Movement.y) / 2, glm::vec3(1.0F, 0.0F, 0.0F))
* glm::vec4(MVP.view.direction, 0.0F);

因此,旋转仅在x轴上发生,而不是部分在x轴上和部分在z轴上发生,然后运行程序,我真的无法注意到相机工作原理的太大差异。感觉也许有区别,但我无法阐明这是什么。

这里的问题是参考框架。

而不是在鼠标向上/向下移动时仅围绕 X 轴旋转..?

您认为 x 轴是什么?如果这是全球参考框架的轴或平行的轴,那么是的。如果这是参考系的x轴,部分受相机位置的限制,那么,一般来说答案是否定的。取决于旋转的顺序以及 MVP 是否在移动之间保存。

如果在代码中她的 MVP 通过旋转被修改,这意味着它会被更改。如果相机绕 x 轴旋转 180 度,则 x 轴的方向将变为相反的方向。

如果摄像机绕y轴旋转(我假设地面车辆的ISO方向),方向也会改变。如果相机围绕全局 y 旋转 90 度,然后围绕全局 x 旋转 45 度,结果您将看到视图向侧面倾斜了 45 度。

地面车辆(可能还有经典3D射击游戏的角色)围绕受限参考系的旋转顺序为:围绕y,围绕x,围绕z。对于具有类似飞机控制的飞行器,它大约在z,x周围,y周围。如果我没记错的话,在轨道空间中,z 和 x 是倒置的(z 指向下方)。

您必须执行交叉乘积,因为在多次鼠标移动后,相机现在的方向不同。您要旋转的原始 x 轴与您现在要旋转的 x 轴不同。您必须计算当前直接指向相机侧面的矢量并围绕该矢量旋转。这被认为是"正确"的向量。这是视图和向上矢量的交叉乘积,其中视图是"目标"矢量(向下是相机的 z 轴,您正在看的地方),向上是相机向上的相机 y 轴。这些轴必须随着摄像机的移动而更新。计算视图和向上向量不需要交叉乘积,因为您应该根据沿途的移动对这些向量应用旋转。视图和向上视图应通过旋转更新,但如果要围绕 x 轴(俯仰)旋转,则必须执行交叉乘积。

相关内容

  • 没有找到相关文章

最新更新