2011-07-11 47 views
2

我正在制作一个“身体”类,它将一堆2D形状组合在一起形成一个可移动的可旋转物体。如何围绕任意点旋转一组2D形状

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

因此我需要找到某种方程式的使用了机构中心重新定位,并在身体在保持身材不变形的方式重新旋转每个单独的形状?

我该怎么做?

+0

你知道如何旋转另一个点吗?并且是由其中心的位置定义的形状的位置? – Beta

+0

是的形状的位置取决于中心,并且不,我不知道该怎么做 – Griffin

+1

-1。首先在数学交换中询问这个数学,然后在需要时询问实施。另请参阅维基百科的“2D旋转” - http://en.wikipedia.org/wiki/Transformation_matrix#Rotation。 – ja72

回答

1

我假设你用笛卡尔坐标(x,y)表示点,并且你对矢量的基本思想感到满意。

要旋转规定角度θ围绕原点(0,0)的单点,我们改造它像这样:

X” = X cos(θ) - ÝSIN(θ)
ÿ '= X SIN(θ)+ Y COS(θ)

或者在矢量矩阵的形式:

X' = 中号(θ) X

(如果你不熟悉矢量矩阵的话,我可以说明它。)

要旋转点X围绕一点,这样做:

X” = + 中号(θ)(X -

要旋转整个身体θ关于其中心B,只需旋转ea ch形状的中心θ约B,并且围绕自己的中心旋转每个形状θ(您可以按任意顺序执行这些步骤)。

+0

是的,如果你能解释这两个方程会更好吗?我很了解矢量数学,但不太清楚这个方程的工作原理。 – Griffin

+0

@Griffin:哪些?第三和第四? – Beta

0

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

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

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

因此,当绘制所有东西的时候,你就会积累矩阵。你得到身体的变换矩阵,通过它转换身体,并渲染它。然后你得到身体的每个孩子,乘以其父母的变换,通过该新的矩阵变换该形状,并渲染它。然后,对于其中的每一个,重复该过程:取父矩阵,将其局部矩阵应用于该父矩阵,通过新矩阵变换该对象并进行渲染。遍历整个对象层次结构。

真的,理解这个最好的方法就是看3D渲染器如何去做。二维渲染只是一个特例,你只能绕Z旋转,只能进行二维平移。

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弧度的角度。

+0

这不保留原始形状之间的空间距离。任何想法如何解决这个问题? –

+0

对不起,我看到第二行有一个符号错误。 – ja72

+0

这个修复会保持空间距离吗? –