こんにちは! トイロジックでキャラモデラーをやっているあおきしと申します。
本記事では開発中に実際に発生した【ウェイトの付いたモデルをUE4にインポートするとウェイト数値が変わる件】についての解説をなるべく難しい言葉を使わずに行いたいと思います。

あれ・・・ウェイトが変わってる!?

それはキャラの眉毛のウェイトを綺麗にしていた時に起こりました。ウェイトの作業が完了し、UE4にインポートしてMAYAと同じ表情をとらせて確認したところ

株式会社スクウェア・エニックスより発売された『FOAMSTARS』より

あれ?おなじ表情なのにUE4のほうは眉毛がガタガタになってる!?
疑問に思い、UE4のモデルをエクスポートして該当の頂点のウェイトを見てみると・・・

ウェイトが変わってる!!
 

ウェイトが変わる仕組み

なぜこうなってしまうのか検証用のモデルを使用して解説します。
以下のような1つの頂点にそれぞれ0.125ずつ8つのジョイントにウェイトを振ったモデルで用意します。

これを一度UE4へインポートしてエクスポートしたモデルと見比べてみましょう

やっぱりウェイトが変わっていますね。なぜ変わってしまうのでしょうか?

実はこれはUE4の仕様が関わっています。簡単に説明すると、UE4へモデルをインポートするとウェイト値が0~255の整数に変換されてしまうのです!(整数とは小数点を含まない数字です。)

いったん実際にインポートしたと仮定して、0.125を0~255の整数に変換してみましょう!変換するには単純に255を掛け算すれば大丈夫です。

0.125 × 255 = 31.875

UE4ではこの数値を整数にするため、小数点0.875を切り捨てて31にします。ここで今度はこの31を0~1の数値に変換してみましょう。(UE4からモデルをMAYAへエクスポートするイメージ)

今度は先ほどとは逆で255で割り算をしましょう。

031 ÷ 255 = 0.1216 (小数点第五位で四捨五入)

お!先ほどのエクスポート後のjoint2以降の数値と一致していますね。しかし、joint1のみ0.1490になっているのはなぜでしょう?

 

帳尻合わせ

通常ウェイトはすべてのウェイト値を合算して1に、0~255の数値の場合は合算した数が255にならないといけません。

しかし先ほど0.125を0~255の整数に変換した時に出力された値は31.875となっており、0.875を切り捨てていました。そのためウェイトが合算しても248にしかならず7足りなくなってしまったのです。

不足した数値を埋め合わせるために、UE4では一番最初のジョイントのウェイトに足りない分を加算して補完します。

これで最初のジョイントだけ38、それ以外は31というウェイトになりました。
これを0~1の数値に変換すると・・・

38 ÷ 255 = 0.1490

31 ÷ 255 = 0.1216

となり、最初のUE4からエクスポートしたモデルのウェイトと一致しました!!
UE4内部ではこんな処理が行われていたのですね!

 

対策

正直ウェイトが変わってしまうのはUE4の仕様上、根本的に治すとなるとなかなか難しそうです・・・対策としては以下のような対策が考えられます。
 

【対策1】インフルエンス数を多くしすぎない

インフルエンス数が多ければ多いほどウェイト値を0~255の整数に変換した時の小数切り捨てが発生することとなり、その分最初のジョイントのウェイトに加算されてしまいますので結果的にウェイトが大きく変わる可能性が高まります。
 

【対策2】UE5を使う

UE5では今回のように大きくウェイトが変わることはありません。以下画像は同じようにUE5にインポートしてエクスポートしたモデルです。
ほとんど変化していないことがわかりますね!


 

最後に

いかがでしたでしょうか?実際、ウェイトが変わってしまっても大体はほとんどわからないことが多いためいったん割り切って受け入れた上で、どうしても目立つ部分は調整しなおすとしても良いかもしれませんね!

皆様のゲーム開発に少しでも貢献できましたら幸いです。以上、あおきしでした!

 

著者紹介 あおきし
2021年にトイロジックに中途入社後、株式会社スクウェア・エニックスより発売された『FOAMSTARS(フォームスターズ)』の開発に携わる。ゲーム開発自体が好きなので、役立ちそうなことを幅広く勉強中。