我有一个关于教程的问题,我一直在跟踪关于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轴上旋转以进行左/右移动...?我在这里想念什么/俯瞰什么?
最后,当我运行程序时,尽管随后在每次调用函数时旋转标量“ 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轴上发生,然后运行程序,我真的没有注意到相机的工作原理有多大差异。感觉可能有所不同,但我无法清楚说明这是什么。
最佳答案
这里的问题是参考框架。
而不是在上/下移动鼠标时仅绕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指向下方)。
关于c++ - 跨产品混淆,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56313743/