在 3D 空间中的 QT 中围绕其 Y 轴旋转小部件

Rotate widget around its Y axis In QT in 3d space

本文关键字:旋转 小部 空间 3D QT      更新时间:2023-10-16

我想在 QT 中围绕其 Y 轴(或任何轴)旋转小部件,方式与此处显示的方式完全相同:

图像在 3D 空间中围绕 Y 轴旋转

我已经搜索过,但我得到的所有 2d 转换,例如顺时针或逆时针旋转

我真的想要一些非常简单的东西,因为我会在整个项目中做一次。

首先,由于绘画引擎的运行方式(完全是2D的)以及布局管理器的工作方式,普通的Qt小部件无法做到这一点,因此任何解决方案都不是平凡的。

最简单的方法是将小部件作为QGraphicsProxyWidget放入QGraphicsScene/View中,并使用setTransform(const QTransform&, bool)方法应用变换矩阵。

但是,由于引擎仍然是 2D,因此您必须创建一个描述所需操作的 3D 转换矩阵,然后使用投影转换为 2D 矩阵。 这并不简单,但你可以"伪造"效果,就像你通过使用静态方法squareToQuad(const QPolygonF&, QTransform&)链接到的效果一样 - 当用户"旋转"小部件时,一个垂直边缘变小并移向四中心,而相反的边缘变得更大并向四中心移动。

最容易制作和理解的可能是,将小部件绘制成QPixmap。然后子类QWidget wo绘制这个QPixmap转换以匹配3D旋转,或"假"旋转。由于这幅画整齐地位于自定义小部件的单个paintEvent()中,因此很容易从假版本(例如,没有透视)开始,然后在有时间和需要的情况下返回并对其进行改进。

例如,

使用OpenGL进行绘画非常容易,例如基于Qt的openGL示例中的"纹理"示例。

如果你真的想在Qt项目中以一种与其他用户界面小部件很好地集成的方式完成这项工作,我建议你看看Qt Quick(Qt 4.7 +)或Qt Quick 2.0(Qt 5.0 +)。它们经过精心设计,有助于创建更多的界面。他们使用QML(描述widget功能的类似css的标记语言)以及熟悉的更高级别的C++包装器,可以像任何其他Qt小部件一样访问。Qt Quick 2.0特别酷,能够相对轻松地绘制出很酷的粒子系统效果。