我正在制作一个“身体”类,它将一堆2D形状组合在一起形成一个可移动的可旋转物体。如何围绕任意点旋转一组2D形状
我需要知道的是,我如何以某种方式旋转每个单独的形状,使其看起来像整个身体正在旋转,而不是每个形状都围绕它的中心旋转。 我不能将每个形状的旋转中心更改为同一点,因为这会导致它们的位置也受到影响。
因此我需要找到某种方程式的使用了机构中心重新定位,并在身体在保持身材不变形的方式重新旋转每个单独的形状?
我该怎么做?
我正在制作一个“身体”类,它将一堆2D形状组合在一起形成一个可移动的可旋转物体。如何围绕任意点旋转一组2D形状
我需要知道的是,我如何以某种方式旋转每个单独的形状,使其看起来像整个身体正在旋转,而不是每个形状都围绕它的中心旋转。 我不能将每个形状的旋转中心更改为同一点,因为这会导致它们的位置也受到影响。
因此我需要找到某种方程式的使用了机构中心重新定位,并在身体在保持身材不变形的方式重新旋转每个单独的形状?
我该怎么做?
我假设你用笛卡尔坐标(x,y)表示点,并且你对矢量的基本思想感到满意。
要旋转规定角度θ围绕原点(0,0)的单点,我们改造它像这样:
X” = X cos(θ) - ÝSIN(θ)
ÿ '= X SIN(θ)+ Y COS(θ)
或者在矢量矩阵的形式:
X' = 中号(θ) X
(如果你不熟悉矢量矩阵的话,我可以说明它。)
要旋转点X围绕一点乙,这样做:
X” = 乙 + 中号(θ)(X - 乙)
要旋转整个身体θ关于其中心B,只需旋转ea ch形状的中心θ约B,并且围绕自己的中心旋转每个形状θ(您可以按任意顺序执行这些步骤)。
您需要的是转换的层次结构。从本质上讲,3D中一直都在做什么,只有你使用2D数学来做它。因此,而不是4×4仿射矩阵,你有3×3仿射矩阵。
每个单独的形状都需要进行局部变换。自身围绕其中心的旋转(相对于中性旋转),以及自身相对于其父对象的中心点的平移。您将此转换构建为3x3矩阵。
您需要一个对象层次结构:一棵树。你的“身体”是树中的一个节点。它有孩子的节点:两个大腿,两个上臂和一个头。每个大腿在小孩身上都有一个小腿,就像每个上臂在小孩身上有一个小臂。等等。
因此,当绘制所有东西的时候,你就会积累矩阵。你得到身体的变换矩阵,通过它转换身体,并渲染它。然后你得到身体的每个孩子,乘以其父母的变换,通过该新的矩阵变换该形状,并渲染它。然后,对于其中的每一个,重复该过程:取父矩阵,将其局部矩阵应用于该父矩阵,通过新矩阵变换该对象并进行渲染。遍历整个对象层次结构。
真的,理解这个最好的方法就是看3D渲染器如何去做。二维渲染只是一个特例,你只能绕Z旋转,只能进行二维平移。
通过任意点旋转的方式首先是减去点坐标,旋转原点然后添加点坐标。
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
弧度的角度。
你知道如何旋转另一个点吗?并且是由其中心的位置定义的形状的位置? – Beta
是的形状的位置取决于中心,并且不,我不知道该怎么做 – Griffin
-1。首先在数学交换中询问这个数学,然后在需要时询问实施。另请参阅维基百科的“2D旋转” - http://en.wikipedia.org/wiki/Transformation_matrix#Rotation。 – ja72