• 日本語
  • スケール継承をオフにしたボーンが想定外の動きをします。

スケール継承をオフにした場合の処理について質問させてください。

Aのアーム、Bのアームのスケール変化についてです。
アームのスケール変化をロボットの手に影響させないため、全てのボーンのスケール継承をオフにしています。
BのボーンにはIKが設定されています。IKオプションは圧縮とストレッチにチェックを入れています。
Bのボーンには土台のボーンに対するトランスフォーム・コンストレイトが設定されており、それを使ってBのボーンのトランスレートは土台のボーンに向けて移動させました。
すると、本来スケール継承をオフにしたため変わらないはずのBのスケールが変化するようになりました。
Aのスケールは継承されないはずなのですが、トランスフォーム・コンストレイトにわずかでも数値が入るとスケールの継承が復活しているようです。

verは4.1.08Proです。Spineのデータも添付しています。
この問題を避け、スケール継承設定が変わらない方法があればお教えいただけると助かります。よろしくお願いします。

Related Discussions
...
  • Modificato

こんにちは、具体的なSpineプロジェクトを添付していただきありがとうございます!
ひとまず解決法としましては、B_Arm_IKのミックスを0にした状態でのB_Armの回転角度を0にすると直るようです。以下は実際に試した際の動画です。

ただ、なぜB_Armの元々の回転角度が影響するか、その理由については少々確認のお時間をいただけますと幸いです。
分かり次第またこちらのスレッドに返信させていただきます。


もう一つ解決策として、B_Armの回転の継承をオフにすると解決するようです。いずれにせよ回転の値が影響を与えているようですが、原因の詳しい説明については今しばらくお待ちください。

動画付きでの詳しい解説ありがとうございます!
IKを設定する段階でのボーン角度のズレに関しては盲点でした、教えていただいた二つの解決策を問題が起きたスケルトンにも試してみます。
お手数おかけしますが、この問題の詳細な原因が解明しましたらまたご返信頂けますよう、どうぞよろしくお願い致します。

回答をお待たせしてしまい申し訳ありません。
調査の結果、トランスフォームコンストレイントとIKコンストレイントの2つのコンストレイントを適用する場合、まず最初のコンストレイントがワールドトランスフォームを変更し、BoneのupdateAppliedTransformメソッドを呼び出しますが、ここで無効な継承が考慮されていないという問題があることが分かりました。そのため、2番目に適用されるコンストレイント(今回の例ではIKコンストレイント)が計算ミスのあるトランスフォームを適用してしまい、誤った結果を生み出してしまうということでした。
そして残念ながら、この問題は影響範囲が広く、バージョン4.1のパッチアップデートで修正するにはリスクが高すぎるため、4.2-betaにて修正を行わせていただきました。修正されたコードは以下のコミットでご確認いただけます。
https://github.com/EsotericSoftware/spine-runtimes/commit/efb015ef4eb89f2b1cf205e469cc311632d7217c
(申し訳ありませんが、Spineエディターの4.2-betaはまだリリースしておりません。)

また、改めましてこの問題の回避方法につきまして、先日「回転の値を直すか継承を無効にすることで修正可能」とお伝えしましたが、この方法では親ボーンが回転した場合にまた同様の不具合が発生する可能性があるため、バージョン4.1での最も安全な回避方法は「継承の無効化を使用する場合には使用するコンストレイントを1つだけにする」こととなります。
ご不便をおかけしてしまい申し訳ありませんが、何卒ご理解いただけますと幸いです。

想像以上にお早い回答を頂けて助かります!
問題の原因、また修正内容と修正タイミングの理由についても簡潔かつ具体的な説明を頂けたお陰で素人の私でもすぐに理解できました。
バージョン4.2では修正されているとのことで安心しました、リリースを待ちつつ新たなコンストレイントの使用については少し制限してみます。
詳しく調査して頂き本当にありがとうございました!

ご返信いただきありがとうございます!あらかじめ問題の再現が可能なSpineプロジェクトをご用意いただいていたおかげで早期に原因を突き止めることができました。詳細なご質問をいただき誠にありがとうございました。
また何か気になった点や不具合と思われる挙動がありましたらぜひこちらのフォーラムへご投稿いただけますと幸いです。
今後ともSpineをよろしくお願いいたします。