c++ - 使用 gluLookAt 的 OpenGL 相机旋转

标签 c++ opengl camera

我正在尝试使用 gluLookAt 在 OpenGL 固定功能管道中实现 FPS 风格的相机。鼠标应在任何给定方向上旋转相机。

我存储相机的位置:

float xP;
float yP;
float zP;

我存储视线坐标:

float xL;
float yL;
float zL;

向上 vector 始终设置为 (0,1,0)

我按如下方式使用这个相机:gluLookAt(xP,yP,zP, xL,yL,zL, 0,1,0);

我希望我的相机能够沿偏航和俯仰移动,但不能滚动。

每一帧之后,我都会将鼠标的坐标重新设置到屏幕中间。由此我可以得到 x 和 y 的变化。

如何转换每帧后 x 和 y 的变化,以适本地改变观察坐标(xL、yL、zL)来旋转相机?

最佳答案

从一组 vector 开始:

fwd = (0, 0, -1);
rht = (1, 0, 0);
up = (0, 1, 0);

鉴于你的 xy,取自你提到的鼠标位置,足够小你可以直接将它们分别作为偏航和俯仰旋转。使用偏航值将 rhtfwd vector 旋转到 up vector 上,而不是将 fwd vector 旋转到 >rht 具有间距值。这样你的相机就会有一个新的前进方向(fwd vactor),你可以从中得到一个新的观察点(L = P + fwd例)。

您必须记住限制俯仰旋转,不要让 fwdup vector 在某个点平行。您可以通过每次进行俯仰旋转时重新创建 up vector 来防止这种情况 - 只需在 rhtfwd vector 之间进行叉积。不过这里有个旁注——这样 up 并不总是 (0,1,0)。

关于c++ - 使用 gluLookAt 的 OpenGL 相机旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49352747/

相关文章:

iphone - 相机 View 在 iPhone 上不起作用,但在其他 iPhone 上起作用

C++ 异常二进制兼容性

c++ - 目前交易系统青睐哪些网格分布式计算框架

c++ - 使用指针和函数的 C++ 菜单

c++ - 尝试编译着色器时获取 0 :1(1): error: syntax error, 意外的 $end

java - libGDX 着色器坐标和相机位置

c++ - 使用库中的代码时变量周围的堆栈已损坏

math - glsl中光的半向量是什么?

c - 需要帮助 OpenGL + C

iOS Flutter 应用程序无法启动; 'fatal error: ' 相机/CameraPlugin.h'文件未找到'?