[Qt3d] 导出QtEntity为Obj格式(遍历QtEntity)

2023-11-18

原文链接:https://www.yuque.com/softdev/qt/txv1lx

class Qui3DView{
private:
  struct date_struct{
    QPointer<Qt3DWindow> m_windowOn3D = new Qt3DWindow();
    QPointer<QtEntity> m_rootEntity = new QtEntity();
    QPointer<QtMaterial> m_material = new QtMaterial();
  }db;
}

//没有找到相关资料
//Qt3d还是比较复杂的,很难考虑全面
//这里简单使用一个
bool Qui3DView::saveObj(const QString& filePath)
{
    using QAttribute = Qt3DRender::QAttribute;
    
    QFile file(filePath);
    
    if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
    {
        return false;
    }
    
    QTextStream stream(&file);
    int filePntSize = 0; //文件中已经存的点个数
    
    auto comps = db.m_rootEntity->components();
    
    for (QComponent* comp : comps)
    {
        QMesh* mesh = dynamic_cast<QMesh*>(comp);
        uint pntSize = 0; //此mesh的点个数
        
        if (!mesh)
        {
            continue;
        }
        
        QGeometry* geom = mesh->geometry();
        
        auto attris = geom->attributes();
        
        for (QAttribute* attri : attris)
        {
            auto type = attri->attributeType();
            
            switch (type)
            {
                case Qt3DRender::QAttribute::VertexAttribute:
                    {
                        pntSize = attri->count();
                        
                        auto buf = attri->buffer();
                        auto bufferBytes = buf->data();
                        const quint32 stride = bufferBytes.size() / pntSize;
                        const quint32 elementSize = stride / sizeof(float);
                        float* fptr = reinterpret_cast<float*>(bufferBytes.data());
                        
                        for (decltype(pntSize) i = 0; i < pntSize; ++i)
                        {
                            auto x = *fptr;
                            auto y = *(fptr + 1);
                            auto z = *(fptr + 2);
                            
                            stream << "v " << x << " " << y << " " << z << endl;
                            
                            fptr += elementSize;
                        }
                        
                        stream.flush();
                        break;
                    }
                case Qt3DRender::QAttribute::IndexAttribute:
                    {
                        auto buf = attri->buffer();
                        auto indexBytes = buf->data();
                        auto faceSize = indexBytes.size() / sizeof(quint16) / 3;
                        quint16* usptr = reinterpret_cast<quint16*>(indexBytes.data());
                        
                        for (decltype(faceSize) i = 0; i < faceSize; ++i)
                        {
                            auto idx1 = *usptr++;
                            auto idx2 = *usptr++;
                            auto idx3 = *usptr++;
                            
                            stream << "f " << idx1 + filePntSize + 1 << " " << idx2 + filePntSize + 1 << " " << idx3 + filePntSize + 1  << endl;
                            //+1是因为obj里的索引是从1开始的
                        }
                        
                        stream.flush();
                        break;
                    }
                case Qt3DRender::QAttribute::DrawIndirectAttribute:
                    break;
                default:
                    break;
            }
            
        }
        
        filePntSize += pntSize; //偏移量
    }
    
    stream.flush();
    file.close();
    return true;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[Qt3d] 导出QtEntity为Obj格式(遍历QtEntity) 的相关文章

随机推荐

  • C++实现UDP可靠传输(一)

    声明 禁止以任何形式转载本文章 本文章仅供个人学习记录与交流探讨 文章中提供的思路只是一种解决方案 代码也并非完整代码 如有需要 请自行设计协议并完成编程任务 食用本文章之前 推荐阅读 C 实现流式socket聊天程序 目录 UDP协议的基
  • TypeError: super(type, obj): obj must be an instance or subtype of type 该错误的一次处理

    我在写maya类的时候遇到 版本python2 7 folder lib mayaclass py base类 A base 类 ui py 其中A继承base ui py文件中内容 python2 7 import imp from fo
  • Java是如何读取和写入浏览器Cookies的

    首先我们认识下什么是cookies cookie实际上是一个存在你硬盘里的数据 但是这些数据很特殊 只能由web应用提交给浏览器帮助存储 并且我们还能读取浏览器存在本地的cookie web应用一般只在cookie中存储一些用户信息等少量且
  • hive sql之将一行中的时间范围转成多行

    一 生成hive 临时表其中date time 包含其实日期和结束日期 with test1 as select A班 as class 2023 03 01 2023 03 14 as date time 100 99 89 as sco
  • CUBEMX+HAL库实现STM32串口(不定长度)收发

    CUBEMX HAL库实现STM32串口接收 不定长度 并发送 首先新建一个CUBEMX工程 选择你自己开发板的芯片型号 设置时钟和串口 设置时钟为72MHZ 设置串口中断 点击小齿轮生成KEIL5的工程 设置工程名称及存放位置 点击Ope
  • Calendar常用的方法的返回结果 获取指定时间点

    Calendar常用的方法的返回结果 public class CalendarText Calendar calendar null Before public void test calendar Calendar getInstanc
  • 和氟西汀类似的备注_氟西汀备注是什么意思 和氟西汀差不多的备注

    氟西汀 这是一个药物名字 是抗郁抑症的药物 这个药物名字也经常用来当做备注名使用 氟西汀备注是什么意思 和氟西汀差不多的备注有哪些 氟西汀备注是什么意思 将对方备注成氟西汀 表示的是对方是驱散自己心中阴霾的阳光 对方是自己活下去的动力 是快
  • Difference between MBCS and UTF-8 on Windows

    I am reading about the charater set and encodings on Windows I noticed that there are two compiler flags in Visual Studi
  • 基于Python Django的公务员考试信息管理系统

    文章目录 1 简介 2 技术栈 3 功能分析 4 功能具体设计 4 1 软件功能模块设计 4 2数据库设计与实现 4 2 1概念模型设计 4 2 2数据库逻辑结构设计 5系统详细设计 5 1系统功能模块 5 2管理员功能模块 六 源码咨询
  • tcpdump抓包对性能的影响

    一直以来 提到这个话题 大家更多的关注的是tcpdump抓包本身的性能 比如能不能应付几十万的pps 能否在万兆网络上自运自如 我们现在知道 这些问题的答案都是否定的 即 不能 因此你应该去关注netmap高性能抓包方案以及DPDK这样的东
  • Linux上配置Jupyter Notebook远程访问

    本身自己机器上安装了太多东西 有点慢 本来也喜欢所有的东西搬到服务上 所以如果能安装一个远程的Jupyter 服务器 用起来就会很方便 记录下自己的安装步骤 1 安装ipython jupyter pip install ipython p
  • 未来简史--读书语句摘录及感悟

    文章目录 摘录 个人感想 摘录 18世纪末的英国哲学家边沁主张 所谓至善就是 为最多人带来最大的快乐 并认为国家 市场和科学界唯一值得追寻的目标就是提升全球的快乐 政治家应该追求和平 商人应该促进繁荣 学者应该研究自然 但不是为了荣耀什么国
  • 在tomcat中发布项目时,用IP地址不能访问项目而用localhost时可以访问成功

    最近在开发项目中 遇到的一个问题是 在 tomcat中发布一个web项目 但是发布成功后 只能用http localhost 8080 fm访问项目 不能用 http 127 0 0 1 8080 fm访问项目 也不能用本地的IP地址访问
  • Request method ‘POST‘ not supported错误和解决方法

    最近使用VUE js开发中遇到了错误Request method POST not supported 字面意思上看是因为前后端没有统一使用POST方法 但是我在本地仔细检查了前端调用方法和后端处理方法 均没有发现有这个问题 最后我发现 问
  • Memcached Redis Membase性能测试对比分析

    最近在在调研分布式缓存 希望后面能够当前改进项目中缓存的使用 这个测试结果可能出乎大家的意料之外哦 测试结果对比分析 单次读写访问Memcached最快 Redis居中 Membase最慢 单次读写Membase和Redis速度比较接近 M
  • 计算机考试如何截屏,教你6种电脑截屏的小技巧-电脑怎么截图

    电脑截屏是我们经常要用到的技能 不仅操作简单而且非常实用 方法也有很多 下面小编总结了6种截屏技巧 供大家选择 分别是以下6种 1 搜狗输入法 2 浏览器 3 截屏软件 4 QQ ctrl ait A 和微信 alt A 5 附件截图工具
  • win10系统下安装Kafka 的详细步骤

    Win10 系统下要使用Kafka需要经过以下三个步骤 1 安装JDK 需要安装依赖java JDK 2 安装zookeeper 资源协调 分配管理 3 安装Kafka 一 安装 Java SE Development Kit 13 0 1
  • 【原创】ESXI6.7+ikuai爱快搭建软路由(非常详细)

    ESXI安装过程我就直接跳过了 这个网上教程多得是 先介绍一下我的测试环境 一台测试电脑CPU G5400 内存32G DDR4 硬盘960G的铠侠 SATA3接口的SSD 网卡 自带的瑞昱8168网卡 一块另外买的瑞昱8168网卡 两条网
  • Linux常见命令整理

    Linux 常用命令 基本命令掌握 磁盘命令 cd ll 文件夹 文件创建命令 mkdir touch 文件浏览 less 文件全盘查找 find 文件操作 cp mv rm 文件编辑 vi 压缩解压 tar 权限命令 其它命令 最终 安装
  • [Qt3d] 导出QtEntity为Obj格式(遍历QtEntity)

    原文链接 https www yuque com softdev qt txv1lx class Qui3DView private struct date struct QPointer