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をダウンロードする方法があります。