程序的逻辑如下:

正常显示逻辑:

1.场景中要存在一个根实体;
2.为根实体加载材质;
3.在根实体下添加其他实体;
4.为其他实体添加额外的数据(比如画圆环等);
5.放置摄像机,设置前景等属性。

摄像机视觉方面的逻辑:
1.放置摄像机,设置前景等属性;
2.创建摄像机轨道控制类,设置移动速度等属性;

物体实现动态功能的逻辑:
1.创建一个类,这个类完成对某一3D模型“动态”数据提取;
2.生成一个单位矩阵,并对这个单位矩阵进行操作(旋转,转化等);
3.把这个单位矩阵放到目标物体上;
4.使用QPropertyAnimation对某一属性名,实现动态效果;

程序运行截图如下:

源码如下:

animationcontroller.h

#ifndef ANIMATIONCONTROLLER_H
#define ANIMATIONCONTROLLER_H#include <QObject>
#include <QMatrix4x4>namespace Qt3DCore {
class QTransform;
}class AnimationController : public QObject
{Q_OBJECTQ_PROPERTY(Qt3DCore::QTransform* target READ target WRITE setTarget NOTIFY targetChanged)Q_PROPERTY(float radius READ radius WRITE setRadius NOTIFY radiusChanged)Q_PROPERTY(float angle READ angle WRITE setAngle NOTIFY angleChanged)
public:AnimationController(QObject *parent = 0);void setTarget(Qt3DCore::QTransform *target);Qt3DCore::QTransform *target()const;void setRadius(float radius);float radius()const;void setAngle(float angle);float angle()const;signals:void targetChanged();void radiusChanged();void angleChanged();protected:void updateMatrix();private:QMatrix4x4 m_matrix;Qt3DCore::QTransform *m_target;float m_radius;float m_angle;
};#endif // ANIMATIONCONTROLLER_H

animationcontroller.cpp

#include "animationcontroller.h"
#include <QTransform>AnimationController::AnimationController(QObject *parent): QObject(parent), m_target(nullptr), m_matrix(), m_radius(1.0f), m_angle(0.0f){}void AnimationController::setTarget(Qt3DCore::QTransform *target)
{if(m_target != target){m_target = target;emit targetChanged();}
}Qt3DCore::QTransform *AnimationController::target() const
{return m_target;
}void AnimationController::setRadius(float radius)
{if(!qFuzzyCompare(radius, m_radius)){m_radius = radius;updateMatrix();emit radiusChanged();}
}float AnimationController::radius() const
{return m_radius;
}void AnimationController::setAngle(float angle)
{if(!qFuzzyCompare(angle, m_angle)){m_angle = angle;updateMatrix();emit angleChanged();}
}float AnimationController::angle() const
{return m_angle;
}void AnimationController::updateMatrix()
{m_matrix.setToIdentity();m_matrix.rotate(m_angle, QVector3D(1.0f, 0.0f, 0.0f));m_matrix.translate(m_radius, 0.0f, 0.0f);m_target->setMatrix(m_matrix);
}

main.cpp

#include <Qt3DCore>
#include <QApplication>
#include <Qt3DRender>
#include <Qt3DInput>
#include <Qt3DExtras>
#include <QPropertyAnimation>
#include "animationcontroller.h"Qt3DCore::QEntity *createScene(){// Root entityQt3DCore::QEntity *rootEntity = new Qt3DCore::QEntity;// MaterialQt3DRender::QMaterial *material = new Qt3DExtras::QPhongMaterial(rootEntity);static_cast<Qt3DExtras::QPhongMaterial*>(material)->setAmbient(QColor(Qt::blue));Qt3DCore::QEntity *torusEntity = new Qt3DCore::QEntity(rootEntity);// TorusQt3DExtras::QTorusMesh *torusMesh = new Qt3DExtras::QTorusMesh;torusMesh->setRadius(10);torusMesh->setMinorRadius(1);torusMesh->setRings(100);torusMesh->setSlices(20);Qt3DCore::QTransform *sphereTransform = new Qt3DCore::QTransform;AnimationController *animationController = new AnimationController(sphereTransform);animationController->setTarget(sphereTransform);animationController->setRadius(20.0f);QPropertyAnimation *rotateAnimation = new QPropertyAnimation(sphereTransform);rotateAnimation->setTargetObject(animationController);rotateAnimation->setPropertyName("angle");rotateAnimation->setStartValue(QVariant::fromValue(0));rotateAnimation->setEndValue(QVariant::fromValue(360));rotateAnimation->setDuration(10000);rotateAnimation->setLoopCount(-1);rotateAnimation->start();torusEntity->addComponent(torusMesh);torusEntity->addComponent(sphereTransform);torusEntity->addComponent(material);return rootEntity;}int main(int argc, char *argv[])
{QApplication a(argc, argv);Qt3DExtras::Qt3DWindow view;Qt3DCore::QEntity *scene = createScene();Qt3DRender::QCamera *camera = view.camera();camera->lens()->setPerspectiveProjection(45.0f, 16.0f/9.0f, 0.1f, 1000.0f);camera->setPosition(QVector3D(0, 0, 40.0f));camera->setViewCenter(QVector3D(0, 0, 0));Qt3DExtras::QOrbitCameraController *camController =  new Qt3DExtras::QOrbitCameraController(scene);camController->setLinearSpeed(50.0f);camController->setLookSpeed(180.0f);camController->setCamera(camera);view.setRootEntity(scene);view.show();return a.exec();
}

Qt文档阅读笔记-最简单的动态3D圆环实例相关推荐

  1. Qt文档阅读笔记-QML Canvas的官方解析及实例

    目录 官方解析 博主例子 官方解析 Canvas可以用于画直线或曲线,简单或复杂的形状,图形,图片,并且他能加文字,颜色,阴影,和颜色梯度,和其他的装饰,可以进行低像素操作.Canvas可以保存成图像 ...

  2. Qt文档阅读笔记-Semaphores Example解析(信号量并发实例)

    这个例子展示了在Qt中使用多线程,在并发程序中使用QSemaphore要比QMutex高级. 这个例子是生产者生成数据,消费者消费数据,QSemaphore等同于QWaitCondition + QM ...

  3. Qt文档阅读笔记-FileDialog QML Type官方解析与实例

    目录 官方解析 博主例子 官方解析 FileDialog是基于文件的选择器,可以选择文件或文件夹,创建文件,这个Dialog初始化是不可见的,得需要设置他为visible或调用open()即可. 下面 ...

  4. Qt文档阅读笔记-Label QML Type官方解析及实例

    目录 官方解析 博主例子 官方解析 Label扩展了父类Text中的styling和font.Label同样是有可视化的background项. Label {text: "Label&qu ...

  5. Qt文档阅读笔记-TextEdit QML Type官方解析及实例

    目录 官方解析 博主栗子 官方解析 TextEdit展示了一个可编辑的一块,是有格式的文本. 他同样能展示普通文本和富文本: TextEdit {width: 240text: "<b ...

  6. Qt文档阅读笔记-Text QML Type官方解析及实例

    目录 官方解析 博主例子 官方解析 Text能够展示纯文本和富文本.举个例子,红色文本以及指定的字体和大小 Text {text: "Hello World!"font.famil ...

  7. Qt文档阅读笔记-Button QML Type官方解析及实例

    目录 官方解析 博主栗子 官方解析 按钮展示了一个按钮控件,这个控件可以被用户所按下,按钮是通常被用于执行一个操作,或者解决一个问题.buttons有如下几个典栗,如Ok,Apply,Cancel,C ...

  8. Qt文档阅读笔记-Timer QML Type 官方解析与实例

    目录 官方解析 博主例子 官方解析 Timer能够触发一个动作,或者在给定时间重复这个动作: 下面给出显示当前时间的代码,500毫秒刷新异常,这里是通过JS对象来获取当前时间! import QtQu ...

  9. Qt文档阅读笔记-共享库的创建与调用

    使用共享库的符号 这个符号可以作用在变量.类.函数中,并且这些都可以被调用端使用. 在编译共享库中,需要使用export符号.在使用端调用的时候使用import符号. 这里是本人从文档中记录的笔记,大 ...

最新文章

  1. 7-8 Windows消息队列 (25 分)
  2. Go语言 Redis的使用
  3. SpringMVC中跳转路径的问题
  4. 面对面快传文件服务器恢复,QQ 面对面快传的传应用功能,如何找到已安装应用的安装包?...
  5. spring项目搭建-约束引入
  6. ZZULIOJ 1127: 矩阵乘积
  7. python 复制文件并重命名_好书推荐 | Python 如此神奇,让繁琐工作自动化
  8. linux重启ipv6_Linux关闭、开启、配置IPv6
  9. 微软云计算介绍与实践(实践之三十五)
  10. LoadRunner 12 和 UFT\QTP 12在HP官网已经可以开始下载了
  11. png2theora.c: undefined reference to `png_sizeof
  12. movs 数据传送指令_1.数据传送指令中,错误的操作是()。 A.MOVSS[BX+DI],1000H B.......
  13. java char a z_java中,char A,char a的值各是多少?
  14. 2022年3月18到5月18的思考
  15. 双核旗舰处理器:德仪Omap4430、高通MSM8260、猎户S5PV310、Tegra2横向优点缺点比较...
  16. IndexError: Target 25 is out of bounds.
  17. # 飞书APP集成平台-数字化落地
  18. nothing的含义介绍和 Optional ByVal的用法
  19. boot版本是什么 cent os_CentOS下载及版本选择-CentOS LiveCD、LiveDVD和BinDVD区别
  20. 跨境电商| FaceBook 群发消息

热门文章

  1. [转载] C#面向对象设计模式纵横谈——7. Adapter适配器模式
  2. 修复安全删除硬件图标
  3. C/C++编程笔记:输入输出的优化,你还为思路正确却TLE而烦恼吗?
  4. 9种动态可视化技巧,快速提升可视化大屏能力(附模板)
  5. 今天的在一旁看电视的蜡笔小新
  6. 这个是什么单机经典模式的引入
  7. 起到的C++是中间层的作用
  8. 飞鸽传书 的内置的计算机处理
  9. 封网后聊天就用“飞秋”
  10. A sample that using the completion port I/O model