Clutter Rotation 的惡行
由於之前已經寫過太多雜文說明,『Clutter Toolkit』的威力應該就不必要再多說。雖然說 Clutter 開發上很容易,但在真正開始開發程式後,就會發現有很多地方細節需要注意。
關於開發 Clutter 程式時,會碰到的大部份問題,都出在於其設計邏輯與其他 3D Engine 不同,而最不一樣的地方,就是演員制度。Clutter Toolkit 特別的演員制度邏輯,使開發者將不再以大場景和 3D 空間定位為考量重點,而是以一個個 Actor 的角度去實作一切行為。因此,通常開發者第一個會碰到的行為就是『向左走、向右走』,單單使 Actor 旋轉到我們要的角度,就會碰到些問題。
ClutterActor 定義了一系列 function 去實作各種行為,其中旋轉的部份:
clutter_actor_set_rotation(ClutterActor *self,
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() 使用。
關於開發 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);
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() 使用。
這個mod 360 就可以了,
回覆刪除可是我覺得應該是在clutter library 層面要處理的,不該叫programmer 處理
從 Clutter Source Code 實作可以看到,這牽涉到 CW 和 CCW 的運作,這麼設計其實是有其道理,但讓和內部實作無關的另一層開發者迷惑,實在不是一個好的 API 設計。
回覆刪除