用胯!論Openpose轉Unity.humanoid一種方案(二)
在上一篇中,我們已經(jīng)從openpose的單張2d數(shù)據(jù)

對應到了每個skin.bones[i]的transform。

接下來就是怎樣設置這些transform。
第一種:直接設置RTS(錯誤)
? ?這種想法簡單直接,結果變成這樣

從圖中的紅點,其實是可以看出我們確實設置對了位置,但是原模型本來就有大小,縮放,肯定與2d測算匹配不上。我們要設置,且能設置的,只有骨骼的旋轉。
第二種:用胯!從Hip設置Rotation軸方向(可行)
? ? 只設置rotation,怎樣設?從哪里開始設?
? ? 其實這和我們自身運動的物理屬性一致。一般來說重心落在Hip處,hip這個東西不能簡單看機器翻譯成臀部,根據(jù)實際情況會在會陰,檔下,陰部,腹部下方,或者尾椎骨范圍那一個點。實際上跟hip一些武術里說的“胯”概念類似,不是butt,而是你全身運動的一個基點。所以游戲開發(fā)常用的骨骼都以hip為根節(jié)點,然后以這樣一個“流向”向末端傳導:

可以看作是一個從hip開始,對rotation的FK(前向動力學)傳導。我們后面的代碼也是基于這個流向。
PS:用胯!
? ? 一些武術里說“力始于足,發(fā)于腿,主宰于腰”。上面這個流向,就是“主宰于腰”,這個“腰”又是一個虛詞,和“胯”一個意思,就是hip。“主宰”就是你調(diào)整姿勢的時候,是從hip開始節(jié)節(jié)傳導至末端的。
? ? “力始于足”,硬要解釋,就是重力的反作用力在腳底,我們平時走路的時候,就是一個基于足底的IK(反向動力學),它的傳導是這樣的:

? ? 我用紅白兩色表明不同于“主宰于腰”,普通人在FK的時候不會太注重左右分別(實際上有意識地進行肌肉收縮,F(xiàn)K也可以有更多的可能性);而走路IK不一樣,左右兩力明顯不一樣,普通人也感受明顯。這就是為什么我們走路會容易摔倒,而調(diào)整姿勢的動作卻不會讓我們摔倒,因為力不“合”。綠框中是由“胯”到“中臺”的力傳導,實際上不一定是簡單的垂直向上,也可能是交叉?zhèn)鲗В挥捎趥鞯健爸信_”的情況比較復雜,到手上也就不一樣了,不過大體上還是從Shoulder到Hand這一路下來。
? ? 至于“發(fā)于腿”,因為目前主流游戲引擎沒有肌肉系統(tǒng),所以也不好驗證。不過很明顯,腳上又沒肌肉,支撐你整個人站住的是腿部的肌肉,腿軟了也就站不住了;根據(jù)上面流向圖,你也應該知道“力發(fā)于腿”的合理性。以后有機會Houdini之類的可以試試。
調(diào)整軸向對應
? ? 我發(fā)現(xiàn)對于每一個骨骼,它的“流向方向”對應的軸也不太一樣,xyz正負都有,這個可能是制作規(guī)范上各有各的想法:

所以在每個openID后面,加一個流向對應;如果遇到了不同制作規(guī)范的骨骼,改后面的就行:

最后,我們終于可以進行基于hip的對旋轉的FK了:


由于缺少深度信息,所以腳趾頭有手動處理,還有前后關系上有待處理。有些細節(jié)處理就不說了,之前的文章也有提到。
AI轉深度圖后可能可以優(yōu)化前后關系等。這個之后可以嘗試。
就這么多,謝謝。