犬小屋

Blenderファイルの使い方
Blenderは無料の3D編集ソフトです。気軽にDLして使ってみましょう
▶ コラム
1・胸を変形させたいけど処理が重い
まずここに書く方法は恐らく最適ではありません。
他に方法は色々あると思いますが、私が調べた限り、思いつく限りで最適な方法を書いています。
世に出ていない方法、調査不足もあると思います。
また、圧倒的に知識不足なので詳しい方からすると何言ってんだコイツみたいなことも多々あると思います。
私はBlenderファイルを配布するという方法で作品を提供させていただいているので、
より良い方法があればBlenderファイルで閲覧してる方々にもそれはとても良い事ですのでご教授頂ければ幸いです。
R18でも全年齢版でも胸を揺らす処理をする事は多いと思います。
Blenderの物理演算はオブジェクト単位で適用されます。つまり、胸部分だけに物理演算を適用しようとしても
オブジェクト全体の頂点とポリゴンが計算対象になります。
ピン止めを利用する事でその部分に物理演算が行われないようにする事はできますが、
その部分にも計算が走っており、ある程度の軽減にしかなりません。
なら胸だけを違うオブジェクトにすればいいじゃないと思いやってみました。

そうするとはっきりと切れ目のようなものが残ってしまいます。
法線転写をすれば切れ目がほぼ分からなくなりますが、完全には無理でした。
トゥーン調であれば気にならないかもしれません。
また、動かしてみると切れ目が発生しました。

次に考えたのは切り取るのでは無く、体は残したままで物理演算をかけたいところのみを複製し、
そちらに物理演算をかけてそこにシュリンクラップをかけたらいいのではと思いました。

左の体には物理演算は一切かけずに、右側のものだけにかけます。
そしてシュリンクラップで右側のオブジェクトに吸着させます。
右のオブジェクトは非表示状態でもちゃんと吸着するので非表示で使用します。マテリアルも剥いで大丈夫です。
これでうまくいったと思ったのですが、それは小さい動きの時だけで大きく揺れた時は破綻しました。
シュリンクラップは指定したオブジェクトの頂点や面などに吸着させる事ができますが、
最も近い頂点や面等に自動でくっつくため右側の頂点1つに左側の頂点2つ以上がくっつくという事が起こります。

理想の状態にする為にはシュリンクラップではなく、ジオメトリノードでシュリンクラップのようなものを作成する必要がありました。
各々に頂点グループのようなものを持たせられないかとChatGPTに相談したとところ、IDを持たせる事ができるという事だったので
右側の頂点全てにIDを持たせ、左側の被さる部分にも同様にIDを持たせました。両方の頂点AにはID1、BにはID2といった感じです。
そして右側のID1のものに左側のID1が吸着するというジオメトリノードを作成しました。
これにより物理演算の処理が行われる範囲を一部だけにし、処理を軽くすることに成功しました。
FPS15→FPS24になるくらいには軽減されました。
以下のは作成したジオメトリノードです。IDが0のものは吸着しないようにしています。
本体にIDを割り振ってから複製すればIDも複製されます。ID名はvtx_idとなっていますがoppai_idとかでもなんでもいいです。

IDはChatGPTに作って貰ったパイソンスクリプトで自動で割り振り。ジオメトリはClaudeにほとんど作って貰いました。
スクリプトにしてもノードにしても今のところClaudeの方が優秀のようですが、
Claudeは有料であっても質問回数に制限があるのでうまくいかなかったら次の日に持ち越しになってしまいます。
今のところ5時間毎に制限がリセットされるようです。
最初にClaudeに提示されたノードではうまくいきませんでした。最初のノードのスクリーンショットと出力結果のスクリーンショットを見せて
どこが間違っているかを聞いたところインデックスサンプルの値に位置ノードがくっついていないとのことでした。
それを修正すると明らかに頂点に吸着しているのは分かりましたがやたら乱れていました。

吸着後の頂点のIDをよくよくみると物理演算用の頂点ID2のところに本体のID1が、ID3のところにID2が
吸着していることが分かりました。その補正の為に減算ノードで-1を入れたところうまくいきました。
違うオブジェクトを切り離すやり方ですが、トゥーン調等で切れ目が目立たないのであれば切り離した後、
この方法で切れ目の部分のみの頂点を繋げればうまくいくと思います。
現状で軽い順は
①、切り離した部分のみを物理演算で処理し、つなぎ目をなんとかする
②、今回の方法です。物理演算させたい部分のみを複製し、複製したものに動かしたい部分を吸着させる(①で何とかならなかった場合)
③、めんどいから直で物理演算をかける
正直③で処理が重くならないならそれで大丈夫です。
一番いいのはblender自体の仕様で物理演算がかからないところには計算が走らなくなる事です。
今後のアップデート、もしくはそういうノードやスクリプトが実現されればこれらは全くの不要になります。
AIの進化が凄いのでもしかしたら割とすぐに③でよくなるかもしれません。
あとコリジョン側も物理演算する際におっぱい触るのが指だけであっても体全体を計算が走るので
指の部分だけ複製、非表示にし、コリジョンを複製した指に設定してあげるだけでも結構違います。
こっちは特別なことはせずに複製だけでいけるので簡単です。
出力したら終わりのつもりで作成するにしても作業中も軽くなるのでこういうことはやっておくのをおすすめします。
やってみたい方は以下の手順でお試しください。試す際は必ずバックアップをとっておいてください。
また、サブディビジョンサーフェスがかかっていると無理です。適用させてください。
①バックアップをとっておき、右のid.sr.zipファイルをダウンロード、展開する。
②胸など一部だけ物理演算をかけたいオブジェクトを選択。
③編集モードで物理演算をかけたい部分を選択
④id_copy_and_paste.txtを開く。4行目の★と☆の名前を変更する。
def duplicate_selected_verts_with_id(source_name="★", duplicate_name="☆", attr_name="vtx_id"):
★は元となるオブジェクト名に変更してください。オブジェクトを選択してF2をおしてコピペすると確実です。
☆は複製されるオブジェクトです。分かりやすい名前に変更してください。このオブジェクトで物理演算を行います。
⑤テキストエディターを開く

⑥新規→id_copy_and_paste.txtを④で書き換えたものを全文コピペする。
⑦再生ボタンを押すと★の選択した頂点が複製されます。複製されたオブジェクト名は☆になります。(★、☆は④で変更した名前になります。)
⑧ファイル→アペンド→sr.GeometryNodes.blend→Object→sr.GeometryNodes
blender上に追加されたsr.GeometryNodesは一度読み込んだらすぐ削除してもいいです。
⑨元のオブジェクト★にモディファイア→ジオメトリノード→srを選択→オブジェクトに☆を選択

これで☆の形に追従するようになります。
★のほうの物理演算は取っ払ってください。
注意点として⑦を別の頂点を選んで増やそうとしてもそれ以外の頂点がリセットされるのでご注意ください。
なので物理演算をかけたいところはまとめて複製してください。
割り振られたidを全てリセットしたい場合はid_resetを⑤でやったように実行してください。
実行する前にテキストを開いて★の名前をリセットしたいオブジェクトの名前にしてください。
また、複製した側☆が★に吸着するようにすれば本体の★がシェイプキー等で変形しても
一緒についてくるようになります。コリジョンは頂点が多ければ多いほど重たくなるので口部分のみを複製して
コリジョンに設定する事で軽減できます。この方法であれば後でシェイプキーを増やしたい時でもくっついてきてくれます。
複製したコリジョン用のオブジェクトの頂点を減らしたい時はモディファイアのデシメートで減らしてください。


ただし、★→☆へ吸着させる時は先ほどの手順でいいのですが、
☆→★へ吸着させたい時は手順を少し変えないとうまくいきません。
★→☆の場合はスプレッドシートを見た時のvtx_idが同じものに吸着され、0は無視されます。
ですが☆→★の場合は☆のvtx_idが1のものはシート左側の1に、vtx_idが7のものは7に、
つまりvtx_id4へ吸着されてしまいます。これの原因はさっぱり分かりませんでした。
ですが手順を変えると一応いけたので原因は放置します。
多分ジオメトリノードをいじればいけると思いますがさっぱりです。
手順を変える部分は③編集モードで物理演算をかけたい部分を選択というところです。
ここで選択した部分の頂点グループを新しく作成して割り当ててください。
そして頂点を全て選択し、④~⑧を実行してください。
このやり方の場合は頂点が全て複製されているので、
先ほど作成した頂点グループを選択→メニュー→選択→反転→頂点を削除すると
物理演算させたい部分だけが残ります。
そして⑨は★ではなく☆(複製した側)にジオメトリノードをつけ、対象を★にします。
これでなぜかうまくいきます。逆にこの方法をとった場合、
★→☆の吸着がうまくいかなくなります。
なので使い道によって手順を変えてお使いください。

比較動画です。上が切り離したオブジェクトに追従させているやつです。
