news 2026/8/6 15:17:35

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于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的视图缩放事件还没打通,估计又得掉不少头发。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/26 2:21:11

计算机Java毕设实战-基于SpringBoot+vue的高校学生实习综合服务平台设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/7/30 21:44:52

Java毕设项目推荐-基于vue的高校学生实习综合服务平台设计与实现基于SpringBoot+vue的高校学生实习综合服务平台设计与实现【附源码+文档,调试定制服务】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/7/26 15:07:55

后悔!孩子近视后,大部分家长都犯了这样的错

当孩子视力检查单上的度数不断攀升&#xff0c;许多家长陷入焦虑与慌乱&#xff0c;却在应对近视的过程中&#xff0c;不知不觉踏入误区&#xff0c;等到孩子近视度数快速加深时&#xff0c;才追悔莫及。误区一&#xff1a;配镜后便放松警惕&#xff0c;忽视近视进展的防控在发…

作者头像 李华
网站建设 2026/7/31 12:53:45

Java毕设项目推荐-基于SpringBoot和Vue的电影售票管理系统设计与实现基于SpringBoot+Vue的影视购票平台的设计与实现【附源码+文档,调试定制服务】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/7/30 16:11:54

通信原理篇---AM/DSB/SSB/VSB解调

我们用“拆快递包裹”的比喻&#xff0c;来彻底讲清楚这四大经典模拟调制方式的解调方法。解调就是接收端如何从“卡车”&#xff08;已调信号&#xff09;里&#xff0c;完好地取出“礼物”&#xff08;原始信号&#xff09;的过程。核心思想&#xff1a;解调的两大门派所有解…

作者头像 李华
网站建设 2026/7/26 21:05:03

告别堆叠,拥抱统一:金仓数据库“多模一体”开启文档处理新范式

金仓数据库 MongoDB 兼容版通过“多模融合”架构重塑文档数据库新范式&#xff0c;其核心在于将文档模型深度集成于统一的企业级数据库内核中&#xff0c;实现关系型与文档型数据的统一处理与管理。以下从使用示例、性能对比、内核特性、迁移与高可用、实践案例等方面展开说明&…

作者头像 李华