Qt3D绘制旋转立方体

这篇具有很好参考价值的文章主要介绍了Qt3D绘制旋转立方体。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

近期用了款叫DesktopSpace,也想实现一下这款软件实现的效果
具体实现步骤:

  1. 使用Qt3D绘制个旋转的立方体(一)
  2. 使用快捷键控制立方体显示面(二)
  3. 创建6个人虚拟桌面,截取不同虚拟桌面,显示在不同的面上 (三)
  4. 在立方体上播放视频

首先用Qt3D绘制一下桌面截图旋转的效果

Qt3D绘制旋转立方体,桌面应用程序开发,qt,Qt3D,3d

Qt3D简单介绍

Qt 3D 是一个用于创建交互式 3D 图形应用程序的框架。它提供了一组类和函数,用于创建、渲染和操作 3D 场景。Qt 3D 在 Qt c++ 和 Qt Quick 应用程序中支持 2D 和 3D 渲染,为近实时仿真系统提供了功能。

以下是 Qt 3D 中一些常用的类说明和代码流程:

Qt3DCore:这是 Qt 3D 框架的核心模块,包含了一些基本类和接口,用于构建 3D 场景和实体。其中一些重要的类包括:

QEntity:表示 3D 场景中的实体,可以添加组件和子实体。
QTransform:表示实体的变换信息,用于控制实体的位置、旋转和缩放等属性。
Qt3DRender:这个模块主要用于渲染图形对象,包括定义材质、纹理和着色器等。其中一些重要的类包括:

QMaterial:表示实体的材质,包含了表面属性、纹理和渲染状态等。
QEffect:定义了渲染效果的着色器程序。
QTexture:表示纹理,可以加载图像并应用于材质。
Qt3DInput:这个模块用于处理用户输入(例如鼠标和键盘事件),以及与用户交互的功能。其中一些重要的类包括:

QMouseDevice:用于监听和处理鼠标事件。
QKeyboardDevice:用于监听和处理键盘事件。

下面是一个简单的 Qt 3 D 代码流程示例,展示了如何创建一个带有实体、材质和变换的场景:

#include <Qt3DCore/QEntity>   
#include <Qt3DRender/QMaterial>   
#include <Qt3DRender/QEffect>   
#include <Qt3DRender/QTexture>   
#include <Qt3DCore/QTransform>   
  
int main(int argc, char** argv) {  
    QApplication app(argc, argv);  
    // 创建场景根实体  
    Qt3DCore::QEntity sceneRoot;  
    // 创建一个实体  
    Qt3DCore::QEntity* entity = new Qt3DCore::QEntity(&sceneRoot);  
    // 创建材质  
    Qt3DRender::QMaterial* material = new Qt3DRender::QMaterial(entity);  
    // 创建纹理  
    Qt3DRender::QTexture2D* texture = new Qt3DRender::QTexture2D(material);  
    // 设置纹理属性  
    // 创建效果  
    Qt3DRender::QEffect* effect = new Qt3DRender::QEffect();  
    // ...  
}

这个示例只是 Qt 3 D 的一个简单应用,如果需要更深入了解和使用 Qt 3 D ,建议阅读官方文档和相关教程。

绘制旋转立方体

主函数

#include "cubewidget.h"
#include <Qt3DExtras/QTextureMaterial>
#include <QImage>
#include <QApplication>
#include <QWidget>
#include <QHBoxLayout>
#include <QLabel>
#include <QCheckBox>
#include <Qt3DCore/QEntity>
#include <Qt3DCore/QTransform>
#include <Qt3DExtras/QCuboidMesh>
#include <Qt3DExtras/QPhongMaterial>
#include <Qt3DExtras/Qt3DWindow>
#include <Qt3DExtras/QOrbitCameraController>
#include <Qt3DExtras/QForwardRenderer>
#include <QTimer>
#include <Qt3DRender/QCamera>
#include <Qt3DCore/QComponent>
#include <Qt3DRender/QTextureImage>
#include <Qt3DRender/QTexture>
#include <QMatrix3x3>
#include <QRenderSurfaceSelector>
#include <QImage>
#include "rotatorutil.h"
#include "rotator.h"
#include "hotkeymanager.h"
#include "mymaterialimage.h"
#include "lazyutil.h"

#include "animationutil.h"

CubeWidget::CubeWidget(QWidget *parent)
    : QWidget{parent}
{
    // 创建3D窗口
    Qt3DExtras::Qt3DWindow *view = new Qt3DExtras::Qt3DWindow();
    view->defaultFrameGraph()->setClearColor(QColor(210, 210, 220, 0));
    view->setTitle("Qt3D C++ example: rotate cube");

    // 创建一个容器小部件和窗口布局
    QWidget *container = QWidget::createWindowContainer(view);
    container->setAttribute(Qt::WA_TranslucentBackground, true);

    QHBoxLayout *layout = new QHBoxLayout();
    layout->addWidget(container, 1);

    // 创建一个用于窗口的小部件并设置其布局
    setLayout(layout);

    // 创建场景的根实体
    Qt3DCore::QEntity *rootEntity = new Qt3DCore::QEntity();

    // 创建相机实体并设置其位置和视图中心
    Qt3DRender::QCamera *cameraEntity = view->camera();
    cameraEntity->setPosition(QVector3D(10.0f, 0, 0.0f));
    cameraEntity->setViewCenter(QVector3D(0, 0, 0));

    // 创建立方体实体并添加立方体网格组件和冯氏材质组件
    Qt3DCore::QEntity *cubeEntity = new Qt3DCore::QEntity(rootEntity);
    Qt3DExtras::QCuboidMesh *cubeMesh = new Qt3DExtras::QCuboidMesh();
    cubeMesh->setXExtent(5.1f);
    cubeMesh->setYExtent(3.23f);
    cubeMesh->setZExtent(5.1f);

//    cubeMesh->setXYMeshResolution(QSize(300, 100));
//    cubeMesh->setXZMeshResolution(QSize(300, 100));
//    cubeMesh->setYZMeshResolution(QSize(100, 100));

    auto *image = new MyQPaintedTextureImage;
    image->setImage(LazyUtil::Instance()->grabScreenImage());
    auto *cubeMaterial = new Qt3DExtras::QTextureMaterial;
    cubeMaterial->texture()->addTextureImage(image);
#ifdef USE_OCV
    QTimer* timer = new QTimer(this);
    connect(timer, &QTimer::timeout, image, &MyQPaintedTextureImage::updateImage);
    timer->start(50); // 1000毫秒刷新一次
#endif
    // 将立方体网格组件和冯氏材质组件添加到立方体实体
    cubeEntity->addComponent(cubeMesh);
    cubeEntity->addComponent(cubeMaterial);

    // 创建一个变换组件并将其添加到立方体实体
    Qt3DCore::QTransform *transform = new Qt3DCore::QTransform();
    cubeEntity->addComponent(transform);

#if 1
    // 定时旋转
    Rotator *rotator = new Rotator();
    QObject::connect(rotator, &Rotator::rotationChanged, transform, &Qt3DCore::QTransform::setRotation);
#else
    // 快捷键旋转
    RotatorUtil *rotator = new RotatorUtil();
    QObject::connect(rotator, &RotatorUtil::rotationChanged, transform, &Qt3DCore::QTransform::setRotation);

    QObject::connect(HotkeyManager::Instance(), &HotkeyManager::angleHorizontalChanged, rotator, &RotatorUtil::updateAngleHorizontal);
    HotkeyManager::Instance()->registerLeftRotateHotkey(rotator);
    HotkeyManager::Instance()->registerRightRotateHotkey(rotator);

    QObject::connect(HotkeyManager::Instance(), &HotkeyManager::angleVerticalChanged, rotator, &RotatorUtil::updateAngleVertical);
    HotkeyManager::Instance()->registerTopRotateHotkey(rotator);
    HotkeyManager::Instance()->registerBottomRotateHotkey(rotator);

    QObject::connect(HotkeyManager::Instance()->getWorker(), &RotateWorker::angleHorizontalChanged, rotator, &RotatorUtil::updateAngleHorizontal);
    QObject::connect(HotkeyManager::Instance()->getWorker(), &RotateWorker::angleVerticalChanged, rotator, &RotatorUtil::updateAngleVertical);
#endif

    // 设置窗口的根实体
    view->setRootEntity(rootEntity);

    setAttribute(Qt::WA_TranslucentBackground, true);

    AnimationUtil::AnimationSmaller(this);
}

动画控制类文章来源地址https://www.toymoban.com/news/detail-741736.html

#ifndef ROTATOR_H
#define ROTATOR_H

#include <Qt3DCore/QComponent>
#include <QTimer>
#include <QVector3D>
#include <QQuaternion>

// A custom component that controls the rotation of an entity
class Rotator : public Qt3DCore::QComponent
{
    Q_OBJECT
public:
    Rotator(Qt3DCore::QNode *parent = nullptr)
        : Qt3DCore::QComponent(parent)
        , m_angle(0.0f)
    {
        // Create a timer to update the angle every 10 ms
        QTimer* timer=new QTimer(this);
        connect(timer, &QTimer::timeout, this, &Rotator::updateAngle);
        timer->start(10);
    }

    // A function to get the current rotation as a quaternion
    QQuaternion rotation() const
    {
        // Calculate the rotation axis as the cross product of the up vector and the forward vector
        QVector3D axis = QVector3D(0.0f, 1.0f, 0.0f)
                             .crossProduct(QVector3D(0.0f, -1.0f, 0.0f),
                                           QVector3D(-1.0f, 0.0f, 1.0f));

        // Normalize the axis
        axis.normalize();

        // Return the rotation as a quaternion
        return QQuaternion::fromAxisAndAngle(axis, m_angle);
    }

private slots:
    // A slot to update the angle by 1 degree
    void updateAngle()
    {
        // Increment the angle by 1 degree
        m_angle += 0.2f;

        // Wrap the angle to [0, 360) range
        if (m_angle >= 360.0f) {
            m_angle -= 360.0f;
        }

        // Emit a signal to notify the change of rotation
        emit rotationChanged(rotation());
    }

signals:
    void rotationChanged(const QQuaternion &rotation);

private:
    float m_angle; // The angle of rotation in degrees
};

#endif // ROTATOR_H

到了这里,关于Qt3D绘制旋转立方体的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【libGDX】立方体手动旋转

    【libGDX】立方体手动旋转

    ​ 本文主要介绍使用 libGDX 绘制立方体,并实现手动触摸事件控制立方体旋转。 ​ 为方便控制触摸旋转,并提高渲染性能,我们通过改变相机的位置和姿态实现立方体旋转效果。 ​ 读者如果对 libGDX 不太熟悉,请回顾以下内容。 使用Mesh绘制三角形 使用Mesh绘制矩形 使用M

    2024年03月09日
    浏览(17)
  • 计算机图形学 | 实验六:旋转立方体

    计算机图形学 | 实验六:旋转立方体

    华中科技大学《计算机图形学》课程 MOOC地址:计算机图形学(HUST) 在正式搭建环境之前,我们先来介绍一下读完下面的部分你会了解些什么。 绘制出旋转立方体需要的新知识 认识一些 OpenGL的新功能 接下来,我们来介绍一下绘制旋转立方体。绘制效果如下: Z-缓存(Z-Buff

    2024年02月06日
    浏览(73)
  • Unity2021 实现不同面颜色不同的立方体鼠标键盘控制旋转

    Unity2021 实现不同面颜色不同的立方体鼠标键盘控制旋转

    1.创建一个3D的项目 2.创建一个Cube和一个Plane(其实没啥用,可以不建) 3.在Project的Assets中创建三个文件夹,后续放代码文件 4.设置颜色。 (1)在Material文件夹中右键创建一个Material文件命名为CubeMaterial,也就是下图中第一个白色的圆圈。中间的是控制Plane的,如果没有创建

    2024年02月08日
    浏览(10)
  • OpenGLES:3D立方体纹理贴图

    OpenGLES:3D立方体纹理贴图

    前几篇博文讲解了OpenGLES绘制多种3D图形,并赋予丰富的色彩,但是在这些3D图形绘制过程中,有一点还没有涉及,就是 纹理贴图。 今天这篇博文我会用如下 六张图片 对立方体进行纹理贴图,实现 六个面都是贴图 的3D旋转立方体 2.1 常规变量定义 2.2 顶点、纹理相关变量定义

    2024年02月08日
    浏览(14)
  • Qt3D模块使用

    Qt3D模块使用

    在Qt中显示一个简易的立方体,效果如下 1.Qt官方提供的Qt3d 的实例较少,QWidget的实例更少,通过以下两个函数就能加载一个3D场景到一个QWidget的布局器中 2.初始化3D的场景,一般为固定代码 3.构造立方体实体代码

    2024年02月11日
    浏览(8)
  • Three.js初识:渲染立方体、3d字体、修改渲染背景颜色

    Three.js初识:渲染立方体、3d字体、修改渲染背景颜色

    用场景对three.js进行渲染:场景、相机、渲染器 场景 透视摄影机 参数解析: fov: 视野角度(FOV)。视野角度就是无论在什么时候,你所能在显示器上看到的场景的范围,它的单位是角度(与弧度区分开)。 aspect: 长宽比(aspect ratio)。 也就是你用一个物体的宽除以它的高的值

    2024年02月07日
    浏览(12)
  • ❤️创意网页:使用CSS和HTML创建令人惊叹的3D立方体

    ❤️创意网页:使用CSS和HTML创建令人惊叹的3D立方体

    ✨ 博主: 命运之光   🌸 专栏: Python星辰秘典 🐳 专栏: web开发(简单好用又好看) ❤️ 专栏: Java经典程序设计 ☀️ 博主的其他文章: 点击进入博主的主页 前言: 欢迎踏入我的Web项目专栏,一段神奇而令人陶醉的数字世界! 🌌 在这里,我将带您穿越时空,揭开属于

    2024年02月12日
    浏览(19)
  • Qt3D 输入类处理鼠标键盘动作

    Qt3D模块中的输入类用于处理用户输入,比如鼠标、键盘等输入事件。 ```cpp #include Qt3DExtras #include Qt3DInput #include Qt3DCore #include Qt3DRender #include Qt3DLogic #include Qt3DExtras int main(int argc, char *argv[]) {     QApplication app(argc, argv);     // 创建Qt3D窗     Qt3DExtras::Qt3DWindow view;     // 创建3

    2024年02月02日
    浏览(9)
  • 使用Unity3D创建一个立方体(Cube)游戏对象并启动Unity

    Unity3D是一个强大的游戏开发引擎,可以用来创建各种类型的游戏和交互应用程序。在本文中,我们将探讨如何使用Unity3D创建一个立方体(Cube)游戏对象,并启动Unity编辑器。 首先,确保你已经安装了Unity3D并且已经在你的计算机上成功启动。然后,按照以下步骤进行操作:

    2024年02月05日
    浏览(54)
  • HTML5七夕情人节表白网页制作【抖音3D立方体图像库】HTML+CSS+JavaScript html生日快乐祝福网页制作

    HTML5七夕情人节表白网页制作【抖音3D立方体图像库】HTML+CSS+JavaScript html生日快乐祝福网页制作

    这是程序员表白系列中的100款网站表白之一,旨在让任何人都能使用并创建自己的表白网站给心爱的人看。 此波共有100个表白网站,可以任意修改和使用,很多人会希望向心爱的男孩女孩告白,生性腼腆的人即使那个TA站在眼前都不敢向前表白。说不出口的话就用短视频告诉

    2024年02月02日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包