最快的变换方式(移动、旋转、缩放)
Posted
技术标签:
【中文标题】最快的变换方式(移动、旋转、缩放)【英文标题】:Fastest way of doing transformations (Move, Rotate, Scale) 【发布时间】:2010-07-08 00:16:03 【问题描述】:我正在查看这个名为 Creative Docs .Net 的矢量绘图应用程序。我注意到我可以有数百种形状,并且移动、旋转和缩放根本不会滞后。鉴于必须修改所有顶点,应用程序通常如何尽快完成这些转换?
谢谢
【问题讨论】:
【参考方案1】:一种典型的方法是对坐标应用一个 3x3(或 3x2,或 2x3)仿射变换矩阵,它可以描述位置、旋转、缩放和剪切等内容。
如果您使用 OpenGL 或 Direct3D,您可以使用图形硬件为您进行实际的转换。
如果您在软件中执行此操作,则光栅化可能会成为瓶颈,而不是转换顶点。
【讨论】:
是否总是应用矩阵?例如:我从 (50,50) 开始,然后不断地重新应用转换? @user146780:在 OpenGL 中,矩阵作为状态应用。因此,当您应用转换时,它会继续应用,直到应用另一个转换或矩阵加载了标识。 @user146780:不完全确定您的意思,但是如果您更改转换(或顶点),您将不得不重新转换顶点,是的。如果您有一个顶点 x=(a,b,1)^T,您将得到转换后的顶点 x'=M*x,其中 M 是一个 3x3 矩阵。 M 中的前两列描述旋转和缩放,第三列描述平移。 x 中的最后一个元素对于点是 1,对于向量是 0。导出 2D 点的 2x2 旋转矩阵是一个非常有趣且简单的练习! @user146780 是的,矩阵会不断重新应用,但这并不意味着您的形状会在屏幕上移动,因为您正在使用例如平移矩阵。这是因为形状顶点由 gpu 使用矩阵转换,绘制然后丢弃。所以顶点总是在每一帧开始时在它们自己的局部坐标系中开始未变换。【参考方案2】:除了使用矩阵来模拟仿射变换(带平移的线性变换)之外,您可能对使用Quaternions 在R3中执行这些操作感兴趣>.
【讨论】:
【参考方案3】:通常这是通过转换矩阵完成的。这使得各个点可以相当快速地转换,并且是大多数基于 2D(和 3D)矢量的绘图使用的最常用技术。
该应用程序尤其是构建在 Anti-Grain Geometry 之上 - 一个相当高性能的开源 2D 渲染引擎。它提供了许多可用于此类应用程序的“原语”。
【讨论】:
Cairo (cairographics.org) 是另一个类似于 Anti-Grain Geometry 的库。例如,它在 Gtk+ 中使用。以上是关于最快的变换方式(移动、旋转、缩放)的主要内容,如果未能解决你的问题,请参考以下文章
[opengl] 画一个可移动的自行车 二维几何变换(平移旋转缩放)