Qt利用Coin3D(OpenInventor)进行3d绘图

文章目录

  • 1.安装
    • 1.1.下载coin3d
    • 1.2.下载quarter
    • 1.3.解压并合并
  • 2.在Qt中使用
  • 3.画个网格
  • 4.加载wrl模型

1.安装

1.1.下载coin3d

首先,到官网下载[coin3d/coin]
我是Qt5.15.2+vs2019的,因此我选择这个coin-4.0.2-msvc17-x64.zip
在这里插入图片描述

1.2.下载quarter

到官网下载Coin3D在Qt中的封装库【quarter】
我是Qt5.15.2+vs2019的,因此我选择这个quarter-1.2.1-Qt5.15-msvc17-x64.zip
在这里插入图片描述

1.3.解压并合并

将这两个压缩包放在在同一个文件夹中,先解压coin-4.0.2-msvc17-x64.zip,然后再解压
quarter-1.2.1-Qt5.15-msvc17-x64.zip,此时,我们利用Qt编程所需要的东西全在Coin3D这个文件夹里面了:
在这里插入图片描述

2.在Qt中使用

在Qt工程的pro文件中添加以下语句,路径要根据你的实际路径进行更改

QT += openglINCLUDEPATH += C:\Users\Administrator\Desktop\plc\Qt\Coin3D\include
LIBS += -LC:\Users\Administrator\Desktop\plc\Qt\Coin3D\lib \
-lQuarter1
LIBS += -LC:\Users\Administrator\Desktop\plc\Qt\Coin3D\binDEFINES += QUARTER_DLL

程序的话,可以参考以下这个【a small, completely stand-alone usage example】

3.画个网格

参考这篇文章【OpenInventor实现场景索引线集管理之SoIndexedLineSet】,弄了个绘制网格的例子:
在这里插入图片描述

#include "mainwindow.h"#include <QApplication>
#include <QDebug>#include <Inventor/nodes/SoBaseColor.h>
#include <Inventor/nodes/SoCone.h>
#include <Inventor/nodes/SoSeparator.h>
#include <Inventor/VRMLnodes/SoVRMLGroup.h>#include <Inventor/nodes/SoPointSet.h>
#include <Inventor/nodes/SoCoordinate3.h>
#include <Inventor/nodes/SoIndexedLineSet.h>
#include <Inventor/nodes/SoLineSet.h>#include <Inventor/nodes/SoMaterial.h>
#include <Inventor/nodes/SoMaterialBinding.h>
#include <Inventor/nodes/SoTransform.h>
#include <Inventor/nodes/SoMatrixTransform.h>#include <Quarter/Quarter.h>
#include <Quarter/QuarterWidget.h>#include <QtMath>using namespace SIM::Coin3D::Quarter;int main(int argc, char *argv[])
{QApplication a(argc, argv);// MainWindow w;// w.show();// Initializes Quarter library (and implicitly also the Coin and Qt// libraries).Quarter::init();// Make a dead simple scene graph by using the Coin library, only// containing a single yellow cone under the scene graph root.SoSeparator * root = new SoSeparator;root->ref();// 绘制网格{// 根节点SoSeparator * lineRoot = new SoSeparator();lineRoot->ref();// 线段集SoIndexedLineSet *iLineSet = new SoIndexedLineSet();int gridRows = 10;int gridCols = 10;// 存放点数据的结构SbVec3f *points = new SbVec3f[2 * (gridCols + gridCols)];// 填充横线for(int i = 0; i < gridRows; i++){points[i * 2].setValue(0, i, 0);points[i * 2 + 1].setValue(gridCols - 1, i, 0);}// 填充竖线for(int i = 0; i < gridCols; i++){points[gridRows * 2 + i * 2].setValue(i, 0, 0);points[gridRows * 2 + i * 2 + 1].setValue(i, gridRows - 1, 0);}// 坐标系SoCoordinate3 *coord = new SoCoordinate3();// 将各个点填充至坐标系中coord->point.setValues(0, 2 * (gridCols + gridCols), points);// 保存线的索引int32_t *nLineSets = new int32_t[3 * (gridCols + gridRows)];// 每条线需要三个索引:起点、终点、结束符for(int i = 0; i < (gridCols + gridRows); i++){nLineSets[3 * i]     = i * 2;nLineSets[3 * i + 1] = i * 2 + 1;// SO_END_LINE_INDEX的值是-1,-1代表一条索引线结束!!!nLineSets[3 * i + 2] = SO_END_LINE_INDEX;}iLineSet->coordIndex.setValues(0, 3 * (gridCols + gridRows), nLineSets);// 默认颜色为绿色,被选中的红色显示SbColor *color = new SbColor[2];color[0].setValue(1,0,0);color[1].setValue(0,1,0);SoMaterial *mat = new SoMaterial();mat->diffuseColor.setValues(0, 2, color);SoMaterialBinding *mb = new SoMaterialBinding;// 索引绑定材质!!!mb->value = SoMaterialBinding::PER_PART_INDEXED;// mb->value = SoMaterialBinding::PER_PART;// mb->value = SoMaterialBinding::OVERALL;// 设置线段的颜色for(int i = 0; i < (gridCols + gridRows); i++){// 这里的索引.第一个参数指的是第条线,第二个参数指的是mat->diffuseColor中的第几种材质iLineSet->materialIndex.set1Value(i, 0);  // 第i个线段的颜色/}iLineSet->materialIndex.set1Value(0, 1);  // 第i个线段的颜色/// 整体变换SbMatrix sbMatrix, tmpMat, tmpMat1;sbMatrix.makeIdentity(); // 变成单位矩阵// 平移、旋转、缩放需要单独进行,然后相乘tmpMat.makeIdentity();// tmpMat.setTranslate(SbVec3f(1, 0, 0));tmpMat.setRotate(SbRotation(SbVec3f(1, 0, 0),  qDegreesToRadians(90.0)));tmpMat1.makeIdentity();tmpMat1.setScale(0.1);sbMatrix = tmpMat1 * tmpMat; // 越在右边的矩阵,逻辑上是越先被使用的SoMatrixTransform *matrix = new SoMatrixTransform;// matrix->matrix.setValue(sbMatrix);lineRoot->addChild(matrix);lineRoot->addChild(coord);      // 组成线的点lineRoot->addChild(mat);        // 线的材质lineRoot->addChild(mb);         // 绑定材质lineRoot->addChild(iLineSet);   // 线root->addChild(lineRoot);}// Create a QuarterWidget for displaying a Coin scene graphQuarterWidget * viewer = new QuarterWidget;viewer->setSceneGraph(root);viewer->viewAll();// make the viewer react to input events similar to the good old// ExaminerViewerviewer->setNavigationModeFile(QUrl("coin:///scxml/navigation/examiner.xml"));// viewer->setNavigationModeFile(QUrl("coin:///scxml/navigation/common.xml"));viewer->resize(640, 480);// Pop up the QuarterWidgetviewer->show();// return a.exec();a.exec();// Clean up resources.root->unref();delete viewer;Quarter::clean();return a.exec();
}

4.加载wrl模型

参考【FengJungle /QtCoin3D_Robot 】,可以加载自己的wrl模型

    // 加载模型SoVRMLGroup *model = nullptr;{SoInput * myInput = new SoInput;if(myInput->openFile("lr4-r560.wrl")){model = SoDB::readAllVRML(myInput);myInput->closeFile();delete myInput;}else{myInput->closeFile();delete myInput;}}if(model != nullptr){qDebug() << "num of children:" << model->getNumChildren();root->addChild(model);}

在这里插入图片描述更加具体的其他操作还得研究研究。


参考:
【coin3d】
【FengJungle /QtCoin3D_Robot 】
【OpenInventor实现场景索引线集管理之SoIndexedLineSet】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/30210.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【信息资源组织与管理】【开卷考】如何准备 期末考试复习必备

索引篇 先去xhs找了开卷考有什么准备技巧&#xff0c;来自Prozac ❗️首先&#xff0c;适用于考试范围为课本内容或者课堂内容&#xff0c;如果有那种拓展题&#xff0c;脱离课本的&#xff0c;那我就没办法了。 ✅一定要熟悉熟悉熟悉课本 1. 第一遍略看课本&#xff0c;可以不…

万界星空科技QMS质量管理介绍

产品的生产质量是企业发展之根本&#xff0c;对所有企业来说&#xff0c;建立完善质量控制体系&#xff0c;对企业生产经营以及发展竞争具有至关重要的影响&#xff0c;可以说是企业质量保证的防火墙。QMS质量管理系统对任何一家企业都具有重要意义&#xff0c;可帮助企业提高生…

shell脚本监控docker容器和supervisor 运行情况

1.ASR服务 需求: 在ASR服务器中 docker 以下操作中 忽略容器名字叫 nls-cloud-mongodb 的容器 在ASR服务器中 docker ps 查看正在运行的容器 docker stats -a --no-stream 可以监控容器所占资源 确认是否有pid且不等于0 docker inspect -f “{{.RestartCount}}” 容器名称 可…

为何Proteus用户争相拥抱SmartEDA?揭秘背后的强大吸引力!

在电路设计与仿真领域&#xff0c;Proteus一度以其稳定性能和丰富功能赢得了众多用户的青睐。然而&#xff0c;近年来&#xff0c;越来越多的Proteus用户开始转向SmartEDA&#xff0c;这一新兴电路仿真软件正迅速崭露头角&#xff0c;成为行业内的翘楚。那么&#xff0c;究竟是…

【Java】已解决java.util.ConcurrentModificationException异常

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决java.util.ConcurrentModificationException异常 一、分析问题背景 java.util.ConcurrentModificationException异常是Java集合框架中常见的一个运行时异常。这个异常通常会…

llama-factory微调工具使用入门

一、定义 环境配置案例&#xff1a; https://zhuanlan.zhihu.com/p/695287607chatglm3 案例多卡训练deepspeedllama factory 案例Qwen1.5报错 二、实现 环境配置 git clone https://github.com/hiyouga/LLaMA-Factory.git conda create -n llama_factory python3.10 conda …

适合企业的TTS文本转语音接口:微软TTS最新模型,发布9种更真实的AI语音

微软对Azure Al语音服务的Personal Voice功能进行了升级&#xff0c;引入了新的零样本学习(zero-shot)的文本到语音(TTS)模型。与初始模型相比&#xff0c;这些新模型提高了合成语音的自然度&#xff0c;并更好地模仿了提示语音中的语音特征。 微软提供了超过400种神经语音&am…

视频监控管理平台智能边缘分析一体机安防监控平台离岗检测算法

在工业自动化和智能制造的背景下&#xff0c;智能边缘分析一体机的应用日益广泛。这些设备通常在关键岗位上执行监控、分析和数据处理任务。然而&#xff0c;设备的稳定运行至关重要&#xff0c;一旦发生故障或离岗&#xff0c;可能会导致生产线停滞甚至安全事故。因此&#xf…

llama-factory微调chatglm3

一、定义 案例/多卡 二、实现 案例 1. 下载chatglm3-6b-32k模型 2. 配置数据集微调指令 CUDA_VISIBLE_DEVICES0,1 llamafactory-cli train \--stage sft \--do_train True \--model_name_or_path /home/chatglm3-6b-32k \--finetuning_type lora \--template chatglm3 \--d…

LeetCode 算法:回文链表 c++

原题链接&#x1f517;&#xff1a;回文链表 难度&#xff1a;简单⭐️ 题目 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为回文链表。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输入&#xff1a;head…

1:25万基础电子地图(重庆版)

我们为你分享过四川版、江西版和贵州版的1:25万基础电子地图&#xff0c;现在再为你分享重庆版的电子地图。 现在我们再为你分享重庆的1&#xff1a;25万基础电子地图&#xff0c;你可以在文末查看该数据的领取方法。 基础电子地图重庆版 下载后可以看到该数据由14个压缩包所…

Windows11电脑在使用GPU的时候有时候会卡顿

原来我一直以为是电脑的某些组件可能坏掉了 但是后来发现通过更新gpu的驱动可以让它变好&#xff1a; NVIDIA GeForce 驱动程序 - N 卡驱动 | NVIDIA 下载好以后&#xff0c;然后安装最新的驱动就可以了&#xff0c;感觉可能是因为win11和某些需要显卡的驱动不支持的原因吧 …

Flash基础知识

1、Flash发展历程 存储器通常分为两类型&#xff0c;即随机存取的RAM&#xff08;内存&#xff09;与只读的ROM&#xff08;外存&#xff09;。 RAM&#xff0c;也称随机存取存储器&#xff0c;数据可以被读取和修改。它主要用于存储正在运行的程序和临时数据&#xff0c;是计…

CarService的构成和初始化分析

以下分析&#xff0c;基于安卓13的AAOS。 代码构成 packages/services/Car CarService相关代码&#xff0c;主要是在这个目录下 frameworks/opt/car/services 主要是carservice启动相关。 其它目录&#xff1a;audio_policy_configuration.xml和car_audio_configuration.xm…

人生的乐趣,在于对真知的追求

子曰&#xff1a;朝闻道&#xff0c;夕死可矣&#xff01; 孔子说&#xff1a;早上听到关于世界的真理&#xff0c;哪怕晚上就die了都可以。 这句话很有力量而经常被人引用&#xff0c;表达出我们如何看待沉重的肉身和精神世界。 我们的生活目的&#xff1a;道。 —— 要了解…

探究 IP 地址被网站封禁的原因

在我们登录各种网站、APP浏览时&#xff0c;可能会遇到 IP 地址被某些网站封禁的情况。很多人奇怪这是为什么呢&#xff1f; 首先&#xff0c;违反网站的使用规则是比较常见的原因之一。比如&#xff0c;频繁发送垃圾邮件、恶意评论、进行网络攻击或试图破解网站的安全机制等不…

数据链路层知识分享【计算机网络】【以太网帧 | MTU的影响 | ARP技术】

博客主页&#xff1a;花果山~程序猿-CSDN博客 文章分栏&#xff1a;Linux_花果山~程序猿的博客-CSDN博客 关注我一起学习&#xff0c;一起进步&#xff0c;一起探索编程的无限可能吧&#xff01;让我们一起努力&#xff0c;一起成长&#xff01; 目录 前文 一&#xff0c; 以…

【操作系统】操作系统课后作业-聊天程序

无名管道与有名管道的区别 无名管道&#xff1a; 它是半双工的&#xff0c;具有固定的读端和写端。 只能用于具有亲缘关系的进程之间的通信&#xff08;也是父子进程或者兄弟进程之间&#xff09;。 不是普通的文件&#xff0c;不属于其他任何文件系统&#xff0c;并且只存…

Electron+Vue开源软件:洛雪音乐助手V2.8畅享海量免费歌曲

洛雪音乐助手是一款功能全面且完全免费的开源音乐软件&#xff0c;支持在Windows、Android和iOS平台上使用。 平台支持&#xff1a; 桌面版&#xff1a;采用Electron Vue技术栈开发&#xff0c;支持Windows 7及以上版本、Mac OS和Linux&#xff0c;具有广泛的用户群体覆盖。 …

深信服终端安全管理系统EDR版本升级过程

EDR当前版本为3.7.12&#xff0c;具体参考版本详情参数。需要升级到6.0.2R1版本&#xff0c;该版本更改了产品名称&#xff0c;叫做“统一端点安全管理系统aES” 当前版本详情 版本基础信息 软件版本&#xff1a;3.7.12.3829 病毒库版本&#xff1a;20240618174426 漏洞规则库&…