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

基于Qt5+osg3.4+opencascade7.0开发的三维CAD,目前软件支持主流的3D...

基于Qt5+osg3.4+opencascade7.0开发的三维CAD,目前软件支持主流的3D格式文件(比如igs,stop,stl,obj,3ds等),文件可以另存为obj,stl,osg等,软件整体采用Qt MDI多文档结构,支持模型放大缩小,拖动,旋转,渲染!支持视图切换,已经视觉样式切换(目前实现四种显示样式)!

最近在搞一个三维CAD软件,用到了Qt5、OpenSceneGraph和OpenCASCADE这三个重量级库。这玩意儿能同时打开十几个模型文件不卡顿,全靠Qt的MDI多文档框架撑着。新建子窗口的代码其实特简单:

QMdiSubWindow* subWindow = mdiArea->addSubWindow(new ModelViewer); subWindow->setWindowTitle("Untitled"); connect(subWindow->widget(), &ModelViewer::modelLoaded, [=](const QString& name){ subWindow->setWindowTitle(name); });

这段代码最有意思的是信号槽连接,模型加载完成后自动更新窗口标题。不过实际开发时被OSG的线程同步坑惨了——当多个子窗口同时加载大模型时,得用QMutex锁住OSG的渲染操作,不然分分钟崩溃给你看。

模型操作是三维软件的核心,这里用OSG的事件处理器实现得挺巧妙。旋转功能的核心代码长这样:

void RotateHandler::handleMovement(osgGA::GUIEventAdapter& ea) { if(_dragging) { float dx = ea.getXnormalized() - _lastX; float dy = ea.getYnormalized() - _lastY; _camera->rotate(-dx*2.0, dy*2.0, 0.0); // 这个系数2.0调了三天才找到手感最佳的数值... } }

为了让操作更顺滑,给旋转加了惯性效果。用osg::AnimationPathCallback实现的缓动动画,结果测试时被吐槽像在玩旋转寿司游戏,最后改成了线性插值才正常。

基于Qt5+osg3.4+opencascade7.0开发的三维CAD,目前软件支持主流的3D格式文件(比如igs,stop,stl,obj,3ds等),文件可以另存为obj,stl,osg等,软件整体采用Qt MDI多文档结构,支持模型放大缩小,拖动,旋转,渲染!支持视图切换,已经视觉样式切换(目前实现四种显示样式)!

说到文件格式支持,OpenCASCADE处理STEP文件时有个坑点:必须显式初始化字体库,否则中文注释全变方块。正确姿势是加载前执行:

Handle(Resource_Manager) res = new Resource_Manager(""); res->SetValue("font.name", "SimSun"); res->SetValue("font.file", "/usr/share/fonts/windows/");

渲染样式切换倒是简单粗暴,直接改OSG的状态集。比如线框模式就是:

osg::PolygonMode* pm = new osg::PolygonMode; pm->setMode(osg::PolygonMode::FRONT_AND_BACK, osg::PolygonMode::LINE); _stateset->setAttributeAndModes(pm, osg::StateAttribute::OVERRIDE);

不过实现半透明效果时栽了个跟头——必须按深度排序绘制,否则透明物体渲染顺序错乱。最后在场景根节点加了osg::Depth节点才解决,这招是从老外的论坛里扒出来的偏方。

导出功能最头疼的是STL文件生成,用OpenCASCADE的API导出的二进制STL总有几个面方向错误。后来换成手动遍历三角面片,边导出边检查法线方向才搞定。代码里现在还有这么一段:

TopExp_Explorer exp(shape, TopAbs_FACE); while (exp.More()) { TopoDS_Face face = TopoDS::Face(exp.Current()); // 手动计算法线方向的代码块 if (normal.Z() < 0) normal.Reverse(); // YY出来的修复方案 // ...写入STL }

现在软件能流畅处理10万+三角面片的模型,不过遇到复杂的NURBS曲面还是有点吃力。下一步打算上LevelOfDetail优化,但OSG的LOD节点和Qt的视图缩放事件还没打通,估计又得掉不少头发。

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

相关文章:

  • Java毕设项目:基于SpringBoot+vue的高校学生实习综合服务平台设计与实现(源码+文档,讲解、调试运行,定制等)
  • 直接上干货,这个旋转编码器记米模块我在纺织机械和包装设备上用过不下十次。核心就俩字——抗造!先看PLC程序,再聊触摸屏怎么配
  • AI应用架构师揭秘AI驱动的元宇宙金融的合规性问题
  • 【课程设计/毕业设计】基于SpringBoot+vue的高校学生实习综合服务平台设计与实现【附源码、数据库、万字文档】
  • Java毕设项目推荐-基于vue的高校学生实习综合服务平台设计与实现基于SpringBoot+vue的高校学生实习综合服务平台设计与实现【附源码+文档,调试定制服务】
  • Java计算机毕设之基于Spring Boot的高校应届生实习综合管理系统设计与实现基于SpringBoot+vue的高校学生实习综合服务平台设计与实现(完整前后端代码+说明文档+LW,调试定制等)
  • 搭建 FreeIPA Server 实现统一认证
  • Java组合
  • Java毕设项目推荐-基于Springboot+Vue的在线招聘平台设计与实现基于SpringBoot+Vue的中青年人员招聘平台【附源码+文档,调试定制服务】
  • 全网最全本科生必用TOP8AI论文写作软件测评
  • Java毕设项目推荐-基于SpringBoot和Vue的电影售票管理系统设计与实现基于SpringBoot+Vue的影视购票平台的设计与实现【附源码+文档,调试定制服务】
  • 【毕业设计】基于SpringBoot+vue的高校学生实习综合服务平台设计与实现(源码+文档+远程调试,全bao定制等)
  • 3D打印原理解析
  • 【计算机毕业设计案例】基于SpringBoot+Vue的中青年人员就业招聘平台(程序+文档+讲解+定制)
  • Java毕设选题推荐:基于java的高校学生综合服务平台基于SpringBoot+vue的高校学生实习综合服务平台设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】
  • 【计算机毕业设计案例】基于SpringBoot和Vue电影购票管理系统的设计与实现基于SpringBoot+Vue的影视购票平台的设计与实现(程序+文档+讲解+定制)
  • 昇腾服务器大模型量化方法
  • 【计算机毕业设计案例】基于SpringBoot+vue的山区特色农产品供销服务系统的设计与实现(程序+文档+讲解+定制)
  • 时序数据库选型指南:Apache IoTDB为何成大数据场景优选
  • 后悔!孩子近视后,大部分家长都犯了这样的错
  • 搭建 FreeIPA 服务器
  • Java——异常
  • 【计算机毕业设计案例】基于Java濒危物种公益网站的设计与实现基于SpringBoot濒危物种公益救助交流平台(程序+文档+讲解+定制)
  • 学习笔笔记——ARM 嵌入式系统与内核架构
  • Java计算机毕设之基于SpringBoot+vue的山区农户农产品供销服务系统的设计与实现(完整前后端代码+说明文档+LW,调试定制等)
  • 通信原理篇---AM/DSB/SSB/VSB解调
  • 深入研究 Golang 下 Kafka 的集群搭建与配置
  • Java毕设项目:基于SpringBoot+vue的山区农产品供销服务系统的设计与实现(源码+文档,讲解、调试运行,定制等)
  • 【数学趣题】二次方程的有理数根和共轭二次根式的处理
  • 【课程设计/毕业设计】基于SpringBoot + Vue的影院线上购票管理平台基于SpringBoot+Vue的影视购票平台的设计与实现【附源码、数据库、万字文档】