如何围绕任意点旋转一组2D形状

时间:2011-07-11 02:00:52

标签: c++ math graphics rotation

我正在制作一个'Body'类,它将一堆2D形状组合在一起,形成一个可移动的可旋转体。

我需要知道的是我如何旋转每个单独的形状,使其看起来像整个身体旋转,而不是每个形状都围绕它的中心进行自己的旋转。 我不能只将每个形状旋转中心更改为同一点,因为这也会导致它们的放置受到影响。

因此我需要找到某种方程式,使用 body center 来重新定位和重新旋转身体中的每个个体形状,使身体形状保持不变?

我该怎么做?

3 个答案:

答案 0 :(得分:10)

通过任意点旋转的方法是首先减去点坐标,围绕原点进行旋转,然后添加点坐标。

x2 = px + (x1-px)*cos(q)-(y1-py)*sin(q)
y2 = py + (x1-px)*sin(q)+(y1-py)*cos(q)

其中px, py是旋转点坐标,x1,y1是原始的2D形状顶点,x2,y2是旋转的坐标,q是弧度的角度。

答案 1 :(得分:1)

我假设您在笛卡尔坐标(x,y)中表示点,并且您对矢量的基本概念感到满意。

要围绕原点(0,0)将单个点旋转给定角度θ,我们将其转换为:

x'= x cos(θ) - y sin(θ)
y'= x sin(θ)+ y cos(θ)

或以矢量矩阵形式:

X' = M (θ) X

(如果你不熟悉它,我可以拼出矢量矩阵的东西。)

要围绕点 B 旋转点 X ,请执行以下操作:

X' = B + M (θ)( X - B

要将整个身体围绕其中心 B 旋转θ,只需将每个形状的中心旋转θ B ,并将每个形状绕其自身中心旋转θ(你可以按任何顺序完成这些步骤。)

答案 2 :(得分:0)

您需要的是转换层次结构。基本上,3D中一直在做什么,只有你使用2D数学。因此,不是4x4仿射矩阵,而是3x3仿射矩阵。

每个单独的形状都需要进行局部变换。自身围绕其中心旋转(相对于中性旋转),以及相对于其父对象将其自身平移到该中心点。您将此转换构建为3x3矩阵。

您需要一个对象层次结构:一棵树。你的“身体”是树中的一个节点。它有子节点:两个上腿,两个上臂和一个头。每个上腿作为孩子都有一条小腿,就像每个上臂都有一个孩子的下臂一样。等等。

因此,当需要绘制所有内容时,就会累积矩阵。你得到了身体的变换矩阵,用它来变换身体,并渲染它。然后你得到身体的每个孩子,将其变换乘以其父变换,用新矩阵变换该形状,然后渲染它。然后,对于其中的每一个,重复该过程:获取父矩阵,将其局部矩阵应用于该父矩阵,通过新矩阵变换对象,并渲染它。递归整个对象层次结构。

真的,理解这一点的最好方法是看看3D渲染器是如何做到的。 2D渲染只是这种情况的一种特殊情况,您只能围绕Z旋转并且只有2D平移。