在Qt中实现OpenGL FPS相机,QOpenGLWidget是否有类似glutPassiveMotionFunc的功能?
我之前在做Qt OpenGL FPS相机的时候也碰到过一模一样的问题,刚好能给你一些实用的解决方案,不用纠结GLUT那套过时的东西~
QOpenGLWidget 的被动鼠标移动监听:完全不需要GLUT!
Qt本身就支持被动鼠标移动监听,你只需要开启鼠标追踪功能就行,不用依赖GLUT库。默认情况下mouseMoveEvent只有在鼠标按下时才会触发,但只要调用setMouseTracking(true),就能让鼠标在窗口内移动时(哪怕没按下按键)也触发mouseMoveEvent。
具体操作很简单:
- 可以在你的QOpenGLWidget子类的构造函数里添加:
YourOpenGLWidget::YourOpenGLWidget(QWidget *parent) : QOpenGLWidget(parent) { setMouseTracking(true); // 开启鼠标追踪 }
- 或者在Widget初始化的时候(比如
main.cpp里创建实例后)设置:
auto widget = new YourOpenGLWidget; widget->setMouseTracking(true); widget->show();
这样重写的mouseMoveEvent就会在鼠标被动移动时被调用,完全替代glutPassiveMotionFunc的功能。
更省心的替代方案:Qt3D模块
如果觉得自己写OpenGL底层的相机逻辑太麻烦,而且想要文档更完善的工具,推荐试试Qt官方的Qt3D模块。它封装了3D渲染的常用功能,包括现成的FPS相机控制器(QOrbitCameraController或者自定义第一人称控制器),不需要自己手动处理鼠标移动和矩阵变换,文档也比零散的OpenGL教程规范得多。
你只需要在项目的.pro文件里添加:
QT += 3dcore 3drender 3dinput 3dextras
然后就能轻松创建第一人称相机,比如用QFirstPersonCameraController(Qt 5.10+版本支持),直接绑定到你的3D场景里就行,省掉很多底层代码。
如果你确实需要安装GLUT(不推荐,但还是给你规范步骤)
虽然完全没必要,但如果因为某些原因一定要用GLUT,给你分平台的安装教程:
Windows系统(VS环境)
- 下载freeglut(GLUT的开源替代)压缩包,解压后得到
include、lib、bin三个文件夹 - 把
include里的GL文件夹复制到你的VS安装目录下的include文件夹(比如C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\include) - 把
lib里的freeglut.lib和freeglut_static.lib复制到VS对应架构的lib文件夹(比如x64架构对应C:\...\lib\x64) - 把
bin里的freeglut.dll复制到C:\Windows\System32(64位系统)或C:\Windows\SysWOW64(32位系统),或者直接放到项目编译输出目录
Linux系统(Ubuntu/Debian)
直接用包管理器安装:
sudo apt-get update sudo apt-get install freeglut3-dev
编译时链接参数加上-lglut -lGL -lGLU即可。
macOS系统
用Homebrew安装:
brew install freeglut
编译时链接参数加上-framework OpenGL -lglut即可。
内容的提问来源于stack exchange,提问作者user10745516

