Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何围绕原点旋转摄影机_C++_Opengl_Camera_Rotation_Eigen - Fatal编程技术网

C++ 如何围绕原点旋转摄影机

C++ 如何围绕原点旋转摄影机,c++,opengl,camera,rotation,eigen,C++,Opengl,Camera,Rotation,Eigen,我正在尝试实现一个围绕原点旋转的相机,在这里我成功地实现了使用gluLookat功能进行偏航的能力。我试图实现俯仰,但在结果上有一些问题(只有当我偏航到某个点然后俯仰时,俯仰才有效) 以下是我迄今为止的尝试: float distance, // radius (from origin) updated by -, + keys pitch, // angle in degrees updated from W, S keys (increments of +- 10)

我正在尝试实现一个围绕原点旋转的相机,在这里我成功地实现了使用gluLookat功能进行偏航的能力。我试图实现俯仰,但在结果上有一些问题(只有当我偏航到某个点然后俯仰时,俯仰才有效)

以下是我迄今为止的尝试:

float distance, // radius (from origin) updated by -, + keys
      pitch,    // angle in degrees updated from W, S keys (increments of +- 10)
      yaw;      // angle in degrees updated from A, D keys (increments of +- 10)


view = lookAt(
        Eigen::Vector3f(distance * sin(toRadians(pitch)) * cos(toRadians(yaw)), distance * sin(toRadians(pitch)) * sin(toRadians(yaw)), distance * cos(toRadians(pitch))),
        Eigen::Vector3f(0.0f, 0.0f, 0.0f),
        Eigen::Vector3f(0.0f, 0.0f, 1.0f));

proj = perspective(toRadians(90.0f), static_cast<float>(width) / height, 1.0f, 10.0f);
float distance,//半径(从原点)由-,+键更新
俯仰,//从W、S键更新的角度(增量+-10)
偏航;//从A、D键更新的角度(增量为+-10)
查看(
本征::向量3f(距离*sin(托拉迪安(俯仰))*cos(托拉迪安(偏航)),距离*sin(托拉迪安(俯仰))*sin(托拉迪安(偏航)),距离*cos(托拉迪安(俯仰)),
本征::矢量3f(0.0f,0.0f,0.0f),
本征向量3f(0.0f,0.0f,1.0f));
项目=透视图(托拉面(90.0f)、静态投影(宽度)/高度、1.0f、10.0f);
我觉得我的问题是上方向向量,但我不确定如何正确更新它(同时我认为它很好,因为我总是希望相机的方向保持不变,我真的只想移动相机的位置)


编辑:我想补充一点,我正在计算此处找到的基于职位的信息:我不确定此处讨论的数学是否可以直接翻译过来,因此如果错误,请纠正我。

这可能是一个解释问题。您的代码看起来是正确的,但是
pitch
可能没有您认为的含义

pitch
0
时,相机位于球体的北极
(0,0,1)
。这有点问题,因为上方向向量和视图方向是平行的,因此无法获得有效的变换。然后,当
pitch
增大时,相机向南移动,直到
pitch=PI
时到达南极。您的代码应该适用于任何不在极点的点。您可能需要交换
sin(螺距)
cos(螺距)
以在
pitch=0时从赤道开始(并支持正螺距和负螺距)

实际上,我更喜欢将这种相机直接建模为矩阵的组合:

view = Tr(0, 0, -distance) * RotX(-pitch) * RotY(-yaw)
Tr
是平移矩阵,
RotX
是绕x轴旋转,
RotY
是绕y轴旋转。这假定y轴向上。如果希望另一个轴向上,可以添加相应的旋转矩阵。例如,如果希望z轴向上,则

view = Tr(0, 0, -distance) * RotX(-pitch) * RotY(-yaw) * RotX(-Pi/2)

这可能是一个解释的问题。您的代码看起来是正确的,但是
pitch
可能没有您认为的含义

pitch
0
时,相机位于球体的北极
(0,0,1)
。这有点问题,因为上方向向量和视图方向是平行的,因此无法获得有效的变换。然后,当
pitch
增大时,相机向南移动,直到
pitch=PI
时到达南极。您的代码应该适用于任何不在极点的点。您可能需要交换
sin(螺距)
cos(螺距)
以在
pitch=0时从赤道开始(并支持正螺距和负螺距)

实际上,我更喜欢将这种相机直接建模为矩阵的组合:

view = Tr(0, 0, -distance) * RotX(-pitch) * RotY(-yaw)
Tr
是平移矩阵,
RotX
是绕x轴旋转,
RotY
是绕y轴旋转。这假定y轴向上。如果希望另一个轴向上,可以添加相应的旋转矩阵。例如,如果希望z轴向上,则

view = Tr(0, 0, -distance) * RotX(-pitch) * RotY(-yaw) * RotX(-Pi/2)

非常感谢你。Idk为什么,但是我对使用gluLookAt非常感兴趣,以至于我甚至都没有想过只做一些简单的矩阵组合。非常感谢。Idk为什么,但我对使用gluLookAt如此着迷,以至于我甚至都没有考虑过只做一些简单的矩阵组合。