2025年9月15日月曜日

YT-Tools for Blender (Smooth Brush)

v1.3をリリースいたしました。このバージョンではSmooth Brushというオペレータを追加しています。メッシュの頂点をスカルプティングのようなブラシ操作で平滑化する機能です。LMBを押しながらメッシュ上をドラッグするとマゼンダ色の円の中にある頂点の座標位置が平滑化されていきます。ブラシのサイズはRMBで調整、平滑化の強さはSmooth Strengthで調整することができます。

また、このSmooth Brushの機能はSoft Drag使用時に使う事ができます。Shiftキーを押しながらLMBでドラッグするとソフトドラッグの代わりに頂点の平滑化を行う事ができます。

YT-ToolsはPythonで実装されているためパフォーマンスの問題は今後の課題です。

v1.3では、その他下記のような変更を行なっています。

  • SelectionSetsにReplaceボタンを追加
  • WorkplaneにSet to 3D Cursor and Rotationを追加
  • Display Infoで新しいシーンを読んだ後に選択情報が更新されないバグを修正
  • MergeとLoopSliceにもシンメトリーの初期値を追加
  • AddLoopとPolygonSlice終了後にAdjustLastOperationパネル(左下のプロパティパネル)が表示されるように修正
  • Randomize Transformが動かなくなってしまう問題を解決
Set to 3D Cursor and Rotationは、作業平面で選択エレメントから計算した位置情報と回転マトリクスをTransform Pivot PositionOrientationのCursorが参照するLocationとRotationに設定する機能です。v1.2ではカスタムOrientationに設定するSet to Transform Orientationsを追加しましたが、今回はこれを3D Cursorに追加するコマンドを用意いたしました。



2025年9月3日水曜日

YT-Tools for Blender (Radial Weight)

Radial Weightは、Linear Weightと同様にフォールオフを利用して頂点のウェイト値を設定するツールです。基本的なウェイト設定の操作性はLinear Weightと同じで、ギズモのハンドル操作はRadial Transformと同じです。



v1.2では、Linear WeightRadial Weightの遅延適用モードを改善し、インタラクティブなドラッグ操作を高速化しています。YT-Toolsの主なインタラクティブのツールは、Alt(Option)を押しながらLMBで行う操作は、Altキーを押している間は処理の適用が保留されます。画面上のメッシュには実行結果が反映されませんが、その間はハンドルの移動などを比較的思いメッシュでも軽快に行う事ができます。ウェイト設定ツールでは、ウェイトの表示はVertex Group WeightsというMesh Edit Mode OverlaysというBlenderの表示機能を使って表示しています。これはEdit Modeでのみ機能する表示なのですが、ウェイトの設定は内部的にはObjectモードで行う必要があります。つまりウェイトをドラッグしながら設定する場合は、内部的にObjectモードとEditモードを頻繁に切り替えながら行なっていますので、重たいメッシュですと速度が極端に遅くなります。v1.2では、Alt(Option)キーを押しながらドラッグしている間は、ウェイトの計算だけを行いツールが簡易的にウェイトを既存のメッシュに重ねて表示するように変更いたしました。簡易的な表示ですがウェイトの設定量を確認しながら高速にウェイトを設定する事ができます。


追記)DiscordのPixel FondueのBlenderチャンネルでDisplay Infoが原因での不具合や速度低下する事例が報告されています。現在調査中ですが、YT-Toolsを有効にした後で問題が発生がした場合はDisplay Infoを無効にして試してみてください。

2025年9月2日火曜日

YT-Tools for Blender (Soft Drag)

YT-Tools for Blenderv1.2を公開いたしました。今回のバージョンでは、2つの新機能の他、アクションセンターおよび作業平面の機能改善を行なっています。リリースの詳細はリリースノートもしくはオンラインマニュアルをご覧ください。

Soft Dragは、スクリーンスペース上の円の中にある頂点の座標値を円の中心からの減衰率をもとにスムースに移動するツールです。Modoではスクリーンフォールオフ+トランスフォームツールとして実装されていました。Modoのエレメント移動やBlenderのTweakツールがクリックしたエレメントを基準に周辺の頂点を移動するのに対して、Soft Dragはスクリーン上の円の中にある頂点が対象となります。対称を考慮しながらメッシュの膨らみを直感的に調整していくときに便利なツールです。Shift+LMBでスクリーン上をドラッグするとフォールオフのサイズを変更する事ができます。



Occlusion Testを有効にすると円の中にある頂点が他のポリゴンの後ろに隠れていないかどうかをテストし、頂点が隠れている場合は頂点座標値の移動を行いません。このオプションを有効にすると実行速度が低下しますので、必要な場合にのみ有効にして使用されることをお勧めいたします。


2025年8月27日水曜日

YT-Tools for Blender (Display Info)

YT-Tools for Blender v1.1.1を公開いたしました。このバージョンではLinear WeightツールやBendツールのバグがいくつか修正されています。また、PreferencesパネルにView Navigationという項目が追加されています。これはビューナビゲーションをModo風に変更するものではなく、Alt-LMBなどModoのビューナビゲーションを使用していることをYT-Toolsに認識させるためのオプションです。YT-Toolsのインタラクティブツールは、MMBのイベントをビューナビゲーションとして認識していて、このイベントがあった場合は、マウスオペレーションの制御をBlenderに渡していました。このためビューナビゲーションにMMB以外のキーマップが指定されていた場合、ツールが正しく動作できない問題があったため、暫定的にこのオプションを追加いたしました。将来的にもう少し賢い方法でこの問題の解決を行うかもしれません。

Display Infoは、Blenderの標準でスクリーンに表示される情報を補うための追加情報を表示します。Blenderは、BOXセレクションなど選択操作も全てオペレータで実装されてるため、常に何かしらのツールがアクティブになっています。画面の左下のDisplay Infoは現在アクティブになっているネイティブなツールを表示しています。また、Editモードでは現在選択されているEdgeの合計の長さや、Faceの合計面積も表示しています。

Display Infoは、スクリーンの左下に表示されるためBlenderのツールバーに隠れてしまう場合があります。Preferencesにテキストを表示するスクリーンの位置やテキストの大きさを調整するオプションがありますので、ご使用環境に合わせて調整してみてください。



2025年8月24日日曜日

YT-Tools for Blender (Selection Set)

Selection Setは、頂点、エッジ、ポリゴンの選択状態を名前をつけて保存し、必要に応じて呼び出す機能です。操作は簡単でエレメントが選択されている状態でAddボタンを押し、表示されるダイアログに適当な名前をつけてOKボタンを押せば、現在の選択状態がシーンに保存されます。Selection SetのNameから呼び出したいセレクションセットの名称を選択し、Selectボタンをおせば、保存した選択状態を復元する事ができます。


Selection Setの情報は、内部的にはメッシュの各エレメントに設定できるカスタムレイヤーに保存されます。頂点やエッジなどにユーザー固有のデータを保存することができます。これはシーンファイルに保存されますので、あとからそのシーンファイルを読み込んでも再現する事ができますので便利ですね。ただし、このカスタムレイヤーを増やし過ぎるとメモリー消費の増大やパフォーマンスの低下を招く原因になりますので、必要のないセレクションセットはこまめに削除していただくことをお勧めします。

Push/Pop/Clearは、選択状態を一時的に保存しておくための簡易的なSelection Setです。名前をつけて選択状態を保存しておくほどではないけれど、一時的に現在の選択状態をどこかに退避しておきたいときに使用します。Modoでは頂点、エッジ、ポリゴンの選択状態は個別に保存されいますので、選択モードを切り替えても元の選択状態を得る事ができます。Blenderでは例えばFaceからVertに選択モードを切り替えると選択されていたFaceを構成するVertが選択に変換されてしまうので、以前のVertの選択状態は変更されてしまいます。選択モードを切り替える時など維持的に現在の選択状態を退避しておきたいときに使用する事ができます。



2025年8月21日木曜日

YT-Tools for Blender (Set Positions)

YT-Toolsのバージョン1.1では、ベンドツールの他に選択した頂点の座標値の成分を指定した値にセットしたり、全体をセンタリングするオペレータを追加いたしました。

選択した頂点のX/Y/Z座標値をしてした値に揃える操作は、サイドバーのItemにあるTransformで値を揃える事ができると思ったのですが、値を入力すると相対的に選択した頂点の成分値がシフトしてしまい、値を揃える事ができませんでした。おそらくBlender流の標準的な良い方法があるのだと思うのですが、見つけられなかったので実装してしまいました。

Set Positionsは、頂点を選択した状態で起動すると実行パネルが表示され、変更を行うX/Y/Zのトグルボタンと入力値を表示します。このデフォルト値は、最後にクリックしたアクティブエレメントの頂点座標値が設定されます。投げ縄などで一括して選択した場合は、選択されている頂点の平均値が設定されます。たとえば、Y軸の値だけをある頂点の位置に揃えたい場合は、そろえたい頂点を先に投げ縄などで選択してから、SHIFTキーを押して基準となる頂点を最後に選択するとその頂点の値がデフォルト値になります。選択した頂点の平均値に値を揃えたい場合は、投げ縄などで一括選択すると選択された頂点の座標値の平均値がデフォルト値に設定されます。ちょっとした事ですが、覚えておくと設定値を手動で入力する一手間を減らす事ができます。



Center Positionsは、選択した頂点のバウンディングボックスを計算し、トグルボタンで指定したX/Y/Zの軸方向に限定して、バウンディングボックスの中心位置が原点に来るように移動します。Set PositionsCenter PositionsもこのX/Y/Zのトグルボタンが縦並びになっていて、ちょっとダサいのです。横並びにする方法が見つかったら将来のバージョンで変更しておきます。



2025年8月20日水曜日

YT-Tools for Blender (Bend Tool)

YT-Tools for Blenderバージョン1.1をリリースいたしました。主な変更点は下記の通りです。

  • Bend Transformオペレータの追加
  • 頂点座標値の設定
  • 頂点座標値のセンタリング
  • Radial TransformにInvertオプションを追加
ベンドツールはBlenderの標準のツールセットに存在する他、アドオンの中にもベンドツールをサポートするものがあるようです。ただし操作性に関してはModoのベンドツールとは異なっていたり、対称をサポートしていなかったりと期待通りに使えない事があるようなので、YT-Toolsに独自のベンドツールを実装いたしました。ハンドル操作に関してはModoにもない操作を工夫しています。

Edit ModeBend Transformを起動すると選択されているエレメント、選択がない場合はメッシュ全体の境界ボックスを計算し、最も長い主軸の方向にベンドハンドルを表示します。マゼンダ色のスパインベクトルに沿って白い円のハンドルの中心位置を基準に選択されているエレメントの頂点位置が変形します。ベンドを行う基準平面はAxisでX/Y/Zの主軸に設定するか現在表示しているビュー平面を基準に定義します。選択しているポリゴンの方線方向などでベンドする場合は作業平面と組み合わせて使用してください。


ベンドのオペレーションは、このベンドハンドルを変形を行いたい位置に素早く配置する事が重要になります。Linear TransformなどでもサポートしているAuto Fit機能がありますので、この機能を使って方向性バウンディングボックスなどに沿ってハンドルをフィットさせる事が可能です。ベンドハンドルの方向を反転したい場合はReverseボタンを押して反転させる事ができます。

また、ベンドハンドルをフィットさせた後、ハンドルの方向を固定した状態で、ハンドルのサイズを変更したり、回転中心をベクトルに沿ってスライドさせたい場合は、SHIFTキーを押しながらベンドハンドルの端点のハンドルをドラッグして調整する事ができます。



逆にハンドルの中心点を固定し、ベンドハンドルのベクトル方向だけをフィットさせたい場合は、Spine Onlyを有効にしてAuto Fitを実行してみてください。

Both Sidesは、Modo 17.0でBend Toolに追加したオプションと同じで、ベンドハンドル方向と反対側にある頂点も同時に湾曲します。




2025年8月19日火曜日

YT-Tools for Blender (Edge Slice)

Edge Sliceは、クリックしたエッジからエッジを結ぶラインでポリゴンを連続したスライスする機能です。BlenderではKnifeツールが同様な機能を持つ標準ツールだと思います。このEdge Sliceでは対称のサポートが最も重要な要件の一つでした。ツールハンドルの処理やスライスラインがクロスする場合など複雑な処理が必要だったため、YT-Toolsの中では実装に一番時間がかかったツールです。

基本的な操作はメッシュ上のエッジを次々にクリックし、ポリゴンをスライスするラインを追加していきます。クリックしたラインが他のエッジを跨ぐ場合は、マウスボタンを離したタイミングで現在のビュー方向でスライスラインと交差するエッジ上の交点を計算し、新しいハンドルを追加します。ポリゴン上をクリックしてエッジ以外のポリゴン上の位置にもハンドルを追加することも可能です。

追加したハンドルの位置は全て後からエッジ上をスライドして調整する事ができます。Shiftキーを押しながらエッジをクリックするとエッジの中心にハンドルを配置する事ができます。また、Controlキーを押しながらハンドルをドラッグするとエッジ上を1/10間隔でスナップして位置調整することができます。

操作感覚はBlender標準のKnifeツールとは異なりますが、メッシュを対称にスライスしたり、ハンドルの位置調整を容易に行う事ができます。



2025年8月16日土曜日

YT-Tools for Blender (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 for Blender (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 for Blender (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 for Blender (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ビューでモデリング












2025年3月31日月曜日

Parameterize キット

Parameterizationのアルゴリズムを比較する研究目的でParameterizeキットを作ってみました。Parameterizationは、3次元空間のメッシュを2次元空間にマッピングするためのアルゴリズムの呼称で、3DCGツールではUV展開の手法として使用されています。Modoでは初期のバージョンからLSCM(Least Square Comformal Maps)やABF++などのアルゴリズムがUV UnwrapツールやUV Relaxツールとして実装していましたが、その後はあまりアップデートしていませんでした。

CDT TriangulationキットやSkeletonキットを作った際に、CGALやlibiglがさまざまなParameterizationの機能を提供していたので、Modoで試してみれるようにプラグインにしてみました。自分の研究目的で作ったキットですので、Modoの機能としてはあまり実用的ではないかもしれません。すみません。

境界を固定化したパラメータ化

これは3DCGのUVツールでは、あまり利用されることはないと思いますが、円もしくは四角形などの固定された境界の中に3次元空間のメッシュをマッピングするアルゴリズムです。計算方法は、Tutte Barycentric Mapping、Floater Mean Value Coordinates、Discrete Conformal Map、Discrete Authalic Parameterizationなどがあり、展開するポリゴンの角度比率の歪みを最小限にしたり、面積比率を最小化するなど各アルゴリズムで特徴があります。


LSCM(Least Square Comformal Maps)

おそらくUV Unwrapのアルゴリズムとして、最も一般的に使われている手法ではないかと思われます。角度の歪みの最小化は、コーシーリーマン方程式の最小二乗近似に基づいており、角度の歪みや非一様なスケーリングを最小化します。計算には少なくとも2つの頂点を固定しておく必要があります。初期の頃に公開された比較的ベーシックなアルゴリズですが、計算が比較的安定しているので、多少イレギュラーなメッシュであっても安定して計算結果をえることができるのが良いです。Least Squares Conformal Maps for Automatic Texture Atlas Generationという論文がもとになっています。Modoでは、ユーザーが手動で計算の反復回数を指定するようにしていますが、CGALでは収束するまで自動的に計算を反復するようです。



ARAP (As Rigid As Possible Parameterization)

As Rigid As Possible (ARAP) パラメータ化は、3D形状を2D平面に展開する際に、形状の局所的な変形の少なさを最大限に保つことを目的とした手法です。剛性の維持を実現するために、局所的な回転や移動を許容する代わりにスケールの歪みを最小にします。エネルギー関数を定義し、その最小化を通じて形状の変形を非線形で計算するため、LSCMに比べて計算コストが大きいようです。剛性の維持を優先したいUV展開では良い結果を得ることができそうですが、計算量が多くちょっと遅いです。



SLIM (Scalable Locally Injective Maps)

SLIM(Scalable Locally Injective Maps)は、メッシュパラメータ化や変形において局所的な単射性(local injectivity)を維持しながら、歪みを最小化するアルゴリズムです。計算結果で得られた三角形がすべて正しい方向に向くように保持されるのが特徴です。計算効率も良く等角度と等長の歪みバランスをよく保持してくれる点が優れています。BlenderのUV UnwrapにもMinimum Stretchのモードで実装されています。このキットではlibiglが提供するSLIMの機能をEigenを使って計算しているのですが、UVの初期値の三角形がフリップしていたり、重なったりしていると計算がなぜか失敗してしまいます。Blenderではプロダクションレベルで使用されているようなので、私の実装の方法がまだどこかおかしいのかもしれません。






2025年2月23日日曜日

Straight Skeleton キット その2

Straight Skeletonキットをv1.0.1に更新しました。主な変更はクラッシュバグの修正とExtrudeモードでMaximum Heightでクリップされたトップポリゴンの三角形をできるだけマージするように変更しました。Extrudeモードで作成する形状は基本的に三角形で出力されるので同一平面上の三角形はできるだけまとめておいた方が使いやすそうです。

また、実験的にですが要望があったInsetモードをBETA版として追加してみました。これはStraight Skeletonの出力結果を使って、可能な限り交差の少ないポリゴンのインセットを行うことを目的としています。アイディアとしては、Extrudeで作成されたメッシュの元の輪郭上の頂点から、分岐されたエッジを高い方向かつ距離が短い方向にエッジをMaximum Heightの高さまで辿っていくことで輪郭の頂点とスケルトンを構成する頂点を結ぶベクトルを求めようとする試みです。ただし、この方法だとExtrudeした形状のピークが複数ある場合、低い方のピークに辿り着いた検索エッジがより高いピークを探してしまうため、何かしらの方法で検索をストップさせる条件を見つける必要があります。また、新しくインセットで作られたポリゴンのUVは保管されていないので、これも正しく実装する必要があります。Modoのポリゴンベベルでは3Dポリゴンのインセットの情報をもとにUVポリゴンもUV空間で一つ一つインセットを行うという結構めんどくさいことをしていました。良いアイディアが見つかりましたら、Insetモードの残りの問題にチャレンジしてみたいと思います。




2025年2月13日木曜日

Straight Skeleton キット

 Straight Skeleton キットを公開いたしました。Straight Skeletonは、2Dポリゴンの中心線カーブを求めるアルゴリズムで、等高線の作成や3次元地形モデル、建築物の屋根のモデリングなどで利用されています。外郭を構成する線分を等速で移動させ、それらが衝突などで発生したイベントごとにトポロジーを更新していくアルゴリズムです。

前回、CDT三角形分割で利用したCGALにStraight Skeletonライブラリがありましたので、これを利用してModoのプラグインを作ってみました。CGALのStraight Skeletonライブラリは機能が豊富でしたのでこのプラグインでは、実験的に複数のモードを用意し、異なる結果が得られるようにしてみました。もっと便利な使い方はこれから研究してみたいと思います。

Skeletonモード

これはポリゴンの背骨となる中心線(Straight Skeleton)を求め、ポリゴンの外郭を構成する頂点とで作られる複数の平面にポリゴンを分割します。



アップロード中: 127810 / 127810 バイトをアップロードしました。



Extrudeモード

これはポリゴンの輪郭線をStraight-Skeletonの押し出し機能を利用して立体的な押し出し形状を生成します。押し出しはゴールとなる中心線の高さとなり、Maximum Heightを指定することで中間の高さまで押し出しを制限することができます。中心線の高さは固定されていますので、Scaleを使って高さを調整できるようにしました。


Duplicateモード

Duplicateはポリゴンの輪郭線をStraight-Skeletonの中心線の内側もしくは外側に向かってオフセットしたポリゴンを作成する機能です。オフセットした形状は複数のループに分割されたり、交差部分が融合する場合があります。段階的にオフセットしたポリゴンが一度に得られるように、ShiftオプションとStepsオプションを追加しています。


Offsetモード

OffsetはDuplicateと同じ方法でもとのポリゴンのオフセットループを求めていますが、新しくポリゴンを作る代わりに、元のポリゴンの各頂点の座標値を最も近い位置にあるオフセットループの頂点座標値に移動しています。これによりコーナー部分に交差のないインセットを行うことができます。Mergeオプションをオンにしておけば、同一点に収束された頂点はマージされます。この方法は元の頂点とオフセットループの頂点の距離を使ってインセットを行っていますので、オフセットループのトポロジーが極端に変更された場合などでは、インセットされたループは破綻する場合があるので注意が必要です。



2025年2月4日火曜日

Part Falloff

 FoundryでModoの開発をしていたChris Hagueが自身のGithubでPart Falloffというサブツールを公開しています。ChrisはLuxologyからFoundryへ来たデベロッパーの一人でModoのアーキテクチャに関するスペシャリストです。Modo17.0のマルチスレッドを使った新しいModoのアーキテクチャをデザインしたのもChrisで、Modoの内部構造に関しては一番詳しいのではないかと思います。

Part Falloffは、リニアフォールオフに似たフォールオフサブツールです。リニアフォールオフがフォールオフ影響範囲にある頂点の座標値に対してウェイトを頂点ごとに線形に設定するのに対して、Part Falloffは、連結されたポリゴンのグループの中心を評価し、グループ単位にフォールオフウェイトが設定されます。いままでありそうでなかったフォールオフサブツールで便利そうですね。



Modoにはツールパイプラインというアーキテクチャがあり、フォールオフ、アクションセンター、アクションアクシスなどが独立したツールとして実装されていて、他のメインツールと組み合わせて使用することができます。プラグインであとからPart Falloffなどのサブツールが追加されると組み合わせでどんどん面白そうなコンビネーションツールが増えていきます。

ChrisのGithubには、Part Falloffのリポジトリにはソースコードのみが公開されています。このツールを使用するには、ターゲットとするOS向けに自分でソースコードをビルドするか、DiscordのPixel Fondueのサーバーの#modo-contentからPartFalloff.lpkをダウンロードする方法があります。