Pixal3D で生成した人物に骨格を付け、Blender で歩かせられるかを技術検証したときに、どの骨に従わせるか(スキンウェイト)を頂点の位置から自動で決めました。最初は高さだけで腕・胴・脚を分けたところ、低い位置に垂れた手が脚の骨に割り当てられました。手のほかにも、短パンの裾、上着の裾と鞄、ルートの鉛直方向のずれでつまずきました。

結論

  • 高さだけで分けると、低く垂れた手が脚に付きました。腕の判定には横の位置も使い、胴の高さとは別に決めました。確かめるときは、左右の足が入れ替わった逆の位相の両方で、両手の輪郭を見ました。
  • 短パンの裾を脛に従わせると、短パンが潰れました。短パンは骨盤と太腿に付け、短い脚に合う小さめの歩幅にしました。
  • 上着の裾と鞄が、太腿や腕のウェイトにつられて動きました。太腿のウェイトを混ぜ始める境を上着の裾より下へ下げ、胴だけに従う鞄の範囲を広げました。
  • 小さいウェイトを捨てると、合計が 1 をわずかに下回りました。残したウェイトを頂点ごとに正規化し直し、スキンを付けたメッシュすべてで確かめました。

試した環境

  • 人物 A: 素体・髪・上着・シャツ・ズボン・靴・鞄の 7 つを別々に生成して組んだ、頭身の低いデフォルメの人物(約 273k 三角形)。見るために高密度の形を減らし、身に着けた部品すべてを1つの骨格に付けました
  • 人物 B: 服や鞄まで一体として生成した 2 体(自然な頭身とデフォルメ)。16 関節、1 頂点あたりの影響は最大 4。元のトポロジーとテクスチャはそのままです
  • 生成: TencentARC/Pixal3D。人物 A は trellis.cpp v0.8.1(HIP、gfx1100)で実行。計算機は Radeon RX 7900 XT(VRAM 20 GB)
  • 骨格とウェイトの作業: Blender

試作の骨格は、位置からウェイトを決めた

人物 B では、手作業でウェイトを塗る代わりに、頂点の座標から連続的にウェイトを決め、頂点ごとに合計が 1 になるよう正規化しました。脚は 2 本の骨の IK を解析的に解き、体を支えている足は世界座標で止め、振り出す足には弧を描かせ、骨盤の上下は控えめにしました。腕は脚と逆に振り、肘を少し曲げています。

人物 A でも、頂点の位置から部位を判定してウェイトを決めました。位置からウェイトを決めると、「この頂点はどの部位か」を座標だけで判定することになります。以下の手・短パン・ルート・ウェイトの合計は人物 A で、上着の裾と鞄・靴底は人物 B で起きたことです。

高さだけで分けたら、手が脚に付いた

人物 A では、最初は頂点の高さだけで腕・胴・脚を分けました。すると、低い位置に垂れた手が脚の側に入り、脚の骨に割り当てられました。高さの境だけで分けると、胴より低い所にある物は、手であっても脚として扱われます。

垂れた手首の糸が脚に結ばれてしまっている操り人形と、肩の側から糸を引く手の絵

直し方は、腕の判定に横の位置も使うことです。腕かどうかは、胴の高さとは別に、体の中心から横にどれだけ離れているかも見て決めました。確かめるときは、左右の足が入れ替わった逆の位相のそれぞれで、両手の輪郭を見ました。

次の図は、手と短パンの裾について、割り当て方を変える前と後を並べたものです。

手と短パンの裾の割り当てを直した前後

どちらも、近くにある別の部位の骨に付けてしまったのが原因でした。

短パンの裾は脛に従わせない

人物 A では、短パンの裾の頂点が脛に従うと、短パンが潰れました。短パンは骨盤と太腿に付け、短い脚に合う小さめの歩幅にしました。確かめたのは、逆の踏み出しの両方と、後ろからの見え方です。

上着の裾と鞄が、太腿や腕につられた

一体として生成した人物では、服と鞄も身体と同じメッシュの一部です。ここでは、上着の裾と鞄が太腿や腕のウェイトの影響を受けました。太腿のウェイトを混ぜ始める境を上着の裾より下へ下げ、胴だけに従う鞄の範囲を広げて、正面と横の描画で見直しました。

ルートの鉛直方向のずれは、骨のローカル座標に直して入れる

人物 A では、ルートの骨に世界の鉛直方向のずれを入れました。ところが、骨のローカルな移動の軸は、世界の鉛直と向きが違っていました。世界座標のつもりで入れた値は、別の向きに効いてしまいます。そこで、世界の鉛直方向のずれをルートの骨のローカル座標に変換してから入れるようにしました。

左右で靴底の高さが違った

人物 B では、入力のメッシュで左右の靴底の高さがわずかに違っていました。足首の軌道を左右で別々にし、それぞれの元の靴底の最も低い点のぶんだけ補正しました。確かめた位相では、体を支えている側の靴底の最も低い点が、ほぼ 0 になりました。

ウェイトの合計と接地を確かめる

小さいウェイトを捨てると、頂点ごとの合計が 1 をわずかに下回りました。残したウェイトを頂点ごとに正規化し直し、スキンを付けたメッシュすべてで確かめました。最後に確かめた値は次のとおりです。

確かめたこと人物 A(7 部品)人物 B(一体の 2 体)
ウェイトの合計残したウェイトを頂点ごとに正規化合計の誤差 0.0
1 頂点の影響の数—最大 4
接地歩行の 24 コマで確かめた確かめた姿勢での頂点の最も低い高さ: 自然な頭身 −2.78×10⁻⁸、デフォルメ 2.56×10⁻⁹
見た目逆の踏み出し、横と後ろからのコマ正面と横の 1 コマ目と 9 コマ目

確かめていないこと

  • 空間の位置から決めた試作のウェイトで、手作業のウェイト調整や、きちんとしたリトポロジーの代わりになるとは言えません。
  • 肩・腰・膝の変形には、まだ局所のウェイト調整が要ることがあります。
  • 服や髪の揺れ(二次的なシミュレーション)は入れていません。
  • 端末で動かしたときの負荷は確かめていません。

おわりに

位置からウェイトを決めるなら、高さのほかに横の位置も見ること、服は近くの別の骨に引かれないよう境を置き直すこと、最後に合計と接地を数字で見ること。私たちの試作で効いたのはこの3つでした。

※ Pixal3D・trellis.cpp・Blender の振る舞いは執筆時点の情報です。いまは変わっている可能性があります。