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

文章目录

  • 1.安装
    • 1.1.下载coin3d
    • 1.2.下载quarter
    • 1.3.解压并合并
  • 2.在Qt中使用
  • 3.画个网格
  • 4.加载wrl模型
  • 5.画个锤子并旋转
  • 6.加载自定义视口文件

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);}

在这里插入图片描述

5.画个锤子并旋转

在这里插入图片描述

// 绘制锤子{// 创建一个组合节点,作为锤子的根节点SoSeparator* hammerRoot = new SoSeparator;// 创建一个旋转节点,用于绕圆柱体的末端旋转锤子SoRotation* rotation = new SoRotation;rotation->rotation.setValue(SbVec3f(1, 0, 0), M_PI * 0);// 将旋转节点添加到组合节点中hammerRoot->addChild(rotation);QSlider *slider = new QSlider(Qt::Horizontal);slider->resize(300, 20);QObject::connect(slider, &QSlider::valueChanged, [=](){rotation->rotation.setValue(SbVec3f(1, 0, 0), M_PI * ((double)slider->value()) / 100.0); // 绕Z轴旋转45度});slider->show();// 将手柄的位置调整一下,使得旋转中心在手柄末端SoTranslation* handleTranslation = new SoTranslation;handleTranslation->translation.setValue(0, 5, 0);hammerRoot->addChild(handleTranslation);// 创建圆柱体节点,作为锤子的手柄SoCylinder* handle = new SoCylinder;handle->radius = 0.5;handle->height = 10;hammerRoot->addChild(handle);// 将长方体放置在圆柱体的末端SoTranslation* headTranslation = new SoTranslation;headTranslation->translation.setValue(0, 5, 0);hammerRoot->addChild(headTranslation);// 创建长方体节点,作为锤子的头部SoCube* head = new SoCube;head->width = 2;head->height = 2;head->depth = 2;hammerRoot->addChild(head);root->addChild(hammerRoot);}

6.加载自定义视口文件

	QString exePath = QDir::currentPath();QString filePath = QString("file:///%1/examiner.xml").arg(exePath);viewer->setNavigationModeFile(QUrl(filePath));

更加具体的其他操作还得研究研究。


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

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

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

相关文章

视频监控平台:支持交通部行业标准JT/T905协议(即:出租汽车服务管理信息系统)的源代码的函数和功能介绍及分享

目录 一、视频监控平台介绍 &#xff08;一&#xff09;概述 &#xff08;二&#xff09;视频接入能力介绍 &#xff08;三&#xff09;功能介绍 二、JT/T905协议介绍 &#xff08;一&#xff09;概述 &#xff08;二&#xff09;主要内容 1、设备要求 2、业务功能要求…

Pikachu靶场--CRSF

借鉴参考 CSRF跨站请求伪造&#xff08;CTF教程&#xff0c;Web安全渗透入门&#xff09;_bilibili pikachu靶场CSRF之TOKEN绕过_csrf token绕过的原理-CSDN博客 CSRF(get) 发现需要登录 查看提示&#xff0c;获取username和password 选择一个用户进行登录 选择修改个人信息 …

Docker定位具体占用大量存储的容器

监控告警生产环境的服务器磁盘分区使用率大于90%&#xff0c;进入服务器查看Docker 的 overlay2 存储驱动目录中占用很大&#xff0c;很可能是某个容器一直在打印日志&#xff0c;所以需要定位到是哪个容器&#xff0c;然后进行进一步排查。 然后进入到overlay2中查看是哪个目录…

kotlin函数

1、函数定义 // 下边定义了main函数 fun main() {} 2、函数的类型 // foo函数定义 fun foo () {} // 对应无参类型 () -> Unit fun foo (a: Int):String {} // 对应有参类型 (Int) -> String 3、函数的引用 函数的引用类似C语言中的函数指针&#xff0c;可用于函数传…

基于JSP的“塞纳河畔左岸”的咖啡馆管理系统

开头语&#xff1a; 塞纳河畔左岸的咖啡&#xff0c;我手一杯品尝的你美~ 哎哟&#xff0c;不错哦&#xff01;我们今天来介绍一下咖啡馆管理系统&#xff01; 你好呀&#xff0c;我是计算机学长猫哥&#xff01;如果你对咖啡馆管理系统感兴趣或有相关需求&#xff0c;欢迎联…

「iOS」UI——无限轮播图实现与UIPageControl运用

「OC」UI 文章目录 「OC」UI无限轮播图的实现以及UIPageControl的实际运用明确要求简单滚动视图的实现UIPageControl的实现设置NSTimer实现自动移动补充实现 进行无限滚动视图的修改思路实现 完整代码展示 无限轮播图的实现以及UIPageControl的实际运用 明确要求 我们要实现一…

发表在SIGMOD 2024上的高维向量检索/向量数据库/ANNS相关论文

前言 SIGMOD 2024会议最近刚在智利圣地亚哥结束&#xff0c;有关高维向量检索/向量数据库/ANNS的论文主要有5篇&#xff0c;涉及混合查询&#xff08;带属性或范围过滤的向量检索&#xff09;优化、severless向量数据库优化、量化编码优化、磁盘图索引优化。此外&#xff0c;也…

ES全文检索支持繁简和IK分词检索

ES全文检索支持繁简和IK分词检索 1. 前言2. 引入繁简转换插件analysis-stconvert2.1 下载已有作者编译后的包文件2.2 下载源码进行编译2.3 复制解压插件到es安装目录的plugins文件夹下 3. 引入ik分词器插件3.1 已有作者编译后的包文件3.2 只有源代码的版本3.3 安装ik分词插件 4…

示例:推荐一个基于第三方开源控件库DataGridFilter封装的FilterColumnDataGrid,可以像Excel拥有列头筛选器

一、目的&#xff1a;基于第三方开源控件库DataGridFilter封装的FilterColumnDataGrid&#xff0c;可以像Excel拥有列头筛选器&#xff0c;感兴趣的可以去下方链接地址查看开源控件库地址。本控件封装的目的在于将第三方库的皮肤和样式封装到皮肤库中可统一设置样式&#xff0c…

某md5魔改-js还原

我们先把js 扣下来看一下 整体扣一下 ,运行后发现结果一致。 到这里就结束了吗,不不,这次我们要看到它里面具体的变动 <-_-> 先看一下md5的初步加密流程 void MD5Init(MD5_CTX *context) {context->count[0] = 0;context->count[1] = 0;context->state[0]…

linux 简单使用 sftp 和 lftp命令

目录 一. 环境准备二. sftp命令连接到SFTP服务器三. lftp命令3.1 连接FTP和SFTP服务器3.2 将文件从sftp服务器下载到本地指定目录 四. 通过WinSCP命令行从SFTP服务器获取文件到Windows 一. 环境准备 ⏹在安卓手机上下载个MiXplorer&#xff0c;用作SFTP和FTP服务器 官网: htt…

Typora + Hexo 图片路径问题(Typedown)

文章目录 1. 冲突来源2. 解决思路3. 实现1. typora图片路径2. hexo脚本 1. 冲突来源 Hexo上对于图片在md中的引用&#xff0c;使用了post_asset_folder: true配置&#xff0c;来更好的管理图片。 当一篇名为xxx.md的文章引用1.png图片时&#xff0c;默认让1.png保持在xxx文件夹…

cpolar:通过脚本自动更新主机名称和端口号进行内网穿透【免费版】

cpolar 的免费版经常会重新分配 HostName 和 Port&#xff0c;总是手动修改太过麻烦&#xff0c;分享一下自动更新配置文件并进行内网穿透的方法。 文章目录 配置 ssh config编写脚本获取 csrf_token打开登陆界面SafariChrome 设置别名 假设你已经配置好了服务器端的 cpolar。 …

路由

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 客户端&#xff08;例如浏览器&#xff09;把请求发送给 Web 服务器&#xff0c;Web 服务器再把请求发送给 Flask程序实例。程序实例需要知道对每个U…

oracle 外连接(+)和left join用法

案例1&#xff1a; select count(1) FROM TFUNDINFO A, TFUNDTYPE B WHERE A.VC_FUNDCODEB.VC_FUNDCODE() select count(1) FROM TFUNDINFO A, TFUNDTYPE B WHERE A.VC_FUNDCODEB.VC_FUNDCODE SELECT count(1): 这表示查询将返回一个计数&#xff0c;count(1)是一种常见的计数…

【database1】mysql:DDL/DML/DQL,外键约束/多表/子查询,事务/连接池

文章目录 1.mysql安装&#xff1a;存储&#xff1a;集合&#xff08;内存&#xff1a;临时&#xff09;&#xff0c;IO流&#xff08;硬盘&#xff1a;持久化&#xff09;1.1 服务端&#xff1a;双击mysql-installer-community-5.6.22.0.msi1.2 客户端&#xff1a;命令行输入my…

松下课堂 | 什么是EPS?通过马达来辅助转向操作的系统

EPS , 松下 EPS是一种通过马达来减轻和辅助驾驶员在转向操作时所需力量的设备。此外&#xff0c;通过采用EPS&#xff0c;可望提高燃效&#xff0c;降低车辆重量。。。 背景 EPS是一种通过马达来减轻和辅助驾驶员在转向操作时所需力量的设备。此外&#xff0c;通过采用EPS&…

重庆交通大学24计算机考研数据速览,专硕第二年招生,复试线321分!

重庆交通大学&#xff08;Chongqing Jiaotong University&#xff0c;CQJTU&#xff09;&#xff0c;是由重庆市人民政府和中华人民共和国交通运输部共建的一所交通特色、以工为主的多科性大学&#xff0c;入选“中西部高校基础能力建设工程”、“卓越工程师教育培养计划”、国…

【机器学习300问】128、简述什么Word2Vec?

一、一句话说明Word2Vec是什么&#xff1f; Word2Vec是一种常见的词嵌入技术。Word2Vec的目标是将每个词表示为一个向量&#xff0c;使得这些向量能够反映出词语之间的相似性和关联性。 word2vec算法通过预测中心词和上下文词的共现概率来学习词向量&#xff0c;能够捕捉词语之…

TypedDict 解析

TypedDict 解析 文章目录 TypedDict 解析1. 类型安全性2. 可读性3. 可维护性TypedDict 的解决方案没有 TypedDict 会发生什么&#xff1f;使用 TypedDict 的优势 TypedDict 应用场景1. 配置文件解析2. API 数据解析3. 数据库记录表示4. 表单数据验证5. 大型团队协作6. 静态类型…