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

news2024/11/23 16:31:49

文章目录

  • 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 += opengl

INCLUDEPATH += 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\bin

DEFINES += 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 graph
    QuarterWidget * viewer = new QuarterWidget;
    viewer->setSceneGraph(root);

    viewer->viewAll();

    // make the viewer react to input events similar to the good old
    // ExaminerViewer
    viewer->setNavigationModeFile(QUrl("coin:///scxml/navigation/examiner.xml"));
    // viewer->setNavigationModeFile(QUrl("coin:///scxml/navigation/common.xml"));

    viewer->resize(640, 480);
    // Pop up the QuarterWidget
    viewer->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.coloradmin.cn/o/1841118.html

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

相关文章

milvus元数据解析工具milvusmetagui介绍使用

简介 milvusmetagui是一款用来对milvus的元数据进行解析的工具&#xff0c;milvus的元数据存储在etcd上&#xff0c;而且经过了序列化&#xff0c;通过etcd-manager这样的工具来查看是一堆二进制乱码&#xff0c;因此开发了这个工具对value进行反序列化解析。 在这里为了方便交…

arm-linux-strip 指令的作用

指令作用 arm-linux-strip 是一个用于从目标文件&#xff08;如可执行文件或对象文件&#xff09;中移除符号信息的工具。这些符号信息&#xff08;如函数名、变量名等&#xff09;在开发过程中很有用&#xff0c;因为它们允许调试器&#xff08;如 GDB&#xff09;确定内存地址…

安装cuda、cudnn、Pytorch(用cuda和cudnn加速计算)

写在前面 最近几个月都在忙着毕业的事&#xff0c;好一阵子没写代码了。今天准备跑个demo&#xff0c;发现报错 AssertionError: Torch not compiled with CUDA enabled 不知道啥情况&#xff0c;因为之前有cuda环境&#xff0c;能用gpu加速&#xff0c;看这个报错信息应该是P…

Elasticsearch搜索引擎(初级篇)

1.1 初识ElasticSearch | 《ElasticSearch入门到实战》电子书 (chaosopen.cn) 目录 第一章 入门 1.1 ElasticSearch需求背景 1.2 ElasticSearch 和关系型数据库的对比 1.3 基础概念 文档和字段 索引和映射 第二章 索引操作 2.0 Mapping映射属性 2.1 创建索引 DS…

Java宝藏实验资源库(1)文件

一、实验目的 掌握文件、目录管理以及文件操作的基本方法。掌握输入输出流的基本概念和流处理类的基本结构。掌握使用文件流进行文件输入输出的基本方法。 二、实验内容、过程及结果 1.显示指定目录下的每一级文件夹中的.java文件 运行代码如下 &#xff1a; import java.io.…

智慧校园综合管理系统:打造高效智慧的学校管理平台

智慧校园综合管理系统&#xff0c;作为提升教育管理与教学效率的数字化解决方案&#xff0c;它将信息技术深度融合于校园的每一个角落&#xff0c;构建了一个集信息共享、教学资源优化、智能管理、安全保障于一体的综合平台。该系统不仅提供了统一的信息门户&#xff0c;确保学…

MYSQL 四、mysql进阶 3(存储引擎)

mysql中表使用了不同的存储引擎也就决定了我们底层文件系统中文件的相关物理结构。 为了管理方便&#xff0c;人们把连接管理、语法解析、查询优化这些并不涉及真实数据存储的功能划分为 Mysql Server的功能&#xff0c;把真实存取数据的功能划分为存储引擎的功能&…

CVE-2023-50563(sql延时注入)

简介 SEMCMS是一套支持多种语言的外贸网站内容管理系统&#xff08;CMS&#xff09;。SEMCMS v4.8版本存在SQLI&#xff0c;该漏洞源于SEMCMS_Function.php 中的 AID 参数包含 SQL 注入 过程 打开靶场 目录扫描&#xff0c;发现安装install目录&#xff0c;进入&#xff0c;…

ruoyi登录功能源码分析

Ruoyi登录功能源码分析 上一篇文章我们分析了一下若依登录验证码生成的代码&#xff0c;今天我们来分析一下登录功能的代码 1、发送登录请求 前端通过http://localhost/dev-api/login向后端发送登录请求并携带用户的登录表单 在后端中的com.ruoyi.web.controller.system包下…

Artalk-CORS,跨域拦截问题

今天重新部署Artalk之后&#xff0c;遇到了CORS——跨域拦截的问题&#xff0c;卡了好一会记录一下。 起因 重新部署之后&#xff0c;浏览器一直提示CORS&#xff0c;之前在其他项目也遇到过类似的问题&#xff0c;原因就在于跨域问题。

[Linux] 系统的基本架构特点

Linux系统的基本结构 Linux is also a subversion of UNIX,it follows the basic structure of UNIX 内核(kernel)&#xff1a; 操作系统的基本部分 管理与硬件相关的功能&#xff0c;分模块进行 常驻模块&#xff1a;进程控制IO操作文件\磁盘访问 用户不能直接访问内核 外壳(s…

C语言 | Leetcode C语言题解之第167题两数之和II-输入有序数组

题目&#xff1a; 题解&#xff1a; int* twoSum(int* numbers, int numbersSize, int target, int* returnSize) {int* ret (int*)malloc(sizeof(int) * 2);*returnSize 2;int low 0, high numbersSize - 1;while (low < high) {int sum numbers[low] numbers[high]…

Centos 配置安装Mysql

linux安装配置mysql的方法主要有yum安装和配置安装两种&#xff0c;由于yum安装比较简单&#xff0c;但是会将文件分散到不同的目录结构下面&#xff0c;配置起来比较麻烦&#xff0c;这里主要研究一下配置安装mysql的方法 1、环境说明 centos 7.9 mysql 5.7.372、环境检查 …

【Kubernetes】概念学习

Kubernetes介绍 Kubernetes 是谷歌开源的容器集群管理系统 是用于自动部署&#xff0c;扩展和管理 Docker 应用程序的开源系统&#xff0c;简称 K8S。 Kubernetes是一个可以移植、可扩展的开源平台&#xff0c;使用 声明式的配置 并依据配置信息自动地执行容器化应用程序的管…

27 map和set封装

map和set可以采用两套红黑树实现&#xff0c;也可以用同一个红黑树&#xff0c;就需要对前面的结构进行修改 迭代器的好处是可以方便遍历&#xff0c;是数据结构的底层实现与用户透明。如果想要给红黑树增加迭代器&#xff0c;需要考虑以前问题&#xff1a; begin()和end() s…

ChatGPT Plus GPT-4o Claude 3 Opus合租拼车全新方式

无需自己搭建&#xff0c;登录即可用&#xff0c;国内直连访问&#xff0c;聚合多家最强大模型&#xff0c;随意选择使用。立即体验 datapipe.top 支持 OpenAI 最新 GPT-4o &#xff0c;获得快速高质量的对话&#xff0c;保证可用配额。支持多种大模型&#xff0c;GPT-4o &…

课程设计---哈夫曼树的编码与解码(Java详解)

目录 一.设计任务&&要求&#xff1a; 二.方案设计报告&#xff1a; 2.1 哈夫曼树编码&译码的设计原理&#xff1a; 2.3设计目的&#xff1a; 2.3设计的主要过程&#xff1a; 2.4程序方法清单&#xff1a; 三.整体实现源码&#xff1a; 四.运行结果展示&…

昇思25天学习打卡营第1天|基本介绍及快速入门

1.第一天学习总体复盘 1&#xff09;成功注册昇思大模型平台&#xff0c;并成功申请算力&#xff1b; 2)在jupyter环境下学习初学入门/初学教程的内容&#xff1b; 在基本介绍部分&#xff0c;快速撸了一边内容&#xff0c;有了一个基本的了解&#xff08;没理解到位的计划采用…

Part 6.2.3 欧拉函数

欧拉函数φ(x) 表示了小于x的数字中&#xff0c;与x互质的数字个数。 关于欧拉函数的基本知识>欧拉函数的求解< [SDOI2008] 仪仗队 题目描述 作为体育委员&#xff0c;C 君负责这次运动会仪仗队的训练。仪仗队是由学生组成的 N N N \times N NN 的方阵&#xff0c;…

在VScode中创建PHP环境

一、下载PHP Server 和 PHP Debug这两个扩展 二、下载完成之后&#xff0c;在VScode中&#xff0c;打开我们写代码的文件 这里是我事先创建好的一些文件&#xff0c;本次环境搭建只需要创建一个.php后缀的文件即可。 先选中.php文件&#xff0c;再点击文件。 点击首选项&#x…