最近的一個工作項目是修正particle沒有按照指定路線走的問題
簡單來說,我們在角色的TPose上拉了幾條線,我們預期particle效果會沿著這條線走,不論角色現在是什麼姿勢~
FMatrix A = USkinnedMeshComponent::SkeletalMesh->GetRefBasesInvMatrix();
FTransform B = USkinnedMeshComponent::GetComponentSpaceTransforms();
為了讓TPose的點能順利mapping到目前的姿勢上,當然要先轉換一波了
透過 P' = P * A * B,就是我們要的結果了,A跟B都是陣列,存著每一根骨頭的transform
匪夷所思的是這樣依舊有問題,而奇怪的是,並不是每個particle都跑錯路徑
後來我僅僅只做了一行修正:
FTransform{ A } * B -> FTransform{ A * B.ToMatrixWithScale() },結果就對了
(計算結果存在一個FTransform裡,後面其他流程才會使用)
WTFFFFFFFFFFFFFFF
原因可能有二
1. FTransform(const& FMatrix)建構子的問題,我看了一下source code,並不只是單純的轉移數值而已,任何輸入都會被視為一個轉換矩陣,而從中抽取縮放/旋轉/平移等等資訊,是有可能導致數值改變而發生問題的
2. FTransform的乘法運算子還有其他計算,導致這種結果
總而言之,我十分建議任何矩陣運算都在FMatrix上做,最後存成FTransform沒問題,不要在中途轉FTransform
(更新: 詳細的原因這邊有一篇
文章有分享,簡單來說用在non-uniform scale的情況上會有問題)