簡體   English   中英

你能從 gltf 文件中得到一個明確的骨架嗎?

[英]Can you get an explicit skeleton out of a gltf file?

出於調試目的,我想渲染蒙皮網格的骨架。 但是,在 glTF 中,它們似乎以非常抽象的方式定義。 也就是說,沒有“骨架”,如一組由線連接的頂點。 換句話說,這沒有明確定義: 在此處輸入圖片說明

相反,“骨架”實際上是一組節點,這些節點僅指定將相關頂點的位置轉換為關節位置的矩陣。

盡管如此,是否有可能提取關節的位置? 也許通過反轉 inverseBindmatrix 或類似的東西?

TL; DR 我有一個 gltf 模型,我想像在攪拌機中一樣渲染它的骨架。

我敢肯定,您不是在這里尋找“主要”或“有點”的答案,但確實存在一些復雜的因素。

我將從基本策略開始:glTF 是一種最后一英里格式,一種 GPU 就緒格式,旨在以最少的麻煩將數據泵入渲染 API。 因此,glTF 對“藝術家資產交換”類型的功能沒有同情心,這些功能對最終用戶客戶來說毫無意義。 在這種情況下,我們有一個哲學的犧牲品:骨頭的長度。

骨骼的起源和方向是眾所周知的。 它們是 glTF 場景層次結構中的(通常是空的)節點,實際上我們只知道當皮膚與關節列表一起出現時,它們才算作“骨骼”,這表明哪些節點實際上是骨骼。 作為 glTF 節點意味着骨骼與其父節點具有已知關系,以變換矩陣的形式,或更可能以節點上的平移、旋轉和縮放參數的形式。 這為您提供了骨骼的原點和方向。 它甚至可以設置動畫,就像任何 glTF 節點都可以應用動畫一樣(但僅在使用 TRS 時,而不是使用矩陣時)。

但是glTF不需要骨骼的長度。 為什么不? 因為為了快速渲染模型,需要的是骨骼對周圍頂點的影響。 這是通過JOINTS_0WEIGHTS_0訪問器(頂點屬性)完成的,因此每個頂點都知道哪些骨骼可以影響它,以及影響程度。 骨骼的“長度”對於藝術家來說是一個有用的可視化參數,但在頂點着色器中不需要計算皮膚的最終位置。 給定的 3D 應用程序可能會使用骨骼長度來幫助計算或設定頂點關節權重,但是一旦計算出這些權重,就可以手動調整和更改它們,而原始骨骼長度則沒有實際意義。

inverseBindMatrix 本質上保持綁定姿勢。 它是骨骼相對於根(不是父)的原始靜止/綁定位置的倒數。 以那個手臂骨骼為例,它有一些非零的 +X 位置。 但是當它以自己的靜止位置坐在那里時,它應該對皮膚基本上沒有影響,它不應該將皮膚從原來的位置拉得更遠+X。 手臂骨骼遠離模型原點的事實使其想要將其他頂點拉得更遠,並且 inverseBindMatrix 可以取消這種效果。 因此,當骨骼靜止時(處於綁定姿勢),骨骼及其 inverseBindMatrix 將完美地相互抵消。 當骨骼開始遠離那個姿勢時,它開始施加影響。

就其價值而言,Blender glTF 導入器有一些花哨的詭計,可以在導入 glTF 時盡力猜測骨骼長度。 但它也導入了原始頂點權重,因此,骨骼長度只是為了美工的視覺利益,它對皮膚沒有影響。

暫無
暫無

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

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