天天看點

Rig Optimize GameObject對骨骼的影響Optimize GameObject對骨骼Transform的影響

Optimize GameObject對骨骼Transform的影響

Rig Optimize GameObject對骨骼的影響Optimize GameObject對骨骼Transform的影響
一、問題描述

相同的角色FBX,一個使用Optimize GameObject選項并暴露相應的骨骼,一個不使用,分别建立各自的Prefab,播放相同動畫後,發現同一骨骼的朝向不一緻(但位置是一緻的)。

二、問題複現

我們使用研發團隊提供的Package中的模型,複現了該問題。播放相同動畫時,sk_palm_I的朝向如下圖:

Rig Optimize GameObject對骨骼的影響Optimize GameObject對骨骼Transform的影響

左:使用 Optimize, 右:不使用 Optimize

三、問題分析

我們首先進行一系列實驗,試圖從例子中發現一些有用的線索。

1. 我們将更多的骨骼暴露出來,來看是否所有的骨骼朝向都不相同。結果發現,朝向不同的骨骼隻是個例,進而發現sk_palm_I這根骨骼不存在對應的動畫曲線,并且沒有蒙皮對應的頂點。暴露其他沒有動畫曲線和蒙皮頂點的骨骼,發現骨骼朝向也不相同。

2. 再來對比骨骼的朝向,發現不開啟Optimize選項的sk_palm_l的transform.rotation(相對父骨骼)保持不變,手動将其設為(0,0,0)後朝向與開啟Optimize選項的sk_palm_l朝向一緻。是以,我們推測Optimize選項後無動畫的骨骼的Rotation被歸零,在其他無動畫的骨骼上得到驗證。

3. 發現朝向不一緻問題的角色使用了Humanoid模式,将其切換至Generic模式觀察骨骼朝向。然後發現,在Generic模式下,不管骨骼有無動畫曲線,其開啟Optimize前後的朝向都是一緻的。這說明朝向不一緻問題隻出現在Humanoid模式下。

通過這些實驗,可以得出骨骼朝向不一緻的條件:

Humanoid模式,骨骼沒有對應的動畫曲線和蒙皮頂點。而開啟Optimize後的朝向是開啟前對應骨骼的Rotation歸零後的朝向。 參閱 Unity關于Humanoid 以及 Optimize選項的相關描述:

Humanoid會将骨架(Skeleton)資訊映射到另一個空間(通過Configure Avatar)。開啟Optimize選項後,Unity更新骨骼矩陣時将不再考慮場景中骨骼Transform,而是直接使用Internal Skeleton。

綜合上述這些資訊,我們推測Humanoid的映射過程中骨骼Transform資訊發生了變化。骨架映射可以在Configure Avatar中設定。下圖驗證了我們的想法:

Rig Optimize GameObject對骨骼的影響Optimize GameObject對骨骼Transform的影響

在映射時,sk_palm_I的Rotation已經歸零。

發現了問題原因,解決方法就很明了,在映射時修正Rotation資訊。通過Pose->reset,所有骨骼的Transform就會與原始骨骼的Transform一緻。然後再Enforce T,來進行映射。之後開啟Optimize GameObject前後的骨骼朝向基本一緻,問題解決!

四、結論 Pose->Biped Pose(預設)會把所有不帶動畫、沒有蒙皮頂點且不在Muscle中的骨骼的Rotation歸零,是以對于類似該案例中的這類模型,映射時需要Reset。

這個問題也驗證了在開啟Optimize GameObject之後,場景中的骨骼Transform資訊不再影響到骨骼矩陣運算,也就省略了Mono到Native的資訊傳遞,是以會使骨骼矩陣運算的速度得以提升。是以建議開發團隊盡量地開啟該選項。