【发布时间】:2013-01-27 08:08:05
【问题描述】:
我想在 QT 中围绕其 Y 轴(或任何轴)旋转一个小部件,与此处显示的方式完全相同:
Image rotation in 3D space around Y axis
我已经搜索过了,但我得到的都是二维变换,比如顺时针或逆时针旋转
我真的想要一些非常简单的东西,因为我会在整个项目中这样做一次。
【问题讨论】:
标签: c++ qt 3d image-rotation
我想在 QT 中围绕其 Y 轴(或任何轴)旋转一个小部件,与此处显示的方式完全相同:
Image rotation in 3D space around Y axis
我已经搜索过了,但我得到的都是二维变换,比如顺时针或逆时针旋转
我真的想要一些非常简单的东西,因为我会在整个项目中这样做一次。
【问题讨论】:
标签: c++ qt 3d image-rotation
首先,由于绘画引擎的操作方式(完全是 2D)和布局管理器的工作方式,普通的 Qt 小部件无法做到这一点,因此任何解决方案都不是微不足道的。
最简单的方法是将小部件放入QGraphicsScene/View 作为QGraphicsProxyWidget,并使用setTransform(const QTransform&, bool) 方法应用转换矩阵。
但是由于引擎仍然是 2D,您必须创建一个 3D 转换矩阵来描述您想要的操作,然后使用投影转换为 2D 矩阵。这并不简单,但是您可以通过使用静态方法squareToQuad(const QPolygonF&, QTransform&) 来“伪造”效果,就像您链接到的效果一样 - 当用户“旋转”小部件时,一个垂直边缘变得更小并移向四边形中心,而相反边缘变大并向四边形中心移动。
【讨论】:
QGraphicsProxyWidget 来为你伪造的转换提供自定义属性。然后你可以使用QPropertyAnimation 来驱动它们。
最容易制作和理解的可能是paint the widget to a QPixmap。然后子类 QWidget 将绘制此 QPixmap 转换以匹配 3D 旋转或“假”旋转。由于这幅画整齐地在您的自定义小部件中的单个 paintEvent() 中,因此很容易从假版本开始(例如,没有透视图),然后如果有时间和需要,可以返回并改进它。
例如,使用 OpenGL 进行绘画会很容易,例如基于 openGL examples of Qt 中的 "Textures" 示例。
【讨论】:
paintEvent(..) 中进行转换的唯一问题是(它的优点是不需要QGraphicsView 来显示它),您还必须重新映射所有鼠标交互。
如果您真的想在 Qt 项目中以能够与其他用户界面小部件良好集成的方式完成此操作,我建议您查看 Qt Quick (Qt 4.7 +) 或 Qt Quick 2.0 (Qt 5.0 +)。它们旨在帮助促进创建更动态的界面。他们使用 QML(描述小部件功能的类似 css 的标记语言)和熟悉的更高级别的 C++ 包装器,可以像任何其他 Qt 小部件一样访问。 Qt Quick 2.0 尤其酷,能够相对轻松地绘制酷炫的粒子系统效果。
【讨论】: