2025年8月16日土曜日

YT-Tools (Statistics)

Statisticsは、現在アクティブなメッシュオブジェクトを構成する頂点、エッジ、ポリゴンの統計情報を一元的に表示するパネルです。メッシュの中にある三角形ポリゴンやNサイドポリゴンの数はもちろん、境界エッジ、非平面ポリゴンなどさまざまな属性のエレメント数を一目で把握する事ができます。各項目の右側にある(xxx/zzzz)は、その属性を持つ選択されているエレメント数とエレメントの総数を表しています。左側のボタンを押せば対象となるエレメントが選択状態にボタンを押せば非選択状態になります。Modoユーザーにはお馴染みのパネルですが、Blenderネイティブのユーザーにも便利に機能するのではないかと思います。

EdgesのBy Boundaryには、Blender固有の属性であるSeam、Crease、Sharp、Freestyleなどの項目も用意しています。Blenderは標準でSelect Similarというメニューの中にある属性を持ったエレメントを選択するツールを用意していますが、Statisticsはこれらのツールの機能も一部サポートしています。

Auto UpdateUpdate Countsは、重たいシーンでStatisticsの情報の更新が原因で操作が遅くなってしまう事に対応する機能です。BlenderにはDependency graphという依存関係を保持するデータ構造があって、アドオンからこのDependency graph更新時に呼び出される関数を登録しておくとメッシュなどのデータに何か変更が行われる際にアドオンが登録したコールバック関数が呼び出されます。ただこのDependency graphの更新関数は変更があったときに無条件で呼び出され、アドオンのコールバック関数が自分に関係する項目があるかどうかを変更コンテキストの中から探しにいく必要があります。この処理が結構なオーバーヘッドで重いシーンだとStatisticsの各エレメント数の更新処理に時間がかかってしまいます。この場合は、Auto Updateを無効にしてもらうことで、Dependency graphの更新に伴う自動更新処理を無効にする事ができます。必要に応じて手動でUpdate Countsを押す事で最新のエレメント数の情報が更新されます。Modoでは、Notificationというシステムがあり、ピンポイントで必要な条件でのみ呼び出されるコールバック関数を登録する事ができました。例えばメッシュの頂点が移動した時のみ呼び出される関数を登録する事で最低限の負荷で対応するアップデート処理を行う事ができました。このあたりはもう少し上手いやり方を模索する必要があるかもしれません。





2025年8月15日金曜日

YT-Tools (Linear Transform)

Linear Transformは、澤田さんから強いリクエストがあった機能で、Modoのリニアフォールオフ+トランスフォームと同等のワークフローをBlenderで実現するすることが課題でした(澤田さんいつもありがとうございます)。Blenderのトランスフォームツールには、Proportional Editingという中心からの距離に応じてトランスフォームの大きさを減衰する機能があるのですが、リニアフォールオフを実現するために標準のトランスフォームをアドオンから拡張することはできそうにないとの結論に至り、標準のトランスフォームツールを利用する方法は諦めました。

Modoにはツールパイプラインというメインで使用するツール(アクターツール)とフォールオフなどのサブツールを自由に組み合わせてコンビネーションツールを自由に作る事ができます。フォールオフ意外にもアクションセンターやスナッピングなどもツールパイプラインのサブツールとして実装されていますので、プラグインなどで新しいサブツールを作ると組み合わせが膨らんでできる事がどんどん増えていきます。

Blenderにはもちろんこのツールパイプラインというシステムはありませんので、今回はリニアフォールオフとトランスフォームを1つのオペレータとして実装する方法を取りました。トランスフォームやリニアフォールオフで行う計算自体は非常に単純なものなのですが、ツールハンドルを独自に実装する必要があったので、今回一番実装に時間がかかったオペレータでした。BlenderのAPIが提供するGizmoは、限られた用途にしか使えそうもないので、独自にイベント処理やツールハンドルクラスを作りました。

Linear Transformの処理は非常にシンプルで、画面に表示されているマゼンダ色の三角のハンドルに沿って選択された頂点(選択がない場合は全ての頂点)の減衰値が計算され移動・拡大・回転のトランスフォームが行われます。三角形の末広がりから頂点からに向かってトランスフォームの量が減衰されます。

このLinear Transformのオペレーションは、このフォールオフハンドルを目的の位置に素早く正確に配置する事が重要です。フォールオフハンドルは開始点と終了点のハンドルを使って自由に移動させることはもちろん、Show Falloff Axisをオンにすれば開始点と終了点にXYZ軸の値を個別に移動するための軸ハンドルが表示されます。

また、Auto Fitというボタンを押すと、フォールオフハンドルが対象となる形状にフィットするように再配置されます。Orientは方向を計算する方法を指定するオプションで、デフォルトのOriented Bounding Boxは方向性バウンディングボックスを計算し、一番長い軸に沿ってフォールオフハンドルをフィットさせています。その他、XYZの各主軸に沿ってフィットさせることもできます。



Mirrorは、フォールオフハンドルを開始点もしくは終了点でミラー反転したもう一つのフォールオフを用意し、強ー弱ー強もしくは弱ー強ー弱のような2段階の減衰領域を提供するものです。この機能はModoのリニアフォールオフのSymmetryと同じなのですが、今回のLinear Transformには別にSymmetryというトランスフォームを対称に行うオプションがありましたので、Mirrorという名称にいたしました。



また、Pythonで記述するBlenderアドオンの弱点として、ネイティブのツールと比べてどうしても実行速度が遅い点が挙げられます。Linear Transformの計算処理はとてもシンプルですし、可能な限りのコードの最適化は行なっていますが、それでもC++で記述されているネイティブのトランスフォームツールには及びません。一つの解決策として、実行処理の遅延適応という操作を組み込んでいます。Altキー(Optionキー)を押しながらLinear Transformのハンドルを操作した時は、トランスフォームの実行処理は保留され、Altキー(Optionキー)を離した時に適応されます。これはModoの多くのツールでサポートしていたLazy Applyと同じアイディアに基づくものです。頂点数の多いメッシュの処理では、ハンドルがストレスなく動作します。



2025年8月14日木曜日

YT-Tools (Workplane)

作業平面は、一時的にメッシュオブジェクトのトランスフォームマトリックスをメッシュ編集作業しやすいようにビューの中心と方向に沿うように設定する機能です。よく使うワークフローでは、編集したいポリゴンを選択し、そのポリゴンの中心をビューの中心、ポリゴンの法線ベクトル方向をトップビューの方向に一致させ、メッシュ編集を行う方法があります。これによりトップビューでの2次元的な編集操作が可能になるため、精密なモデリング作業を行いたい時には重宝する機能です。Modoでは作業平面は内部的なトランスフォームマトリックスとして実装されています。初期のバージョンから基本機能として備わっていて、全てのツールが作業平面をサポートしています。Blenderでも任意の作業平面を定義してモデリング作業をするための機能はあるようですが、パースペクティブビューで作業をすることが前提のアドオンが多いように思われます。

YT-Toolsでは、作業平面用にEMPTYオブジェクトを用意して、ここに作業平面のトランスフォームマトリックスを設定し、一時的にメッシュ編集したいメッシュオブジェクトをここにペアレンティングすることによって、平行投影のトップビューでモデリング作業を行う仕組みを作りました。

Edit Modeでポリゴンを1つ選択し、YT-ToolsのWorkplaneにあるSetボタンを押すと、ビューがトップビューに切り替わり、選択したポリゴンの中心がビューの中心となり、ポリゴンの法線ベクトル方向がトップビューと並行のZ軸方向に切り替わります。シーンコレクションのアウトライナーをみると"_Workplane"という名称のEMPTYオブジェクトが追加され、選択されたポリゴンを含むメッシュオブジェクトが"_Workplane"オブジェクトにペアレンティングされているのがわかると思います。この状態でTransform OrientationをGlobalにすれば、選択したポリゴンの法線ベクトル方向をZ軸にしたモデリング作業が可能になります。"Unset"ボタンを押せば、メッシュオブジェクトは元の階層に戻り、"_Workplane"オブジェクトは削除されます。


この"_Workplane"オブジェクトのトランスフォームはObjectモードでも利用することができます。Modoにはアイテムリストにアイテムリファレンスというボタンがあり、あるアイテムのアイテムリファレンスを有効にするとそのアイテムがシーンの中心に位置するようにシーン全体がトランスフォームされます。対象となるアイテムのトランスフォームが一時的にリセットされ、相対的に他のアイテムが座標変換されます。YT-Toolsの作業平面ではObjectモードでSetボタンを押すと、アクティブメッシュオブジェクトのトランスフォームがリセットされるマトリクスを"_Workplane"オブジェクトに設定し、全てのメッシュオブジェクトがこの"_Workplane"オブジェクトにペアレンティングされます。


"_Workplane"という名称はたぶん一般には使われないであろうとの前提のもとに一時オブジェクトの名称として定義した予約名称です。もし、この名称が一般的なオブジェクトに利用していて衝突する場合はリクエストフォームでご連絡ください。解決方法を検討してみます。

2025年8月12日火曜日

YT-Tools (Action Center)

アクションセンターは、Modoのツールパイプラインを通して各ツールで共有されるピボット位置です。Modoにはツールパイプラインという1つのアクターツールと複数のサブツールを組み合わせて使用するユニークなシステムで、アクションセンターはサブツールとして実装されています。Blenderには、Transform Pivot PositionTransform Orientationという設定値があり、これがModoのアクションセンター、アクションアクシスにあたります。これらはある程度、対応する項目に変換することができます。

Automatic

Automaticは、選択位置に3D Cursor位置を移動し、Pivot PointをCursorにOrientationをGlobalに設定します。

Selection

Selectionは、Pivot PointをMedian Centerに設定し、OrientationはNormalに設定します。

Selection Border

Selection Borderは、選択されている境界エレメントの中心を3D Cursor位置を移動し、Pivot PointをCursorに設定します。OrientationはNormalに設定します。

Selection Center Auto Axis

Selection Center Auto Axisは、Pivot PointをMedian Centerに設定し、OrientationはGlobalに設定します。

Element

Elementは、Pivot PointをActive Elementに設定し、OrientationはNormalに設定します。

Screen

Screenは、Pivot PointをActive Elementに、OrientationはViewに設定します。

Origin

Originは、アクティブオブジェクトのセンターに3D Cursor位置を移動し、Pivot PointをCursorに設定します。OrientationはGlobalに設定します。

Parent

Parentは、アクティブオブジェクトの親オブジェクトの位置に3D Cursor位置を移動し、Pivot PointをCursorに設定します。OrientationはParentに設定します。

Local

Localは、Pivot PointをIndivisual Originに設定し、OrientationはNormalに設定します。

Pivot

Pivotは、アクティブオブジェクトの位置に3D Cursor位置を移動し、Pivot PointをCursorに設定し、OrientationはLocalに設定します。 Localは、Pivot PointをIndivisual Originに設定し、OrientationはNormalに設定します。

Pivot Center Parent Axis

Pivotは、アクティブオブジェクトの位置に3D Cursor位置を移動し、Pivot PointをCursorに設定します。OrientationはParentに設定します。

 

Selection Borderに関しては、選択の境界の中心位置を計算し、3D Cursorに設定していますので、選択を変更しなおした場合は、再度Selection Borderを選択し直す必要があります。ModoのSelection Borderはサブツールとして実装されていましたのでエレメントの再選択時には自動的にアクションセンターが変更されていました。



Elementアクションセンターを使った操作では、選択状態を保持したままActive Elementを変更できないことが分かりました。Active Elementを変更しようと選択操作を行うと選択自体がリセットされてしまいます。Active ElementはFaceなどのMeshエレメントを選択した時に最後に追加されたエレメントの中心で、内部的には'select_history'という選択リストの最後に追加された白くハイライト表示されたエレメントがActive Elementになります。Active Elementを変更しようとすると選択自体を再設定しなければならないため、選択と関係ない場所にActive Elementを設定することができません。そこでHit Mesh Elementというオペレータを実装し、現在選択されているエレメントの選択状態を変更せずにActive Elementだけを変更できるようにしました。これによりModoのエレメントアクションセンターに近いワークフローが可能になります。



Gumroadに加え、BOOTHでの販売を開始いたしました。BOOTHでは日本円でお支払いいただけます。ダウンロード可能なYT-Toolsのバージョンはどちらも同じです。よろしくお願いいたします。




2025年8月11日月曜日

YT-Tools for Blender (Selection)

エレメント(頂点、エッジ、面)を選択する機能は、ModoもBlenderも多くの機能を標準装備しており、機能リストだけ比較すると主だった選択機能はすでに用意されているように思えます。その中でエレメントの選択ワークフローを改善するオペレータを幾つかYT-Toolsに組み込んでみました。

ダブルクリックによる連結ポリゴン、エッジループの選択(Contextual Selection)

ダブルクリックによるエレメントの選択はModo基本操作でしたので、各選択モードでエレメントをダブルクリックした時に連結するポリゴン、頂点もしくはエッジループを選択するオペレータを実装し、ダブルクリックのマウスイベントに登録しています。SHIFTキーを押しながらダブルクリックすると選択が追加されます。


ModoとBlenderの選択に関する考え方の違い

エレメントの選択状態の保存方法はModoとBlenderで若干異なります。Modoはセレクションスタックというシステムがあり、メッシュのエレメントをはじめオブジェクトや頂点マップなどあらゆる選択はセレクションパケットというID+選択情報を収めたパケットデータをスタックとして一元管理しています。これに対してBlenderは各データ構造体の中に'select'という状態変数があり、そこで管理されているようです。また、Modoはポリゴン、エッジ、頂点の各モードでの選択状態は個別に保存されていますが、BlenderはFaceからEdge、EdgeからVertなど選択モードを変更した時にそれぞれの選択されている構成要素の選択状態がモード変更時に変換されるようです。例えばFaceモードからVertモードに変更すると選択されているFaceを構成する全てのVertが選択状態になります。また、Modoはセレクションスタックというスタックにパケットとして選択情報を保存しているため、全ての選択には選択の順番が同時に保存されています。これに対してBlenderは基本的に'select'という状態変数で選択の状態を管理しているため、選択順序は保存していません。BMesh構造体には'select_history'というリストを別に用意していて、明示的にこの'select_history'に対応している操作にのみ選択順序に関する操作を行うことができます。

また、Modoでは何かエレメントが選択されている場合、そのエレメントが編集対称になり、何も選択されていない場合は、メッシュの全てのエレメントが編集対称になります。Blenderの場合は、明示的に選択されているエレメントが編集対称になります。

選択の変換

明示的にあるモードの選択を別のモードの選択する。オペレータを用意しています。Select Boundaryは選択されているFaceと非選択Faceとの境界を選択します。選択されているFaceがない場合、境界エッジが選択されます。Convert Edge to Faceは、選択されているEdgeが一つ場合は、そのEdgeを共有する全てのFaceが選択されます。選択されているEdgeが2つの場合、それらのEdgeを全て持つFaceが選択されます。同様にConvert Vert to Faceは、選択されているVertが一つの場合はそのVertを持つ全てのFaceが選択されます。選択されているVertが3つの場合は、それらを全て持つFaceだけが選択されます。

ループ選択

Blenderのループ選択はAltキーを押しながらEdgeやFaceをクリックして行います。Blenderのオペレータは実行時の位置情報が参照できるため、Faceをクリックした場合、クリックした位置に最も近いEdgeの方向にFaceのループが選択されます。Modoは選択コマンドとして実装されているため連続する2つのポリゴンからループの方法が決定されます。おそらくBlenderの操作に慣れている方は、標準の方法の方が馴染みやすいかと思います。ただし、標準のループ選択は前述した'selection_history'に対応していないため、Previous Activeで最後に選択したエレメントを非選択にするような操作ができません。これはModoで言うところのSelect Lessコマンドです。そこで'selection_history'に対応したループ選択オペレータをYT-Toolsには実装しています。2つの連続しているFaceを選択してLキーを押すとFaceがループ選択され、ループの並び順にFaceが選択されます。下矢印キーを押すとループの選択が一つづつ非選択状態になります。Altクリックで実行される標準のループ選択も'selection_history'に対応したオペレータに置き換えています。


選択関係のオペレータは、Modoライクなワークフローを再現するために、割とメジャーなショートカットキーやマウスイベントに割り当てられています。Blender標準のキーマッピングに戻したり、YT-Toolsの選択オペレーションを無効にしたい場合は、プリファレンスパネルのYT-ToolsのKeymap Listをカスタマイズしてください。



2025年8月10日日曜日

YT-Tools for Blender (Loop Slice)

 Blenderには標準でLoop Cutというオペレータがあり、Modoのループスライスと同じように連続したポリゴンループをスライスすることができます。ModoのループスライスではSelectedというオプションがあり、選択されているポリゴンだけをマスクしてスライスすることが可能です。BlenderのLoop Cutでもスライスしたくないポリゴンを非表示にすることで対応することはできるのですが、対称モードをサポートしていなかったり、Preserve Curvatureオプションもなかったため、新たにLoop Sliceを実装いたしました。

操作方法はModoのループスライスと同じように連続した2つのポリゴンを選択もしくは1つのエッジを選択し、Loop Sliceを実行するとループ上に連続するポリゴンがスライスされます。

Selectedオプションを有効にすると選択したポリゴンだけがマスクされてスライスされます。また、Symmetryオプションで対称軸をしていするとメッシュのローカル座標系で対称位置にあるポリゴンループがスライスされます。Symmetric Cutは、スライスのNumber of Cutsが2以上の場合、ループ内でスライス位置が対称になるようにスライスを行います。Preserve Curvatureは、連続するエッジリングを結ぶ曲線の曲率を考慮し、スライス位置を調整します。円柱やトーラスなどにループを追加するなど曲率を考慮したい場合に有効です。

Loop Slice with Selected

Preserve Curvature


Cut Positions by Spansは、スライス位置を比率を表す数値で直接指定する方法です。ループのスライス数と位置を正確に指定したい場合は、こちらの入力方法を使用した方が便利です。例えば、ループの幅に対して25%と75%の位置でスライスしたい場合は、"0.25 0.5 0.75"もしくは"25 50 75"もしくは"1 3 1"と入力します。入力数値は正規化されますので数値の合計が1.0にならなくても大丈夫です。

Cut Positions by Spans (1 3 1)

Cut Positions by Spans (1 2 2 2 1)


Add Loopは、クリックしたエッジを含むエッジリングを求め、ポリゴンをスライスするインタラクティブバージョンのループスライスです。こちらの方が標準のLoop Cutに近いですが、スライス位置をクリックした後で調整したり、Loop Sliceの機能がほぼ全て使えます。更にModoのAdd Loopと同じようにAbsolute Distanceをサポートしています。通常のループスライスはFactorでエッジ上の位置を各エッジの長さをもとにした比率で指定します。Absolute Distanceは、クリックしたエッジの長さをもとに各エッジの始点もしくは終点から絶対距離で各エッジのスライス位置を決定します。これにより、スライスするループの形を固定しながらポリゴンループをスライスすることができます。




2025年8月9日土曜日

YT-Tools for Blender

久しぶりの投稿になります。Blenderでのモデリング作業をModoライクに行うためのアドオンYT-Toolsの販売をGumroadから開始いたしました。YT-Toolsは、Modoのワークフローの一部をBlender上で行えるようにデザインしたアドオンツールセットで、Modoライクな機能を持つモデリングツール群や作業平面、アクションセンターなどModo固有の機能を補完するツールをBlenderに追加しています。

追記)BOOTHからの販売も開始いたしました。

この開発はもともと長年Modoを使ってくださっていた株式会社サブリメイション様からの依頼でカスタムアドオンツール開発(SBL ModelingTools)として始めたプロジェクトです。Modoワークフローの一部をBlender上で実現し、作業効率を高めることを目標に開発を進めてきました。このプロジェクトはフェーズ2が終わり、当初の目標としていた開発は終了いたしました。今後このツールの更新を継続していくために、今回このプロジェクトのツールをベースにした公開バージョンのアドオンをYT-Toolsとしてリリースすることを許可していただきました。手探り状態から始めたBlenderアドオンツール開発で貴重なご意見やアイディアをいただいたクリエータの皆様に心から感謝申し上げます。なお、YT-Toolsに関しましては作者が全責任を負っております。ご質問、ご要望などはフィードバックフォームから承ります。

Modoは開発が終了してしまいましたが、既存ユーザーの方々にはEOLライセンスが提供されていますので、基本的にはこれからもModoを使い続けていただくことは可能です。しかし将来のOS上での動作保証や技術サポートなどの不安から制作の現場でModoで行っていたモデリング作業を他のツールに移行もしくは併用する傾向があるようです。また制作ラインのチームに参加するModoを使ったことがない新しいクリエータの方々と使用するツールを統一する問題もありそうですね。

今回のプロジェクトではBlender上でModoでのモデリングワークフローが実現できるようなアドオンを開発し、モデリングの作業効率を向上させることを目的としました。Blenderには標準で完成されたモデリングツールセットがあり、優れた機能を持つ外部のアドオンも利用できます。しかし、いざModoで行っていたモデリングワークフローをBlenderで行おうとするといろいろとできない事があるようです。YT-Toolsはその辺りの問題点を1つ1つ解決する事を目標に開発を行いました。

下記は今回のプロジェクトで実装を試みた主なテーマです。機能の詳細はこちらのサイトをご覧ください。

  • Blenderにない選択機能の実装
  • アクションセンターを使ったワークフロー
  • 対称をサポートしたスライスツール群
  • リニア・ラディアルフォールオフを使ったトランスフォームツール
  • 作業平面を使ったワークフロー
  • 情報統計パネルを使ったエレメントの管理・選択
  • セレクションセット
このブログで実装した各機能を詳しく紹介していこうと思います。また、Modoのオープンソースのプラグイン開発も近々再開する予定です。

ダブルクリックによる接続ポリゴンもしくはエッジループの選択

クリックしたエレメントにアクションセンターをセット

対称をサポートしたポリゴンスライス

対称をサポートしたエッジスライス

絶対オフセットをサポートしたAdd Loopツール

リニアフォールオフを使用したトランスフォームツール

選択したポリゴンを作業平面に設定し、Topビューでモデリング