news 2026/5/7 6:34:24

基于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/5/2 19:42:08

【毕业设计】基于SpringBoot+vue的高校学生实习综合服务平台设计与实现(源码+文档+远程调试,全bao定制等)

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

作者头像 李华
网站建设 2026/5/6 10:30:11

深入研究 Golang 下 Kafka 的集群搭建与配置

深入研究 Golang 下 Kafka 的集群搭建与配置 关键词&#xff1a;Kafka集群、Golang、Sarama、消息队列、分布式系统 摘要&#xff1a;本文从“如何用Golang玩转Kafka集群”的视角出发&#xff0c;结合生活场景类比与实战代码&#xff0c;详细讲解Kafka集群的核心概念、搭建步骤…

作者头像 李华
网站建设 2026/4/30 20:01:36

计算机Java毕设实战-基于SpringBoot+vue的贫困山区农产品供销服务系统的设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】

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

作者头像 李华
网站建设 2026/5/3 21:03:15

Java计算机毕设之基于Java Web的宠物领养管理系统基于springboot的宠物领养管理系统(完整前后端代码+说明文档+LW,调试定制等)

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

作者头像 李华
网站建设 2026/4/28 3:05:34

救命神器!9款AI论文软件测评:本科生毕业论文全攻略

救命神器&#xff01;9款AI论文软件测评&#xff1a;本科生毕业论文全攻略 2026年AI论文工具测评&#xff1a;为何你需要这份指南&#xff1f; 随着人工智能技术的不断进步&#xff0c;越来越多的本科生开始借助AI论文软件来提升写作效率、优化内容质量。然而&#xff0c;面对市…

作者头像 李华
网站建设 2026/4/30 14:31:36

激发集体好奇心的团队活动设计

激发集体好奇心的团队活动设计关键词&#xff1a;集体好奇心、团队活动设计、团队协作、创新思维、互动体验摘要&#xff1a;本文聚焦于激发集体好奇心的团队活动设计。通过系统分析背景&#xff0c;阐述核心概念&#xff0c;介绍具体算法原理与操作步骤&#xff0c;构建数学模…

作者头像 李华