当前位置: 首页 > news >正文

Qt加载OBJ或STL模型文件,支持鼠标移动、缩放、旋转Demo

Qt加载模型文件obj或者stl实例,支持鼠标移动缩放旋转demo

最近在捣鼓Qt的3D可视化功能,发现用Qt搞个模型查看器比想象中简单。咱们先整点实际的——做个能加载obj/stl模型,支持鼠标拖拽旋转、平移、缩放的demo。废话不多说,直接撸代码!

先来初始化3D场景核心组件:

Qt3DExtras::Qt3DWindow *view = new Qt3DExtras::Qt3DWindow; Qt3DCore::QEntity *rootEntity = new Qt3DCore::QEntity; // 相机配置 Qt3DRender::QCamera *camera = view->camera(); camera->lens()->setPerspectiveProjection(45.0f, 16.0f/9.0f, 0.1f, 1000.0f); camera->setPosition(QVector3D(0, 0, 40));

这里Qt3DWindow相当于3D画布,QEntity是场景中的实体。重点看模型加载部分:

Qt3DCore::QEntity *modelEntity = new Qt3DCore::QEntity(rootEntity); // 加载模型文件 Qt3DRender::QMesh *mesh = new Qt3DRender::QMesh; mesh->setSource(QUrl::fromLocalFile("teapot.obj")); // 换成你的模型路径 // 材质配置 Qt3DExtras::QPhongMaterial *material = new Qt3DExtras::QPhongMaterial; material->setDiffuse(QColor(QRgb(0xCC8833))); // 坐标变换组件 Qt3DCore::QTransform *transform = new Qt3DCore::QTransform; transform->setScale(1.0f); transform->setRotation(QQuaternion::fromAxisAndAngle(QVector3D(0, 1, 0), 0.0f)); modelEntity->addComponent(mesh); modelEntity->addComponent(material); modelEntity->addComponent(transform);

QMesh组件支持obj/stl/fbx等多种格式,实测发现某些stl文件需要预处理单位制。建议模型放在项目根目录,避免路径问题。

Qt加载模型文件obj或者stl实例,支持鼠标移动缩放旋转demo

接下来是重头戏——鼠标交互控制。咱们直接重写事件处理:

class Viewport : public Qt3DExtras::Qt3DWindow { protected: void mousePressEvent(QMouseEvent *event) override { m_lastPos = event->pos(); } void mouseMoveEvent(QMouseEvent *event) override { int dx = event->x() - m_lastPos.x(); int dy = event->y() - m_lastPos.y(); if (event->buttons() & Qt::LeftButton) { // 左键旋转 transform->setRotation(transform->rotation() * QQuaternion::fromAxisAndAngle(QVector3D(0, 1, 0), dx*0.5f) * QQuaternion::fromAxisAndAngle(QVector3D(1, 0, 0), dy*0.5f)); } else if (event->buttons() & Qt::RightButton) { // 右键平移 transform->setTranslation(transform->translation() + QVector3D(dx*0.05f, -dy*0.05f, 0)); } m_lastPos = event->pos(); } void wheelEvent(QWheelEvent *event) override { // 滚轮缩放 float scaleFactor = 1.0 + event->angleDelta().y() * 0.001f; transform->setScale(transform->scale() * scaleFactor); } };

这里用四元数实现累积旋转,避免万向节死锁。平移时注意坐标系方向,Y轴方向需要取反。缩放采用指数方式更符合直觉。

最后组合所有部件:

int main(int argc, char *argv[]) { QApplication app(argc, argv); Viewport view; view.setRootEntity(rootEntity); view.show(); return app.exec(); }

运行效果:茶壶模型能跟着鼠标左键旋转起舞,右键拖动平移,滚轮缩放流畅。实测加载20MB的机械零件stl文件,帧率稳定在60fps。

遇到坑点提醒:

  1. 模型太大时记得调整相机near/far参数
  2. stl文件需要确认是二进制还是ASCII格式
  3. 缩放时建议设置上下限防止模型消失
  4. 复杂模型建议开启背面剔除:
Qt3DRender::QRenderSettings *renderSettings = new Qt3DRender::QRenderSettings; Qt3DRender::QDepthTest *depthTest = new Qt3DRender::QDepthTest; depthTest->setDepthFunction(Qt3DRender::QDepthTest::Less); renderSettings->setActiveFrameGraph(new Qt3DRender::QForwardRenderer);

完整代码已放在Github(假装有链接),下次试试给模型加个炫酷的PBR材质!

http://www.jsqmd.com/news/552090/

相关文章:

  • 超实用!AI写教材工具大推荐,轻松搞定教材编写且低查重
  • 2026年深圳高端婚恋机构参考指南:靠谱的深圳爱纪元、爱纪元专业团队、爱纪元真实可靠、海量优质会员、爱纪元精准匹配以科学匹配助力单身人士脱单 - 海棠依旧大
  • 2026年洗鞋加盟及洗护服务优质机构参考:秦皇岛萌马科技、萌马洗护、萌马洗鞋加盟十大品牌,以规范服务助力行业发展 - 海棠依旧大
  • C语言指针变量深度解析与应用实践
  • 别再死记硬背公式了!用Python+SymPy手把手推导平面2R机器人动力学方程
  • N_m3u8DL-RE技术指南:从问题解决到专业应用
  • 系统性能优化:GPU资源分配与中断响应优化全指南
  • 再测试生成几个CDL Practice Test 主题和风格的网站(第二批) - AI
  • 2026年洗鞋加盟公司推荐排行榜:萌马洗护、洗鞋店加盟、专业洗护加盟解决方案 - 海棠依旧大
  • 嵌入式硬件设计:PCB布局与接口技术实践
  • 嵌入式技术学习路径与核心技能解析
  • 终极高效OpenCore EFI自动化配置工具完整指南
  • LVGL实战:用外部按键(Keypad)和旋转编码器(Encoder)在无触摸屏设备上实现流畅UI交互
  • LOLIN_EPD电子墨水屏驱动库详解与低功耗工程实践
  • 用Python玩转Iris数据集:从数据加载到可视化分析的完整指南
  • 【Spring Boot】SpringBoot自动装配-Import
  • 2026年优秀教材图书出版机构推荐指南:幼儿图书出版、教辅图书出版、法律图书出版、科技类图书出版、经济学理论专著出版选择指南 - 优质品牌商家
  • 毫米波PA输出匹配变压器实战:从理想模型到EM仿真的调参避坑指南(以55nm工艺为例)
  • 从‘拍糊了’到‘秒对焦’:深入拆解手机AF(自动对焦)与VCM马达工作原理
  • 从AffectNet到FERPlus:三大表情识别数据集的结构解析与实战调优
  • YOLO11 vs YOLOv8 实测对比:在自定义数据集上,精度和速度到底提升了多少?
  • AI检测率太高论文过不了?这4个降AIGC网站2026年别再错过了
  • 2026年专业粉末自动包装机优质厂家推荐指南:自动称重包装一体机、自动称重配料系统、自动配料生产线、超细粉自动包装机选择指南 - 优质品牌商家
  • 如何用SLAM技术构建机器人自主定位与环境建图系统?
  • AI辅助开发:利用快马多模型能力为红目香薰添加智能香味推荐算法
  • Python量化工具在边缘场景失效的5个真实故障案例,第3个让某头部安防厂商延迟交付2个月
  • 顶刊复现:基于MAACO的多无人载具路径规划
  • Node.js里跑网站JS总报错?手把手教你用‘补环境’搞定window、navigator缺失问题
  • 2026年兰州家政保洁服务商参考:兰州小科家政、高空清洗、外墙清洗、蜘蛛人清洗、幕墙清洗、高空维修、高空保洁、住家保姆、半日保姆以规范服务适配家庭与商业多元需求 - 海棠依旧大
  • 效率革命:OpCore-Simplify的智能化黑苹果配置方法指南