#include "glwidget.h"
#include "box.h"
int glwidget::mouse_button = -1;
int glwidget::modifier_key = 0;
double glwidget::mouse_pos_x_old = 0;
double glwidget::mouse_pos_y_old = 0;
glwidget::glwidget(QWidget * parent):QOpenGLWidget(parent)
{
keyRespondTimer = new QTimer(this); //构造函数中创建定时器对象,并连接信号槽
connect(keyRespondTimer, &QTimer::timeout, this, &glwidget::slotTimeOut);
setFocusPolicy(Qt::StrongFocus);//否则进入不了键盘事件监听
}
void glwidget::initializeGL()
{
initializeOpenGLFunctions();
glEnable(GL_DEPTH_TEST);
m_render.init();
m_camera.setMatPro(fov);
QStringList renderfiles={
":/obj/data/Cayman_GT.obj",
":/obj/data/bunny_10k.obj",
};
for(QString file : renderfiles){
Box* b1 = new Box();
b1->load(file);
m_render.addBox(b1);
}
m_grid.initize();
m_coordsys.initize();
}
void glwidget::resizeGL(int w, int h)
{
m_camera.setRatio((float)width() / (float)height());
}
void glwidget::paintGL()
{
glClearColor(1.0f, 1.0f, 1.0f, 0.1f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPolygonMode(GL_FRONT, GL_LINE);
QOpenGLExtraFunctions *f = QOpenGLContext::currentContext()->extraFunctions();
QMatrix4x4 mMatrix;
m_camera.setMatPro(fov);
m_grid.paint(f,m_camera.getMatPro(),m_camera.getMatView(),mMatrix);
m_coordsys.paint(f,m_camera.getMatPro(),m_camera.getMatView(),mMatrix);
m_render.render(f,m_camera,mMatrix);
}
void glwidget::mousePressEvent(QMouseEvent *event){
mouse_pos_x_old = event->pos().x();
mouse_pos_y_old = event->pos().y();
mouse_button = event->button();
}
void glwidget::mouseMoveEvent(QMouseEvent *event){
int x = event->pos().x();
int y = event->pos().y();
double w = width(), h = height();
double d_x = (mouse_pos_x_old - x)/w;
double d_y = (mouse_pos_y_old - y)/h;
if (mouse_button == Qt::LeftButton)
{
foreach (int key, keys) {
switch (key) {
case Qt::Key_Control:
m_camera.rotateY(-d_x*180*5);
m_camera.rotateX(-d_y*180*5);
break;
case Qt::Key_Shift:
m_camera.move(5*d_x, 5*d_y, 0);
break;
default:
break;
}
}
}
mouse_pos_x_old = x;
mouse_pos_y_old = y;
this->repaint();
}
void glwidget::mouseReleaseEvent(QMouseEvent *event){ //鼠标左键松开禁止改变相机视角
changeview_ = false;
}
void glwidget::wheelEvent(QWheelEvent *event){
if (event->delta() > 0)
fov-=2.0f;
else
fov+=2.0f;
if (fov<0.50f)
fov = 0.5f;
if (fov>=200.f)
fov = 200.0;
this->repaint();
}
void glwidget::keyReleaseEvent(QKeyEvent *event)
{
if(!event->isAutoRepeat()) //判断如果不是长按时自动触发的释放,就将key值从容器中删除
keys.removeAll(event->key());
if(keys.isEmpty()) //容器空了,关闭定时器
keyRespondTimer->stop();
}
void glwidget::keyPressEvent(QKeyEvent *event)
{
if(!event->isAutoRepeat()) //判断如果不是长按时自动触发的按下,就将key值加入容器
keys.append(event->key());
if(!keyRespondTimer->isActive()) //如果定时器不在运行,就启动一下
keyRespondTimer->start(4);
}
void glwidget::slotTimeOut(){
foreach (int key, keys) {
switch (key) {
case Qt::Key_D:
break;
case Qt::Key_Shift:
modifier_key = Qt::Key_Shift;
break;
default:
break;
}
}
}
void glwidget::chageModel()
{
}
没有合适的资源?快使用搜索试试~ 我知道了~
基于QT使用OpenGL,加载obj模型,进行鼠标交互
共30个文件
cpp:9个
h:9个
obj:3个
55 下载量 26 浏览量
2023-11-09
17:00:32
上传
评论 3
收藏 6.48MB RAR 举报
温馨提示
# 功能分析(需求分析) 1. 基于QT平台,使用OpenGL进行obj文件加载显示; 2. 使用鼠标对场景进行缩放、移动、旋转交互; 本资源有对应的项目介绍,详见同名CSDN博文。《基于QT使用OpenGL,加载obj模型,进行鼠标交互》 本项目资源整体框架简单,清晰,适合初步学习使用。 基于QT的QOpenGLWidget类进行派生,对鼠标事件进行重载,使用OpenGL可编程渲染模式开发,涉及着色器程序的编写,并进行了相机、渲染器、物体类的抽象。还编写了obj文件解析类,同时还可以基于本框架进行stl文件类的编写。资源还包含两个obj测试文件,一个是小兔子bunny.obj,一个是跑车Cayman_GT.obj。 使用开发环境:qt5.15.2, MSVC2019_64bit;使用mingw也可以运行
资源推荐
资源详情
资源评论
收起资源包目录
vis3d.rar (30个子文件)
mainwindow.h 380B
qrc.qrc 309B
src
grid.cpp 2KB
coorsystem.h 449B
genericRender.h 889B
coorsystem.cpp 2KB
camera.h 689B
shader
fsrc.frag 1KB
vsrc.vert 2KB
coordinate.frag 321B
coordinate.vert 2KB
genericRender.cpp 1KB
utils
objLoader.h 606B
Common.h 131B
ObjLoader.cpp 3KB
glwidget.cpp 4KB
camera.cpp 1KB
box.h 931B
grid.h 602B
box.cpp 2KB
glwidget.h 2KB
data
Cayman_GT.obj 31.7MB
Cube.x_t 7KB
bunny_10k.obj 1.39MB
Cube.obj 3KB
Cube.mtl 140B
mainwindow.cpp 312B
main.cpp 172B
mainwindow.ui 2KB
vis3d.pro 957B
共 30 条
- 1
资源评论
这个就很牛啊
- 粉丝: 91
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功