【问题标题】:Rotate widget around its Y axis In QT in 3d space在 3d 空间中的 QT 中围绕其 Y 轴旋转小部件
【发布时间】:2013-01-27 08:08:05
【问题描述】:

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

Image rotation in 3D space around Y axis

我已经搜索过了,但我得到的都是二维变换,比如顺时针或逆时针旋转

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

【问题讨论】:

    标签: c++ qt 3d image-rotation


    【解决方案1】:

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

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

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

    【讨论】:

    • 其实我在 3D 编程方面并不是很专业,所以我认为尝试伪造它或尝试模仿它对我来说更简单
    • 你可以继承 QGraphicsProxyWidget 来为你伪造的转换提供自定义属性。然后你可以使用QPropertyAnimation 来驱动它们。
    【解决方案2】:

    最容易制作和理解的可能是paint the widget to a QPixmap。然后子类 QWidget 将绘制此 QPixmap 转换以匹配 3D 旋转或“假”旋转。由于这幅画整齐地在您的自定义小部件中的单个 paintEvent() 中,因此很容易从假版本开始(例如,没有透视图),然后如果有时间和需要,可以返回并改进它。

    例如,使用 OpenGL 进行绘画会很容易,例如基于 openGL examples of Qt 中的 "Textures" 示例。

    【讨论】:

    • 在paintEvent(..) 中进行转换的唯一问题是(它的优点是不需要QGraphicsView 来显示它),您还必须重新映射所有鼠标交互。
    • 啊,是的。我不知何故认为这只是一个没有同时鼠标交互的动画。问题没有具体说明,所以这取决于。
    【解决方案3】:

    如果您真的想在 Qt 项目中以能够与其他用户界面小部件良好集成的方式完成此操作,我建议您查看 Qt Quick (Qt 4.7 +) 或 Qt Quick 2.0 (Qt 5.0 +)。它们旨在帮助促进创建更动态的界面。他们使用 QML(描述小部件功能的类似 css 的标记语言)和熟悉的更高级别的 C++ 包装器,可以像任何其他 Qt 小部件一样访问。 Qt Quick 2.0 尤其酷,能够相对轻松地绘制酷炫的粒子系统效果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多