はじめに
Vtuberが流行ってだいぶ経ってしまいましたが、最近今さらながらBlenderでの3Dキャラクターモデル作りにはまっています。せっかくスカートをモデリングしてもカチコチの剛体だと流石にアレなので、Blenderの物理シミュレーションを使ってみたいですよね。
今回は、その作業を一部自動化するときに使ったスクリプトについて書いていきたいと思います。
なお、こちらの記事は以前別の場所で公開していたものを移植してきたものです。
目的
クロスシミュレーションが適用されているメッシュがあったとき、そのメッシュの変形に追従するようなボーンを自動で設定する。
補足
そもそもなんでクロスシミュレーションに追従するボーンが必要なんじゃ、という話ですが、例えば:
- クロスシミュレーションの結果をボーンのアニメーションに変換してBlender以外のソフトに出力する。
- 同じクロスシミュレーションの結果を複数のオブジェクト(二重のスカートとか)に反映させる。
というような使い道があると思います。(私のケースでは後者でした。)
参考にしたサイト
https://dskjal.com/blender/skirt-setup-script.html
実際にやろうとしていることはこちらで紹介されているスクリプトと同様のタスクです。 ただこちらはBlender 2.7時点で開発されていたものらしく、Blender 2.8での使い方がよくわかりませんでした。
そこで今回は勉強もかねて、こちらのサイトで紹介されているプロセスを自動化する方針で実装しました。
コード
https://github.com/kosuke1701/add-skirt-bones
使い方
1. クロスシミュレーションを適用するメッシュを作成する。
今回のスクリプトでは以下のような円柱状の四角ポリゴンからなるメッシュを想定しています。(以後このメッシュをクロスメッシュと呼びます。) このメッシュには既にクロスシミュレーションの設定がされているものとします。
2. パラメータを設定する
skirt_bones.py
のパラメータを直接編集します。(パネルとかでもっとかっこよくできるとは思いますが、現状はこれで…)
パラメータは8~12行目のもので、それぞれ以下のような意味があります。
パラメータ名 | 役割 |
---|---|
N_STEP_HORI | クロスメッシュの列(上下方向のエッジ)のうち、実際にボーンを設定する間隔 |
N_STEP_VERT | クロスメッシュの列(水平方向のエッジループ)のうち、実際にボーンを設定する間隔 |
UPPER_DIR | クロスメッシュの上方向。(クロスメッシュは、各列のうち最も上にある頂点が固定されるものと仮定しています。) |
COL_NAME | 大量のEmptyオブジェクトが生成されるため、それらをまとめておくCollection名 |
HEAD_NAME | ボーンやEmpty、アーマチュアの名前に利用される文字列 |
最初の2つのパラメータは、クロスメッシュの全エッジにボーンを設定するとボーン数が多くなりすぎてしまうような場合に、間を間引きする目的で設定しています。
また3つ目のUPPER_DIR
をデフォルトのZ方向でなくX,Y方向とすることで、スカートだけでなく袖などにも同じスクリプトを利用することができます。
3. スクリプトの実行
クロスメッシュをObject Modeで選択している状態でskirt_bones.py
を実行します。
(Text EditorビューのTextメニューからスクリプトを開き、同じくTextメニューのRun Scriptから実行できます)
実行すると、以下のようにクロスメッシュのエッジに沿ってボーンが作成されます。
実際にクロスシミュレーションを実行すると、以下のようにクロスメッシュの動きにボーンが追従することを確認することができます。
4. 設定されたボーンを使ってモデルを動かす
実際に作成されたボーンを使ってスカートモデルを動かすあたりの作業については、こちらのサイトが参考になると思います。
https://aobayu.hatenablog.com/entry/2019/03/20/111212
おわりに
BlenderでPythonスクリプトを動かすのは初めての経験だったため、勝手がわからずコーディングにはかなり苦労しました。(その結果がスクリプトの汚さにも反映されています…)
ただこの処理を自動化したおかげで、スカートに対し行った処理を左右の袖に対しても簡単に行うことができ、かなり楽をすることができました。
やり方を覚えてしまえばPythonはBlenderにおけるかなり強力なツールだと思うので、今後も使いどころを見つけて使っていきたいと思います。 最後まで読んでいただき、どうもありがとうございました。