Clutter Rotation 的惡行

由於之前已經寫過太多雜文說明,『Clutter Toolkit』的威力應該就不必要再多說。雖然說 Clutter 開發上很容易,但在真正開始開發程式後,就會發現有很多地方細節需要注意。

關於開發 Clutter 程式時,會碰到的大部份問題,都出在於其設計邏輯與其他 3D Engine 不同,而最不一樣的地方,就是演員制度。Clutter Toolkit 特別的演員制度邏輯,使開發者將不再以大場景和 3D 空間定位為考量重點,而是以一個個 Actor 的角度去實作一切行為。因此,通常開發者第一個會碰到的行為就是『向左走、向右走』,單單使 Actor 旋轉到我們要的角度,就會碰到些問題。

ClutterActor 定義了一系列 function 去實作各種行為,其中旋轉的部份:

clutter_actor_set_rotation(ClutterActor *self,
                                        ClutterRotateAxis axis,
                                        gdouble angle,
                                        gfloat x,
                                        gfloat y,
                                        gfloat z);

clutter_actor_get_rotation(ClutterActor *self,
                                        ClutterRotateAxis axis,
                                        gfloat *x,
                                        gfloat *y,
                                        gfloat *z);

關於 rotation 的 angle,其範圍在 0 至 360 度之間,若設定超出角度範圍,會有 Warning 出現,有些時候雖然仍可正常執行,但會有無法預期的錯誤行為發生。而有個小問題出在於 clutter_actor_get_rotation() 的回傳值,其回傳值將有可能為負數,並不是在 0 至 360 之間,若是直接將回傳值代入 clutter_actor_set_rotation(),將會出現錯誤。

這代表要是你的 Actor 現在已經轉了 315 度,用 clutter_actor_get_rotation() 取回的數值將可能是 -45。此時,要先算出正數的角度,才能再代回 clutter_actor_set_rotation() 使用。

留言

  1. 這個mod 360 就可以了,
    可是我覺得應該是在clutter library 層面要處理的,不該叫programmer 處理

    回覆刪除
  2. 從 Clutter Source Code 實作可以看到,這牽涉到 CW 和 CCW 的運作,這麼設計其實是有其道理,但讓和內部實作無關的另一層開發者迷惑,實在不是一個好的 API 設計。

    回覆刪除

張貼留言

這個網誌中的熱門文章

有趣的邏輯問題:是誰在說謊

Web 技術中的 Session 是什麼?

淺談 USB 通訊架構之定義(一)

淺談 USB 通訊架構之定義(二)

Reverse SSH Tunnel 反向打洞實錄