2011-07-11 48 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

這個修復會保持空間距離嗎? –