天天看點

Flash/Flex學習筆記(48):反向運動學(下)

先要複習一下三角函數與餘弦定理:

對于直角三角形,三邊長a,b,c與三個角A,B,C的關系如下:

Flash/Flex學習筆記(48):反向運動學(下)

正弦函數:

Flash/Flex學習筆記(48):反向運動學(下)

餘弦函數:

Flash/Flex學習筆記(48):反向運動學(下)

正切函數:

Flash/Flex學習筆記(48):反向運動學(下)

反正切函數:(好象現在的教科書裡改叫“餘切”函數)

Flash/Flex學習筆記(48):反向運動學(下)

勾股定律:

Flash/Flex學習筆記(48):反向運動學(下)

但對于不是直角的三角形,就必須用餘弦定律來處理了:

Flash/Flex學習筆記(48):反向運動學(下)
Flash/Flex學習筆記(48):反向運動學(下)
Flash/Flex學習筆記(48):反向運動學(下)
Flash/Flex學習筆記(48):反向運動學(下)
Flash/Flex學習筆記(48):反向運動學(下)
Flash/Flex學習筆記(48):反向運動學(下)

利用餘弦定理也可以處理反向運動學中的伸展:

Flash/Flex學習筆記(48):反向運動學(下)

上面這個是示意圖(花了我近一天時間才弄明白,汗,高中的數學知識全還給老師了)

說明:藍色的seg1作為固定端,紅色的seg0作為自由端,下面是處理步驟

1.根據滑鼠所在位置(mouseX,mouseY)得到dy,dx,進而确定角度D

2.根據a,b,c邊長,确定角度B

3.藍色seg1的旋轉角度為 D+B

4.藍色seg1旋轉後,将紅色seg0重新挂到seg1末端

5.紅色seg0的旋轉角度,我們借助向量平移,可以得到最終的旋轉角度E為: D + B + 180度 + C

問題來了:這種處理方式 與 上一篇中的處理方式有什麼差別麼?如果我們同樣把播放速度放慢到每秒一幀,仔細觀察

通過對比上一篇裡“同樣放慢到每秒一幀”的那個示例,觀察輔助線可以看到:現在這種方式對于系統姿态的調整是"一步到位"的,而上篇中的方式需要經過多次調整,才能達到最終的穩定姿态。

利用這個差別我們可以做一些性能優化:如果一次調整到位後,EnterFrameHandler函數裡可以不做任何處理,以節省CPU資源。同時考慮上面代碼中的三角型退化成直線的特殊情況(通常是滑鼠位置與自由端太遠時才發生),相當于二個關節直接拼成一個直棒,這時其實隻要簡單處理固定端旋轉,同時把自由端重新挂在固定端即可。下面是優化後的代碼

最後一個問題:這種方式雖然更高效,但是也有一個缺點,隻能向一個方向旋轉,原因就在于角度 E = D+B+Math.PI + C這種計算方式,如果想換一個方向的話,大家可以把示意圖中的三角型以c邊為軸“向上翻”,這裡就不重複畫了,seg1的旋轉角度和E的計算公式改成下面這樣,其它不變:

我們可以根據滑鼠所在點是否在固定端左邊或右邊,用代碼切換旋轉方向,這樣就與上一篇中的效果徹底一緻了

繼續閱讀