簡體   English   中英

mOffsetMatrix 在 Assimp 中實際上做了什么?

[英]What does mOffsetMatrix actually do in Assimp?

我很確定 mOffsetMatrix 將頂點從網格空間轉換為骨骼空間,這一點得到了證實http://assimp.sourceforge.net/lib_html/structai_bone.html

但是后來我看到了這個,它說它實際上將頂點從骨骼空間轉換到網格空間。 https://github.com/assimp/assimp/pull/1803

現在我很困惑。 那么 mOffsetMatrix 究竟是做什么的呢?

骨骼的offsetMatrix是該骨骼在綁定姿勢處的全局變換 換句話說,如果您遍歷骨骼/節點層次結構,將每個骨骼/節點的局部變換( Assimp中的 mTransformation)分層應用於其子項,我們將獲得每個骨骼/節點的全局變換。 特定骨骼的此矩陣的等於其 offsetMatrix。 正如此處暗示的那樣,它可以手動計算 - 無論如何,它是常數,不應按幀計算。

“offsetMatrix”這個名字,雖然有點令人困惑(像inverseBind這樣的東西會更清楚),可能來自它的使用。 我們用於蒙皮的變換是 ( B_keyframe * offsetMatrix ),其中B_keyframe是某個目標位置的骨骼的全局變換,例如由動畫剪輯提供。 這種復合變換實際上是一個偏移量,從綁定姿勢(定義網格頂點的位置)到 B_keyframe。 當應用於頂點時, (B_keyframe * offsetMatrix) 將“移動”頂點,從綁定位置到 B_keyframe 轉換到的任何位置。
請注意,如果 B_keyframe 等於綁定變換,例如根據上述骨架的 mTransformation:s 計算,則 (B_keyframe * offsetMatrix) 是標識並且頂點不會從綁定姿勢中的原始位置移動。

當涉及到 offsetMatrix 時,我個人更喜歡“從網格空間到骨骼空間”的定義。 為什么? 因為 offsetMatrix 的逆——(全局)骨骼變換(綁定姿勢)——最直觀地理解為從骨骼到網格/模型空間變換 反過來, offsetMatrix從網格/模型空間轉換到骨骼空間
對比渲染中的View矩陣:它是相機世界變換(T*R)的逆,一般理解為從世界到視圖空間的變換。

這是您的問題的答案(來自錯誤的解決方案):

這取決於您如何看待轉換。 如果矩陣乘法出現在點之后(即點 * 變換,點是“行”向量),那么可以說它從“網格空間到骨骼空間”轉換,因為它需要網格空間中的一個點並輸出一個點在骨骼空間。 但是當像assimp那樣使用矩陣預乘時(轉換*點,點是“列”向量),更有意義的是將其視為將空間本身從“骨骼空間到網格空間”的變換,因此網格空間中的點可以使用。

這就是原發帖人糊塗的原因,因為與assimp對待點變換的方式相比,他們是在倒推。 這可能直接導致他們對計算骨骼變換矩陣的混淆,並認為這應該與 mOffsetMatrix 相同,而實際上它是逆矩陣。

這尤其令人困惑,因為 DirectX 使用后乘法,而 OpenGL 使用預乘法。

綜上所述,我希望有人可以更新文檔,以便讓每個人都清楚。 如果沒有對這類事情的“官方”思考方式,很難明確說明。 我什至找不到任何地方都記錄了 assimp 如何處理變換矩陣乘法......盡管在 assimp 文檔的“數據結構”頁面上使用的矩陣表示法暗示了與列向量的預乘。

希望這會幫助你。

文檔是錯誤的。 所以我需要更新我們的文檔。 第 1950 期

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM