bdunderscore / modular-avatar

Other
482 stars 65 forks source link

prefix/suffixの判定処理が適当でない #1151

Open Sayamame-beans opened 3 days ago

Sayamame-beans commented 3 days ago

現在のprefix/suffix判定処理は、アバターと衣装のHipsボーンの名称が一致している場合にIndexOf等を使って取得、となっています。 これにより、アバター側がHip、衣装側がHipsの場合に誤ってsをsuffixとして認識します。

そもそもprefix/suffixが適切に判断されないケースを何度か見かけています。 prefix/suffixの判断は、衣装のボーン名だけで判断するべきな可能性が高いです。(ボーンによって異なる場合はそもそもMAのprefix/suffixを付けても正常に動作しないため。)

Sayamame-beans commented 3 days ago

以下の実装を検討しています 衣装がHumanoid(#429 実装時に行う): ボーンを全て持ってきて一致部分を愚直に探索する 衣装がHumanoidでない: 衣装のHipsボーンに対してボーン名辞書に一致するものを探し、一致したらそれ以外の部分をprefix/suffixとする。既存の処理もその後に残す?

Sayamame-beans commented 3 days ago

Setup OutfitによりArmature.1にリネームされるなどが発生するため、HumanoidからのGetBoneTransformが機能しなくなると認識しました。 そのため、とりあえずprefix/suffixについてはHumanoidベースの判定を行わないことにします。(報告があったら検討します) ref: https://misskey.niri.la/notes/9y7ezh36qj

従って以下のようにします

Sayamame-beans commented 2 days ago

当該処理を実装しました。以下に変化する挙動をメモします。 (PRはHumanoid対応と同時に出すつもりですが、リリースタイミングによってはこちらを先出しすることも可能です)

アバター側が"Hip"、衣装側が"Hips_suffix"の場合

旧: suffixが"s_suffix"であると認識される。 suffixの推定に失敗したので、後ろに続くボーン名変更も失敗する。

新: 衣装側"Hips"は辞書にあるので、suffixは"_suffix"。 suffixの推定に成功したので、後ろに続くボーン名変更に成功し、最終的に衣装側のボーン名が"Hip_suffix"になる。

アバター側が"Hips"、衣装側が"Hip_suffix"の場合

旧: suffixは空。 suffixの推定に失敗したので後ろに続くボーン名変更も失敗する。("Hip_suffix"のままになる)

新: 衣装側"Hip"は辞書にあるので、suffixは"_suffix"。 推定に成功したので、後ろに続くボーン名変更に成功し、最終的に衣装側のボーン名が"Hips_suffix"になる。

アバター側が"Hips"、衣装側が"hips_suffix"の場合

旧: "hips_suffix".IndexOf("Hips", StringComparison.InvariantCulture)(元の処理)はHipsとhipsを同一視しないため、suffixは空。以下略。

新: "Hips"が辞書にあり、"hips_suffix".IndexOf("Hips", StringComparison.InvariantCultureIgnoreCase)(辞書使用時の処理)はHipsとhipsを同一視するため、suffixは"_suffix"。以下略。

Sayamame-beans commented 2 days ago

タイムリーにこの部分が原因で動かなかったand行った実装で動くことが確認できた例がありました。

アバター側が"hip"、衣装側が"J_Bip_C_Hips"

https://misskey.niri.la/notes/9y8f8g6az7 旧: prefixが検知されず、リネームされない。

新: prefixが検知され、VRoid用のボーン名処理が走る。prefixは"JBip"となり、ボーン名は"J_Bip_hip"に(他のボーンも同様に)リネームされる。

対応までのワークアラウンド: Setup Outfit前に衣装側hipsを"J_Bip_C_hip"にしてもらうと、prefixが検知されるようになるのでSetup Outfitが機能するようになる。

Sayamame-beans commented 2 days ago

@bdunderscore これ実装すると、 #875 でやったNormalizeNameへのbone_の追加って不要になりますか? (衣装側の"bone_"prefixを正しく認識出来るようになり、かつアバター側をHumanoidで取得するようになればむしろ邪魔になりますか?)

Sayamame-beans commented 2 days ago

残しておいた方が良さそう(humanoidを使わない処理が残っていることも加味して) 邪魔にも多分ならなさそう