7
遊戲數學:Sterp - 物件旋轉擺扭解構 (/z/game-design)

最近在看一個GDC影片的時候講者提到,旋轉的 "擺扭解構" (swing-twist decomposition),只是一語帶過,但勾起了我的好奇心,所以就開始研究。研究後覺得算蠻有用的工具,所以就寫了一篇文來整理和分享心得。

一般從一個旋轉漸變到另外一個旋轉,是用球線性內插 (slerp, spherical linear interpolation)。數學上的意義是,代表旋轉的四圓數沿著4D球體表面的最短大圓路徑移動。雖然在4D定義上是"最點"不過在某些情況下,slerp的效果不是最理想的。

例如一個長竿在slerp的時候,兩端視覺上並不是沿著3D球體表面的最短大圓路徑。理想上兩端應該要沿著大圓路徑"擺動" (swing),然後本身沿著長軸"扭動" (twist),這個時候就需要用擺扭解構把旋轉分成擺動和扭動兩個部分,後兩部分各自內插後再組合,就可以達到理想的效果。

詳細解釋、推導、Unity中的實作和證明,請見: http://allenchou.net/2018/05/game-math-swing-twist-interpolation-sterp/1

allen_chou 積分 0

突然想到另外一個擺扭解構的2D應用。如果把扭動軸選擇跟螢幕垂直,那就可以用3D物件的旋轉牽動2D要素的旋轉或者其他資料,因為解構得到的扭轉部分就是3D物件旋轉投影到螢幕上的結果。

但是就效能而言,不如把物件的一個軸投影到螢幕上,然後找該投影和一個固定2D軸的角度。但擺扭解構又不像投影法一樣,有物件軸與螢幕垂直的時候會數值炸掉的缺點。