Skip to content

DaDaDan3D/DDDTools

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

DDDTools

自分用に作った雑多なツールをアドオンとしてまとめたものです。
Blender 3.1 以降用。
エラー処理が甘かったりするので、自己責任でお使いくださいませ。

インストール

Release から最新版をダウンロードし、Blender の 編集 > プリファレンス > アドオン からインストールしてください。

使い方

ビューの右上の < を押すかキーボードの N を押すかすると出てくるツールシェルフの DDDTools タブにパネルがまとまっています。

チュートリアル

ボーンとコライダの設定

EditTool

EditTool

EditTool / 分割線の選択

四角形を単純に二つに分割するエッジループを、様々な条件で選択したり、そのまま溶解してポリゴン数を削減したりするツールです。
サブディビジョンサーフェスモディファイアやループカットツールなどで増えすぎたポリゴンを減らすのに使えます。
四角形を四角形のままでポリゴン数を減らすので、形状が崩れにくく、また、再びサブディビジョンサーフェスなどをかけたりすることも容易にできます。

BlenderSelectDividingLoopCompare.mp4

EditTool / 中心を追加して三角化

選択した面の中心に頂点を追加し、そこから各頂点を結んで三角化します。
中心の計算方法をいくつか選べます。

計算方法 解説
辺を考慮 Blender標準の計算方法です
辺を頂点で分割しているような場合でも良い感じの中心になります
面積中心 三角形の面積を考慮に入れて中心を計算します
幾何中心 単純に各頂点の座標の平均を中心とします

トポロジを整える時に便利です。

TriangulateCenter_Topology.mp4

面白い形状も作れるかも?
TriangulateWithCenter_cube TriangulateWithCenter_cube2 TriangulateWithCenter_torus

EditTool / 近似球の追加

選択した頂点に近似した球オブジェクトを追加します。
頂点は 4 つ以上選択している必要があります。
(点郡の球面近似アルゴリズムはDr.レオさん作の fitting.py を使用させていただいております)
https://programming-surgeon.com/script/sphere-fit/

EditTool / エンプティ球の追加

「近似球の追加」のエンプティ版です。メッシュのかわりにエンプティ球を追加します。

EditTool / エンプティとメッシュの相互変換

選択したオブジェクトを変換します。 オブジェクトがメッシュの場合は近似したエンプティ球に、エンプティの場合はメッシュ球に変換します。 コライダの調整をする時に便利です。

ConvertEmptyAndSphere

EditTool / 選択インスタンスの実体化

Blender では、コレクションを中身のアーマチュアごとインスタンスとして複製することができ、複数のインスタンスで同じアクションを再生することができます。
しかし、エクスポートなどのために「適用」→「インスタンスの実体化」をするとアクションとのリンクが途切れてしまいます。
この「選択インスタンスの実体化」では、アクションのリンクがなるべく途切れないように実体化することができます。

InstanceToReal.mp4

MaterialTool

MaterialTool

MaterialTool / テクスチャ関係 / オブジェクト選択

指定したテクスチャを使っているオブジェクトを選択します。

MaterialTool / テクスチャ関係 / マテリアル列挙

指定したテクスチャを使っているマテリアルを情報に表示します。

MaterialTool / テクスチャ関係 / 全マテリアルを設定

アクティブなオブジェクトに対して、既存のマテリアルの割り当てを解除した後、指定したテクスチャを使っているマテリアルを全て登録します。
マテリアル一覧的な使い方ができます。

MaterialTool / テクスチャ関係 / シェーダーノード選択

指定したテクスチャを使っているマテリアルのシェーダーノードを選択してアクティブ状態にします。
テクスチャをベイクする時などに使います。

MaterialTool / マテリアル関係 / オブジェクト選択

指定したマテリアルを使っているオブジェクトを選択します。

MaterialTool / マテリアル関係 / オブジェクト列挙

指定したテクスチャを使っているオブジェクトを情報に表示します。

MaterialTool / マテリアルのソート

選択したオブジェクトのマテリアルスロットを、マテリアル順指定リストを参照してソートします。
具体的には、マテリアルスロットのマテリアルを、マテリアル順指定リストにある順番→名前の順番、という風に並べます。

VRMTool

VRMTool

VRMTool / スケルトン

VRM モデルのスケルトンオブジェクトを指定します。

VRMTool / コライダー関係 / エンプティのコライダ化

選択したエンプティを、アクティブなアーマチュアのアクティブなボーンのコライダとして設定します。
「リネームする」をオンにした場合、「Collider_Arm_L」というような名前に自動的にリネームします。
「ミラーの作成」をオンにした場合、次の「コライダのミラーを作成」を自動的に実行します。

VRMTool / コライダー関係 / コライダのミラーを作成

選択したコライダの複製を作成し、ミラーとして名前や位置や大きさを設定します。
親が「Arm_L」などの、左右のあるボーンの場合には「Arm_R」のコライダが作られます。
親が「Hips」などの、左右のないボーンの場合には、対称な位置にコライダが作られます。

VRMTool / コライダ追加

ポーズモード時、選択したボーンに対して、指定したメッシュに沿うようなサイズの Empty 球を追加します。
具体的には、ボーンに沿った方向で一定間隔に、ボーンを軸として放射状にレイを飛ばし、メッシュとの交点を近似するような球をコライダとして作成します。
実行後、プロパティパネルで調整ができます。

Panel_AddCollider

「終了位置を自動計算」をオンにした場合、ボーンの tail を超えないような位置までコライダを作成します。オフにした場合、「終了位置」で指定された位置までコライダを作成します。
「レイの最大半径」は、レイとメッシュとの交点の計算に使用します。コライダの最大半径と考えて良いです。 「レイの方向」が「内から広がる」の場合、ボーンから外側に向かってレイを飛ばします。 「外から集まる」の場合、外側からボーンに向かってレイを飛ばします。 メッシュが凸なのか凹なのかによって使いわけてください。 大抵の場合は「内から広がる」で良いと思います。

AddCollider

VRMTool / VRM 出力前の準備

モデルを VRM としてエクスポートするための準備をします。
ポーズアセットを使って表情を付ける仕組みとして設計されています。
ポーズアセットを使うことでシェイプキーを使わなくて済むので、エクスポート後にモデルを修正するといった手戻りに強くなります。
blendshape_group.json のサンプル

「VRM 出力前の準備」ボタンを押すと、具体的には、指定したアーマチュアに対して以下の操作を行います。(オプションでオンオフできる箇所もあります)

  1. 透明なポリゴンを削除する。具体的にやっていることは後述の「ポリゴン削除」を参照
  2. blendshape_group.json の内容に応じて、メッシュを一つにまとめる。 具体的には、binds の mesh で指定した名前の Collection を探し、Collection に含まれるメッシュのモディファイアを適用した後、一つにする
  3. blendshape_group.json の内容に応じて、ポーズアセットをシェイプキーとしてメッシュにベイクする。 具体的には、binds の index で指定した名前のポーズアセットを、前段階で一つにまとめたメッシュに対して、シェイプキーとして保存する
  4. 「出力しない骨」として指定したボーングループの骨を溶解する
  5. ウェイトのクリーンアップを行う
  6. 未使用マテリアルを削除する
  7. MaterialTool パネルの「マテリアル順指定リスト」を参照し、マテリアルのソートを行う
  8. blendshape_group.json の内容を VRM Addon for Blender の BlendShape の情報として設定する
  9. spring_bone.json の内容を VRM Addon for Blender の SpringBone の情報として設定する
  10. *.export.blend として名前を付けて保存する

VRMTool / ポリゴン削除

メッシュのテクスチャをスキャンし、透明なポリゴンを削除するための設定です。
チェックを付けると「VRM 出力前の準備」で自動的に呼ばれますし、「削除実行」ボタンを押すことで即座に削除することもできます。
具体的には、不透明なテクセルが一つも含まれないポリゴンを透明なポリゴンと見なして削除します。 ただし、下記の「除外マテリアルリスト」で指定したマテリアル及び、MToon_unversioned でオートスクロールが設定されているマテリアルのポリゴンは削除されません。
「判定の粗さ」は、テクスチャをスキャンする時にどれだけドットを間引くかの指定です。4 なら 1/4 (面積なら 1/16)になるので、大きな値を指定すればするほど高速になります。
「アルファ値の閾値」は、アルファブレンドとアルファハッシュのマテリアルで透明と見なすアルファ値の指定です。 アルファクリップではマテリアルに設定されている値を閾値として使用します。
「除外マテリアルリスト」は、削除対象から除外するマテリアルの指定です。 透明だが削除されたくないマテリアルなどを指定します。

BlenderRemoveTransparentPolygons.mp4

VRMTool / Springbone.json を登録

SpringBone の設定をした JSON テキストを元に、VRM Addon for Blender の spring bone とコライダの情報を登録します。
spring_bone.json のサンプル 「不要なエンプティを削除する」を設定すると、UI に表示されない隠れたエンプティを削除します。 通常はチェックを外さないでください。

BoneTool

BoneTool

BoneTool / 祖先に近いボーンの選択

選択中のボーンのうち、最も根っこに近いボーンだけを選択します。
spring_bone.json への登録をする時に便利です。

BoneTool / 選択中の骨を列挙

選択中のボーンの名前を情報に表示し、クリップボードにもコピーします。
spring_bone.json への登録をする時に便利です。

BoneTool / 子ボーンをリネーム

アクティブなボーンの子供のボーンの名前を、番号付きでリネームします。

BoneTool / リセットストレッチ

アクティブなアーマチュアに含まれる全てのボーンのストレッチモディファイアの長さをリセットします。

BoneTool / 現在の姿勢をレストポーズに

アクティブなアーマチュアの現在の姿勢をレストポーズとして設定します。
アーマチュアによって変形するメッシュの状態もそのまま保とうとするので、A ポーズを T ポーズにしたい時などに使えます。
非表示のオブジェクトは修正しないので、注意して使い分けてください。

BoneTool / ボーンをエッジに

アクティブなアーマチュアの選択したボーンをエッジにしたようなメッシュを作成します。
メッシュには頂点ウェイトも設定され、アーマチュア変形モディファイア付きでアーマチュアの子になります。
揺れ物のウェイトを設定する時、こうして作成したメッシュからウェイト転送すると便利です。

BoneTool / エッジをボーンに

アクティブなメッシュの選択したエッジをボーンにしたようなアーマチュアを作成します。
3D カーソルからの距離を元に、ボーンの向きや接続が自動的に計算されます。
揺れ物のボーンを作成する時、こうして作成したアーマチュアを VRM のアーマチュアに join すると便利です。

EdgeAndBone

EdgeAndBone.mp4

WeightTool

WeightTool

WeightTool / ウェイトのリセット

選択した全てのメッシュのウェイトをゼロにリセットします。

WeightTool / ウェイトのクリーンアップ

選択した全てのメッシュに対して以下の操作を行います。

  1. 対応するボーンの存在しない頂点グループを削除
  2. 「クリーン」 0.001 未満のウェイトの割り当てを削除
  3. 「合計を制限」 影響を与えるボーンの数が 4 以下になるように制限
  4. 「すべてを正規化」 ウェイトの合計が 1 になるように正規化
  5. 頂点グループに対して「ボーン階層でソート」

WeightTool / ウェイトの転送

選択した全てのメッシュに対して、指定したメッシュから頂点ウェイトを転送します。
ワンボタンで転送できるので、データ転送モディファイアやウェイトペイントを使うよりも楽です。

WeightTool / 頂点の左右ウェイト均一化

選択した全ての頂点に対して、左右のボーンに均等にウェイトが乗るようにします。
ただし、ボーンの名前の末尾が _L, _R, -L, -R, .L, .R になっている必要があります。(番号ではダメ)
例えば Arm_L:0.2 Arm_R:0.5 になっているような頂点は Arm_L:0.35 Arm_R:0.35 になります。
ミラーの境界面上の点に対して実行すると良いです。

WeightTool / 選択した骨の溶解

選択した全てのボーンに対して、頂点ウェイトを直近の祖先の変形ボーンに移し替えて溶解します。
スキニングが終わった後に中間のボーンを溶解したくなった時に便利です。

NormalTool

NormalTool

NormalTool / カスタム法線

選択したメッシュのカスタム法線をオンオフします。

UVTool

UVTool

UVTool / 整列

UV エディタの 2D カーソル位置を基準に、選択した UV を上下左右にぴったりくっつけます。
中心の数値は 2D カーソルの座標です。
ミラーモディファイアで「ミラーU」や「ミラーV」を使う時に便利です。

UVTool / 移動

UV エディタで、選択した UV を上下左右に移動させます。
中心の数値は、移動量です。

ShaderTool

ShaderTool

ShaderTool / スペキュラ計算

指定した IOR (屈折率 Index of Refraction) を元に、スペキュラを計算してクリップボードにコピーします。
スペキュラは以下の式で計算されます。
$specular=((ior−1)/(ior+1))^2$ https://docs.blender.org/manual/ja/2.90/render/shader_nodes/shader/specular_bsdf.html

ShaderTool / グループノード置換

指定したグループノードを、別のグループノードに置き換え、設定をコピーします。
VRM Addon for Blender の過去のバージョンの MToon_unversioned を、新しいバージョンのものに置き換えるのに便利です。

ShaderTool / ノードインプット一覧

選択したオブジェクトで使用されているマテリアルのノードの、特定のインプットを一覧表示して編集できます。
オブジェクトを選択した後、最初に「ノード名」を選びます。 次に、「インプット」を選び、「リスト作成」ボタンを押すと、下に一覧が作成されます。
一覧で直接編集することもできますし、左の目のマークを押せば、エディタにマテリアルを表示することもできます。
右の×ボタンを押せば、一覧から取り除くことができます。 (一覧から取り除かれているだけなので元のマテリアルには影響はありません)
一覧で項目を選び、下の「値をコピー」ボタンを押すと、選択した項目の内容を一覧すべてにコピーします。

ShaderToolSample

TextTool

TextTool

TextTool / JSON のチェック

現在開いているテキストを JSON フォーマットとしてチェックし、結果を表示します。

補足:blendshape_group.json について

blendshape_group.json のサンプル

blendshape_group.json は、まず、表情を付けたメッシュを集めたコレクションの名前を "mesh" で指定する必要があります。例えば、顔/眉毛/目/口 などに表情を付けたい場合、顔/眉毛/目/口 のメッシュを全て "MergedHead" という名前のコレクションに入れ、"mesh": "MergedHead" と書きます。
次に、表情を増やしたり減らしたりする場合は、表情設定のセクションを増やす必要があります。例えば、MergedHead コレクションの中のメッシュに "Smile" という表情を 増やす場合、次のように書きます。

    {
        "name": "Smile",
        "presetName": "unknown",
        "binds": [
            {
                "mesh": "MergedHead",
                "index": "Smile",
                "weight": 1.0
            }
		],
        "materialValues": [],
        "isBinary": false
    },

name

好きな名前を指定します。VRM として出力した時、ブレンドシェイプの名前になります。

presetName

VRM の Predefined expression name を指定します。 規定されていない表情を作りたい時は "unknown" を指定します。
https://github.com/vrm-c/vrm-specification/tree/master/specification/0.0

binds

どのコレクションの、どのアクションを、どれくらい混ぜるかを指定します。
binds は複数指定することができ、weight で混ぜ具合を指定できます。

mesh

表情を付けたメッシュを収めたコレクションの名前を指定します。

index

表情のポーズアセットの名前を指定します。
ちなみにポーズアセットは、次の手順で作成できます:

  1. ポーズモードでポーズを付ける
  2. アセットに登録したい骨を選択する
  3. ドープシートエディタを開く
  4. N を押してサイドバーを表示させる
  5. サイドバーの「ポーズアセットを作成」パネルの「ポーズアセットを作成」ボタンを押す

weight

表情をどれくらい強く出すかを指定します。1 ならポーズアセットの表情がそのまま出ますが、0 なら全く出ません。

materialValues

マテリアルの設定を変えることができます。例えば、テクスチャをスクロールさせたりできます。
この設定はマテリアル全体にかかるもので、特定のメッシュのマテリアルだけを変化させることはできません。

materialName

マテリアルの名前を指定します。

propertyName

マテリアルのどのパラメータを変えるかを指定します。 (この仕様がどこに書いてあるのかわかりません……。私は Unity のエディタで名前を確認しています)
例えば以下のように書けば、EyeHL というマテリアルを上にスクロールさせることができます。

    {
        "name": "HL up",
        "presetName": "unknown",
        "binds": [],
        "materialValues": [
            {
                "materialName": "EyeHL",
                "propertyName": "_MainTex_ST_T",
                "targetValue": [
                    1,
                    1,
                    0,
                    -1
                ]
            }
		],
        "isBinary": false
    },

isBinary

デジタルに変化させるかどうかを指定します。
例えば、目のコミカル表現のために顔を隠したいような場合、変化途中のメッシュが見えてしまうと困ります。そんな時 isBinary を true に設定しておけば、変化途中の状態は見えなくなります。

補足:spring_bone.json について

spring_bone.json のサンプル

spring_bone.json は、揺れ物と当たり判定の設定をするために使います。
例えば、髪の毛やスカートを揺らしたい時、どの骨を揺らすのか、どのコライダと当たり判定を取るのか、を設定します。
以下はアホ毛の設定例です。ちょっと硬めでピョンとすぐ元の位置に戻るようになっています。

    {
        "comment": "ahoge",
        "stiffiness": 1.8,
        "gravityPower": 0,
        "gravityDir": {
            "x": 0,
            "y": -1,
            "z": 0
        },
        "dragForce": 0.5,
        "center": -1,
        "hitRadius": 0.02,
        "bones": [
			"ahoge"
		],
        "colliderGroups": [
            "forearm_L",
            "forearm_R",
            "hand_L",
            "hand_R",
            "Head"
		]
    },

comment

わかりやすいように名前などを付けておきます。
なくても良いはずだと思います。

stiffiness

stiffness(硬さ) の誤字ではないかと思いますが、VRM の仕様です。
揺れ物がどれくらい元の状態に戻ろうとするかを指定します。
おおよそ 0~1 の間で指定しますが、ほかのパラメータとのバランスが重要です。
0 にするとチェーンのように、一度曲がったら自然には元に戻りません。

gravityPower

重力の大きさです。
0 にすると重力の影響を受けません。

gravityDir

重力の方向です。
おそらく Unity の座標系ではないかと思います。つまり、-Y が下方向です。

dragForce

揺れ物がどれくらい力に抵抗するかを指定します。
0 にするとちょっと移動しただけでもグニャリと曲がります。
stiffiness と dragForce を同じくらいの値(どちらも0.3とか)にすると布っぽい柔らかな挙動になります。そこからバランスを見ながら調整すると良いと思います。Unity で動きを見ながら弄ってみて、値をメモっておくと良いです。

center

ワールド原点以外を基準にしたい場合に設定するらしいです。
例えば、移動しても揺れないけれどモーションでは揺らしたい、というような場合に遣うのではないかと思いますが、使ったことがないので詳しくはわかりません……。

hitRadius

揺れ物自身の当たり判定の大きさを、メートル単位で指定します。
Unity のエディタ上でギズモを表示して確認するとわかりやすいです。

bones

揺れ物のルートボーンを指定します。
ルートボーンと子全体が揺れ物になります。子が枝分かれしていても良いようです。
ルートボーンの子を重複して指定してしまわないように注意してください。(Unity で見ると警告が出ます)

colliderGroups

揺れ物と当たり判定を取るコライダの、親のボーンを指定します。
DDDTools ではコライダをボーンの子の Empty として設定するのですが、そのボーンの名前を列挙して指定します。
コライダを付けた全てのボーンを指定する必要はありません。当たり判定を取りたいボーンだけを指定します。
この例では、アホ毛に干渉するのは前腕と手と頭だけです。

.json と VRM-Addon-for-Blender との関係について

VRM-Addon-for-Blender では、アーマチュアに設定情報が納められており、それをサイドバーのパネルの UI で管理するようになっています。
しかし DDDTools では、それらの情報は .json とコライダの Empty で管理し、"VRM 出力前の準備" でアーマチュアとパネル UI に一括登録するようにしています。
基本的には VRM-Addon-for-Blender の設定パネルは使いませんので、注意してください。

翻訳について

I18N フォルダの i18n.csv が翻訳データベースになっています。
もし他の言語を追加したい場合は、以下の手順で追加できます。

  1. I18N/i18n.csv に新しい言語列を追加する(例: it_IT)
  2. key の列に対応する翻訳を、追加した言語列に追加していく
  3. DDDTools フォルダの下で 'python I18N/build_dictionary.py' を実行する(dictionary.py ができる)

編集する際は、key 列を変更しないように注意してください。

免責

このアドオンを使用して生じたいかなる損害に対しても、当方は責任を負いません。
自己責任でご使用ください。

License

MIT