前往
大廳
主題

物理性人物關節係數調整與推薦工具

夏洛爾 | 2022-09-21 18:35:52 | 巴幣 1120 | 人氣 135


經歷了超乎想像的挑戰(如何比較當前關節角度和目標角度,有興趣請見頁面尾端的備註),總算做出來的工具

可以測定關節活動速度,方便客觀調整Spring和Damper
並且會根據Spring和Damper的數值,推薦Maximum Force合適的設定數值

首先避免以往關節速度都是體感判斷
其次最重要的,發現以往Maximum Force都是亂設,大概導致ML很難探索有意義的力量控制範圍,甚至變得難以力量控制

經過工具完整測定與調整後,發現以下有參考價值的資訊

1.首先關節的"重心",在自然情況下為自身所有碰撞框的中心(欲修改可以透過腳本指定)

2.關節活動的速度不受本身質量影響,但會受連結質量(*)總和的影響
(*連結質量: 連到自己身上的質量,例如 Foot的ConnectedBody是Knee,Knee的ConnectedBody是Hip,則Foot和Knee的質量,都會對Hip的活動速度有影響)

3.因此關節合適的Joint Drive設置 (Spring/Damper/Maximum) 極端受重心位置和連結質量影響,因此目前看來還並不存在顯著的設置規律或比例,就是只能根據該人物或關節的情況調整

4.大致來說,推薦從末端(最下位,例如手腕或腳踝)關節開始調整,而越上位Joint Drive數值就需要越高,才能達到同等旋轉速度

5.我的旋轉速度測定工具仍然有失客觀,由於我是用旋轉範圍/所需時間,然而關節活動本質為加速度運動而非等速度運動,因此不同大小的旋轉範圍實際上用平均速度計算可能有失客觀 (能加速的範圍不同),根據需求應考慮將測定期間的關節活動範圍暫時調整為等距

(當旋轉範圍大小不同,活動實為加速+減速運動 ,S = 0.5*a*(T/2)^2*2 ,  avgV=S/T  => avgV = a*T/4  => 平均速度實際上正比於移動時間)
(然而現實人體也是活動範圍更大的關節更容易加速到高速,因此需根據需求選擇)

6.對於連結"數量"越多的關節 (該關節有很多層下位關節),重力的影響越劇烈,以測試工具顯示的數值來看,同Drive數值,正行和逆行重力方向速度落差可以很劇烈,因此推薦要設計關節層次太長的角色評估必須慎重,以Unity Configurable Joint的當前性質來看似乎連結越長就越容易物理上失真和不安定

(用關節舉起一個50kg的肢體,和舉起一個連結5段10kg的肢體,Unity對該關節的模擬會差異劇烈)

6.除非很必要,否則盡可能讓Mass Scale和Connected Mass Scale維持1,不為1的數值會導致動量不守恆,非常容易出現各種物理失真


也因此道爾的關節設置非常沒有參考價值,然而還是紀錄於此
由於道爾右手持劍,差異設置以 (Left / Right)表示

Thigh

Spring: 500000
Damper: 50000
Force: 312500
Speed: 475

Knee

Spring: 200000
Damper: 20000
Force: 112500
Speed: 470

Foot

Spring: 80000
Damper: 5000
Force: 2000
Speed:  464.5

UpperArm

Spring: 600000
Damper: 30000
Force:56250/53125
Speed: 440/479

ForeArm

Spring: 200000
Damper: 20000
Force:52500/51562
Speed: 490/491

Hand

Spring: 70000/70000
Damper: 7000/6000
Force: 15000/15000
Speed: 470/475

Spine

Spring: 900000
Damper: 45000
Force: 150000
Speed: 470

Head

Spring: 70000
Damper: 6500
Force: 15000
Speed: 465

Tail6

Spring: 600000
Damper: 15000
Force: 50000
Speed: 451

Tail4

Spring: 450000
Damper: 10000
Force: 36000
Speed: 470

Tail2

Spring: 200000
Damper: 13000
Force: 15000
Speed: 470

Tail0

Spring: 100000
Damper: 5000
Force: 5000
Speed: 488

Tail H

Spring: 50000
Damper: 5500
Force: 8000
Speed: 433


備註:
Joint.TargetRotation是在Joint Axis Space的旋轉量,要比較一個Joint當前旋轉量與其TargetRotation的關係 (例如用來計算速度或是進度),必須將TargetRotation從Joint Axis Space換算至World Space,或是將joint.transform.rotation從World Space換算至Joint Axis Space

由於Unity沒有提供此API,並且網路上完全查無相關資料,最後是還隱藏了沒視覺化難以察覺的旋轉鏡像,所以花了三天在算Quaternion的數學並研究此機制,是一個漫長的旅程=口=

關於實現方法詳情請見

創作回應

inkhorse
看不懂但是先給gp再說!!
2022-09-23 18:40:06
夏洛爾
感謝你,你人真好
2022-09-23 22:10:19

更多創作