BlenderとUnityで作ったものをVR(Meta Quest/Oculus Link)で動かします

ブログの女の子を作る #94 ひざを二重関節とUnityのConstraintで修正する【Blender,Unity】

 
前回は、ボーンコンストレイントと補助ボーンを使って股関節を修正しました。お尻が丸くなって良かったです。
 
今回は、体育座りやしゃがみ座りをする時に膝を大きく曲げると関節がつぶれるのを修正します。
 
(1) 補助ボーン
(2) 二重関節+操作用ハンドルボーン
(3) 二重関節+ボーンの親を変える(ひざとすねの親が太もも)
の3パターンを試した結果、最終的には「(3)の方法」を使いました。
 
これでしゃがみ座りができます!
今回も記事が長くなりました。。



開発環境

・Blender 3.0.0
・CPU:AMD Ryzen 7 3700X
・グラボ:ASUS ROG-STRIX-RTX2060S-O8G-GAMING
 

(1) 現状を確認する

まずは、いまのひざのボーン状態を確認しておきましょう。
 

作業前のすがた

今の状態です。
ひざからすねにかけて、ボーンを1本だけ入れています。
 
90度くらいなら曲げても大丈夫ですが、
 
更に曲げると、ひざの皿部分が薄くなってしまいます。
本来はここには骨がありますので、もう少し盛り上がりが欲しい。
 


(2) 試してみる1:補助ボーンを入れる

まずは、股関節と同じように「補助ボーン」を入れてみます。
 

ひざから補助ボーン入れる

ひざから前方に向かって、補助ボーンを1本入れてみます。
 
この状態でウェイトを入れて、ひざを曲げてみます。
 
この角度まで曲げても、膝部分が分厚くなってますね。
期待大です。
 

ウェイトで確認する

各ボーンのウェイトを確認しておきます。
 
太もも前面の補助ボーンと
 
すね部分のボーンですね。
 
このボーンの間を先ほど追加した補助ボーンで対応することになります。
良い感じですね。
 

軸がずれている?

補助ボーンを動かしていると、
 
Y・Z軸だけでなく、X軸方向にも動いていることに気づきました。
こういう使い方をする場合もありますが、今回はX軸方向には動いて欲しくありません。
 
オブジェクトデータプロパティ -> ビューポート表示 -> 座標軸」にチェックを入れて、ボーンの座標軸を表示してみました。
なんかたくさん座標軸が表示されました。これはボーンが個別に座標軸を持っているということでしょうね。
 

軸のズレを修正する

ボーンのトランスフォームを確認してみると、ロールの角度が45度になってました。
 
キリが良い数値にも見えますが、画面上の見た目ではボーン軸が垂直/水平でないので、とりあえず68度くらいにしてみます。
まっすぐですね。
 
これでX軸方向に動かなくなりました。
 

補助ボーンを2本にしてみる

いまの状態で、体育座りをしてみます。
なんか違和感がありますね。バランスが悪い?
 
ひざ部分は良い気がしますが、少し鋭角気味。
もう少し盛り上がりが欲しいところです。
 
試しに補助ボーンを2本にしてみました。
 
この状態でひざを曲げていきます。
 
さっきよりはマシ?程度です。
 
極端な例ですが、かかとがお尻に付くくらいまでひざを曲げてみました。
すね部分のめり込みがひどいですね。太ももとすねは1軸でつながってるので当たり前なんですが。。
 

(3) 座った姿勢のためのボーン・メッシュ調整

今回も時間がかかるような気がしてきました。
関節は難しい。
 

すねが長すぎ問題

体育座りやしゃがみ座りを試している時、やけにすね部分が長いことに気づきました。さきほどの違和感はこれが原因っぽい。
 
三面図と比較してみます。
 
いまの3Dモデルを比べてみると、やはりひざ部分を少し上側に作り過ぎたようです。
気づきませんでしたよ。。。
 
プロポーショナル編集でひざ付近を上に持ち上げます。
 
この辺りでしょうか。
 

ボーンの位置も下げる

メッシュの位置に合わせて、ボーン位置も修正しておきましょう。
 
この辺りでOKですね。
 

バランスが良くなった!

再度、体育座りをしてみます。
バランスが良くなった気がします。
やはりこれくらいの長さが良いですね。ポーズも取らせやすくなりましたし。
 
ひざも良い感じです。
 

しゃがみ座りでは微妙…

ですが、しゃがみ座りをさせてみると、
 
さきほどのめり込みが発生してました。
惜しい。
 


(4) 試してみる2:二重関節で操作用ハンドルを入れる

補助ボーンだけでは対応できなさそうなので、別の方法を探ります。
 
ネットを調べてみると「二重関節」というものを使うと大きく曲げた場合にも破綻しにくいらしい。
さっそく試してみます。
 

二重関節でめり込みすぎを防ぐ

確かに作業している時も、ひざ部分の関節が、
 
こんな感じでずれていれば良いのに、とは思ってました。
これを実現するのが二重関節らしい。
 

ひざボーンとすねボーンに分ける

ひざ用に小さいボーンを追加して、ボーンコンストレイントを追加しておきます。
 
すねボーンを動かすと二重関節で良い感じに動く!はずですが、なんかおかしい。
 
すねボーンの親を間違えてましたね。親をひざボーンに変更します。
 
この状態ですねボーンを動かしてみると、良い感じに二重関節が動作しました!
 

Blenderの挙動が何かおかしい?

二重関節自体は良い感じになったのですが、この設定にしてからBlenderの挙動が何かおかしい。
 
ポーズモードでポーズをリセットしたい時、「ユーザーのトランスフォームをクリア」を実行するんですが、一回実行しただけでは半分くらいしかポーズが戻りません。
 
ふつうは一回の実行で最初のTポーズに戻るんですが。。
 
4,5回実行してやっと元に戻りました。
わけが分かりません。。。
いまのところ困るのはこれくらいですが、怪しいですので別の方法を探ることにしました。
 

ハンドル型にしてみる

「動かすボーンの親にボーンコンストレイントが入っているとおかしくなる?」可能性を考えて、ひざボーンとすねボーンとは別にそれらを動かす「操作用のハンドルボーン」を入れることにしました。
こんな感じですね。
 
見た目は「修正その1」で試した補助ボーンに近いですが、このハンドルボーンにはボーンコンストレイントは入っていません。その代わりに、ひざボーンとすねボーンにボーンコンストレイントを入れてます。
 
ハンドルボーンを動かしてみると、
 
ちゃんと二重関節として動作します。
 
例の「Blenderの変な挙動」も無くなりました!
 

Unityでエラーが出た

これで解決だと思ってたのですが、試しにUnity側にインポートしてみると、キャラクターのRig設定でエラーが出てました。
「Left Foot Transform ‘UpperFoot_L’ is not a child of Left Lower Leg Transform ‘LowerLeg_L’」なので、「UpperFoot_L は LowerLeg_L の子ではありません」でしょうね。
ひざから下の動きを操作するのは「ハンドルボーン」なのですが、ハンドルボーンの下にはボーンが存在しない、のが原因っぽい。
 

(5) 試してみる3:二重関節でボーンコンストレイントの位置を変える

困りました。
 
二重関節の方向性自体は良いですので、ハンドル方式は止めるとして別の方法を探ります。
 

ボーンコンストレイントの位置を変えて見る

先ほどは「ひざボーンにボーンコンストレイントを入れて、すねボーンを動かす」でしたが、試しに逆にしてみます。
 
ひざボーンのボーンコンストレイントを削除して、
 
すねボーンにボーンコンストレイントを設定します。
 
この状態でひざボーンを動かすと、
 
良い感じに動きました!
しかも「Blenderの変な挙動」もありません。
 

Unityで試す

Unityにインポートしてみます。
先ほどはRigエラーが出てたので、今回やっと正しくインポートできました。何気にUnityで表示するのは久しぶりな気がしますよ。
 
とりあえずPlayボタンで動かして見ると、なんかスカートがおかしい。
 
これまでの作業で3Dモデルのボーンやメッシュをいろいろと修正したので、Magica Cloth側でエラーが出ていました。
Createボタンを押して、新しい3Dモデルの状態で設定しなおしておきましょう。
 

太ももがめり込む?

作業用に、体操服に変更してみると何かがおかしい。
 
太ももがめり込んでる感じです。
 
Rig設定がおかしいかと思いましたがエラーは出てませんでした。
めり込み問題とは関係ないとは思いますが、Lower Legに「すねボーン」を設定しておきました。設定的にはこれが正しい(はず)。
 
試しにPlayボタンで動かして見ると、めり込みが消えました。
 
ですが、Playモードを終了すると、めり込んだ状態に戻ります。
???
 
いまの3Dモデルは「プレハブバリアント」という機能を使って、Unity の Hierarchy に登録してます。
 
想像にはなりますが、これまでの作業でボーンを追加したり修正した結果が「プレハブバリアントを使った3Dモデル」に正しく反映されていない気がしました。
 

prefabを入れ直す

試しに、プレハブバリアント経由ではなく、普通のプレハブをProject一覧から入れ直してみました。
左が入れ直したもの。やはりめり込みは発生してませんね。
 
となると、これまで設定してきた「3Dモデルのオブジェクト」は破棄して、先ほど入れ直したPrefabにMagica Clothやスクリプト一式をコピーする必要がありそうです。かなり面倒ですが、仕方ありませんね。。。
 
とりあえず、最低限の設定として「髪の毛とコライダー設定」だけでもやっておきましょう。
髪の毛が固いのは違和感ありますので。
 
Magica Clothのオブジェクトを新オブジェクト側にコピーできたのは助かりましたよ。
イチから設定しなおすのはさすがにつらいので。。
 
コライダーオブジェクトも新側にコピーしたあと、位置を変更すれば完了です。
こんな感じでコピーを使えばなんとかなりそう。。。
 
柔らか金髪ロングツインテールになりました。
 

Unity側でRotation Constraintを設定する

作業を再開しましょう。
 
Unity側では、すねボーンに「Rotation Constraint」を入れて、Blender側と同じように設定しておきます。
 
こんな感じですね。
 
この設定をする時の注意点があります。
 
私の環境だけかも知れませんが、Costraint Settingsの Lock は最後にチェックを入れた方が良いです。
先に入れてしまうと、デフォルト状態(Sourcesで設定したボーンが動いていない状態)で、Transformの値が変わってしまうことがありました。
 
ですので、以下の順序で設定してます。
1. 「Add Component」で Rotation Constraint を追加する。
2. 「Is Active」にチェックを入れる。
3. 「Weight」の数値を設定する。
4. 「Sources」にターゲットとなるボーンを設定する。
5. 最後に「Lock」にチェックを入れる。
 

Unity側では動かない!

Rotation Constraint を設定後、ひざボーンを動かしてみますが、すねボーンの Rotation Constraint が動きません!
 
Transform の Rotation の値を見てみると、0のままでした。
Blender側はこの設定で動いたのに、なぜかUnity側では動いてくれないようです。
なぜだ。。。
 


(6) 試してみる3:二重関節でUnity用に親を変える

困りました。。
 
二重関節に関する情報は意外と少ないんですよ。
二重関節を使わなくても別の良い方法があるんですかね。。。
 

すごい方法があった

それでも探して見ると、前回の記事で紹介させていただいたところに答えがありました。
最初に見た時は仕組みが良く分からなくて飛ばしていた部分でした。今なら分かりますよ。。。
 
いつもお世話になっている「dskjal」様の記事でしたね。
素晴らしい方法ですね。というかスゴイ!
ツイートされていた方も含め、ありがとうございました!!
 
この記事がなかったら、Unityでのひざの二重関節をあきらめるところでした。
 

設定1. Blender側で「すねボーンの親」を変える

いまのボーン設定です。
・太ももボーン(UpperLeg_L)
 ・ひざボーン(LowerLeg_knee_L) ※親は太ももボーン
  ・すねボーン(LowerLeg_shin_L) ※親はひざボーン
になってます。
 
これを以下のように変えます。
・太ももボーン(UpperLeg_L)
 ・ひざボーン(LowerLeg_knee_L) ※親は太ももボーン
 ・すねボーン(LowerLeg_shin_L) ※親は太ももボーン
すねボーンの親を「ひざボーン → 太ももボーン」に変えただけですね。
 
この状態で動かすとおかしな状態になりますが、問題ありません。
 
 
FBXファイルにエクスポートします。
エクスポート時は参考記事にもあったように「リーフボーン追加」にチェックが入っていることを確認しておきましょう。
 

設定2. Unity側でPosition Constraintも追加する

Unity側にFBXファイルをインポートして、以下の設定をしていきます。
 
まず、
・「ひざボーン(LowerLeg_knee_L)」に Rotation Constraint を追加
・Soucesに「すねボーン(LowerLeg_shin_L)」を設定
します。
 
次に、
・「すねボーン(LowerLeg_shin_L)」に Position Constraint を追加
・Sourcesに「ひざボーンの end(LowerLeg_knee_L_end)」を設定
します。
これがポイントのようですね。それぞれの設定で、回転と位置を制御するらしい。
 

Unityでも二重関節が動いた!

この状態で「すねボーン」を動かしてみると、ちゃんと二重関節が動きました!!
 
更に曲げても良い感じです。
 
二重関節のおかげで、ひざの丸みが保たれているのが分かります。
素晴らしい!!
 

(7) 両ひざに入れて動作確認する

両方のひざに同じ設定を入れて、動作確認してみます。
 

しゃがみ座り

まずはしゃがみ座りです。
 
ひざがほぼ180度曲がってる状態ですが、丸みを保ちつつ、ふくらはぎへのめり込みも抑えられています。
 
二重関節を入れる前はこんな感じで角ばってました。
かなり効果があったようですね。
 
今回の記事とは関係ないですが、前回の記事で設定した「股関節の補助ボーン」のおかげで、しゃがみ座りでもお尻は丸くなってますよ。
 
参考までに、Blender側のポーズモードでのしゃがみ座りです。
同じく問題ありません。
 
なお、記事最後に書いてますが、Blender側で二重関節を使う場合は親を変更する必要がありますので要注意です!
 

体育座り

次に体育座りです。
 
ちゃんと膝も丸くなってます。
 
いまの3Dモデルの体形では、やや窮屈な体育座りになってますが。。
 
Blender側での体育座りです。
こちらは自分で作ったポーズなので自然な感じにできてます。
 
関節が良くなってくると、ポーズやモーションを作る幅が広がりそうですね。
最近、Cascadeur というものを使うと自然なモーションが作れると聞きました。
早く試してみたい。
 

横座り

横座りです。
 
問題なさそうですね。
 
修正前はこんな感じでした。
右ひざが角ばってましたね。
 

その他のポーズ

躍動感あります。
 
キックのポーズ。
 
後ろから見ても大丈夫でした。
 

Blender側で動かす時は親を変える

「しゃがみ座り」のところで書いた注意事項です。
 
今回の記事で書いた方法では、Blender側とUnity側でボーンの親設定が異なります
 
ですので、Blenderのポーズモードなどでひざを動かす場合は、再度「すねボーンの親を変更」する必要があります。
 
こんな感じですね。
 
これで、ポーズモードでも二重関節が正しく動くようになりました。
 
ちなみにですが、「Blender側で設定したボーンコンストレイント設定」はUnity側にはエクスポートされませんので、変更が必要なのは「ボーンの親だけ」ですよ。
 
万が一、この状態(Blender用のボーン設定)でUnityにエクスポートしてしまうと、正しく動かないのでお気をつけて。
足が伸びて地面にめり込んでます。
 
こうなった場合、Rotationなどのスクリプトをいったんオフにして、ボーンのTransformを「Revert」で元に戻しておきましょう。その後、正しいボーン設定にしたFBXをインポートしなおせば大丈夫です。
 
私の場合、Blender側でポーズ設定することは少ないですので、常に「Unity用のボーン設定」にしてます。
 


まとめ 

体育座りやしゃがみ座りをする時に膝を大きく曲げると関節がつぶれるのを二重関節で修正しました。
 
試行錯誤の繰り返しで一時期はどうなることかと思いましたが、良い方法が見つかって良かったですよ。
 
次はひじと手首を修正します。
 
スポンサーリンク

コメント

  • トラックバックは利用できません。

  • コメント (0)

  1. この記事へのコメントはありません。

ブログの女の子を作る #93 股関節をボーンコンストレイントと補助ボーンで修正する【Blender】

ブログの女の子を作る #95 ひじと手首のねじれ過ぎ問題を補助ボーンで修正する【Blender,Unity】


最近のコメント

だーしゅ
IT関係のお仕事してます。
3Dモデルの女の子は「ブログノ・スージー」。VRは楽しいですね。

[当ブログについて]