跨产品混淆

时间:2019-05-26 13:01:54

标签: c++ opengl rotation glm-math cross-product

我对我一直关注的有关OpenGL中摄像机视图方向旋转的教程有疑问。

虽然我知道潜在的受访者不是本教程的作者,但我认为这很可能是大多数中级经验的图形程序员遇到过的情况,因此,我将就此主题寻求成员的建议。 / p>

这里是我引用的视频的链接: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轴上旋转以进行左/右移动...?我在这里想念什么/忽略了什么?

最后,当我运行程序时,尽管旋转标量'RotateAround'的每次调用Z值均大于或小于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轴上,然后运行该程序,因此我真的没有注意到相机。感觉好像有所不同,但我无法清楚说明这是什么。

2 个答案:

答案 0 :(得分:1)

这里的问题是参考框架。

  

而不是在上/下移动鼠标时仅绕x轴旋转。.

您认为x轴是什么?如果那是全局参照系的轴或与之平行的轴,则可以。如果那是参考系的x轴,部分地受到相机位置的限制,那么通常的答案是“否”。取决于旋转顺序以及运动之间是否保存了MVP。

提供了在代码中她的MVP可以通过旋转修改的方法,这意味着它已被更改。如果Camera将绕x轴旋转180度,则x轴的方向将变为相反的方向。

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

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

答案 1 :(得分:0)

您必须做叉积,因为在多次移动鼠标之后,摄像头的方向现在有所不同。您要旋转的原始x轴与您现在要旋转的x轴不同。您必须计算出当前指向摄像机侧面的向量,然后围绕该向量旋转。这被视为“正确”向量。这是视图和上向量的叉积,其中视图是“目标”向量(在您要看的相机的z轴下方),而向上则是从相机的y轴上垂直向上。这些轴必须随着摄像机的移动而更新。计算视图向量和向上向量不需要叉积,因为您应根据沿途的运动对其应用旋转。视图和向上视图应通过旋转进行更新,但是如果要绕x轴(螺距)旋转,则必须进行叉积。