Open Sayamame-beans opened 3 days ago
以下の実装を検討しています 衣装がHumanoid(#429 実装時に行う): ボーンを全て持ってきて一致部分を愚直に探索する 衣装がHumanoidでない: 衣装のHipsボーンに対してボーン名辞書に一致するものを探し、一致したらそれ以外の部分をprefix/suffixとする。既存の処理もその後に残す?
Setup OutfitによりArmature.1にリネームされるなどが発生するため、HumanoidからのGetBoneTransformが機能しなくなると認識しました。 そのため、とりあえずprefix/suffixについてはHumanoidベースの判定を行わないことにします。(報告があったら検討します) ref: https://misskey.niri.la/notes/9y7ezh36qj
従って以下のようにします
当該処理を実装しました。以下に変化する挙動をメモします。 (PRはHumanoid対応と同時に出すつもりですが、リリースタイミングによってはこちらを先出しすることも可能です)
旧: suffixが"s_suffix"であると認識される。 suffixの推定に失敗したので、後ろに続くボーン名変更も失敗する。
新: 衣装側"Hips"は辞書にあるので、suffixは"_suffix"。 suffixの推定に成功したので、後ろに続くボーン名変更に成功し、最終的に衣装側のボーン名が"Hip_suffix"になる。
旧: suffixは空。 suffixの推定に失敗したので後ろに続くボーン名変更も失敗する。("Hip_suffix"のままになる)
新: 衣装側"Hip"は辞書にあるので、suffixは"_suffix"。 推定に成功したので、後ろに続くボーン名変更に成功し、最終的に衣装側のボーン名が"Hips_suffix"になる。
旧: "hips_suffix".IndexOf("Hips", StringComparison.InvariantCulture)
(元の処理)はHipsとhipsを同一視しないため、suffixは空。以下略。
新: "Hips"が辞書にあり、"hips_suffix".IndexOf("Hips", StringComparison.InvariantCultureIgnoreCase)
(辞書使用時の処理)はHipsとhipsを同一視するため、suffixは"_suffix"。以下略。
タイムリーにこの部分が原因で動かなかったand行った実装で動くことが確認できた例がありました。
https://misskey.niri.la/notes/9y8f8g6az7 旧: prefixが検知されず、リネームされない。
新: prefixが検知され、VRoid用のボーン名処理が走る。prefixは"JBip"となり、ボーン名は"J_Bip_hip"に(他のボーンも同様に)リネームされる。
対応までのワークアラウンド: Setup Outfit前に衣装側hipsを"J_Bip_C_hip"にしてもらうと、prefixが検知されるようになるのでSetup Outfitが機能するようになる。
@bdunderscore これ実装すると、 #875 でやったNormalizeNameへのbone_
の追加って不要になりますか? (衣装側の"bone_"prefixを正しく認識出来るようになり、かつアバター側をHumanoidで取得するようになればむしろ邪魔になりますか?)
残しておいた方が良さそう(humanoidを使わない処理が残っていることも加味して) 邪魔にも多分ならなさそう
現在のprefix/suffix判定処理は、アバターと衣装のHipsボーンの名称が一致している場合にIndexOf等を使って取得、となっています。 これにより、アバター側がHip、衣装側がHipsの場合に誤ってsをsuffixとして認識します。
そもそもprefix/suffixが適切に判断されないケースを何度か見かけています。 prefix/suffixの判断は、衣装のボーン名だけで判断するべきな可能性が高いです。(ボーンによって異なる場合はそもそもMAのprefix/suffixを付けても正常に動作しないため。)