2025年10月31日金曜日

Decimate キット

久しぶりにModoのキットを作ってみました。最近はYT-Toolsの機能拡張ばかりを行っていましたので、プログラミングもPythonばかりでC++を忘れてしまいそうだったのでリハビリも兼ねてDecimateキットというポリゴンリダクションのツールを作ってみました。研究目的の実験的なツールなので、あまり実用性はないかもしれません。


今回もCGALライブラリを利用しており、Triangulated Surface Mesh Simplificationをベースに実装しています。このパッケージで提供するポリゴンリダクションのアルゴリズムはプライオリティキューに入れたエッジを順番に折りたたみ、結合した2つの頂点の位置を再配置するという従来からのアルゴリズムで折りたたむエッジの順番を評価し、結合頂点を再配置するCost Strategyに関する手法がいろいろ研究されています。

近年では高密度のメッシュからアニメーションなどでも利用可能な最適化されたトポロジーをメッシュを求める手法が主流になっていて、リトポロジーの操作も半自動でできるツールも出てきています。実用的にはエッジを折りたたむ従来からのポリゴンリダクションはもうあまり出番がないかもしれませんが、単純にポリゴン数を減らしたい場合などにはまだ活躍できるかもしれません。

このキットではCGALが提供する3つのアルゴリズムをCost Strategyというオプションから選べるようにしています。

Edge Lengthは、最も単純な方法で長さの短いエッジから順番にエッジを折りたたみ、結合した頂点はエッジの中間位置に再配置します。単純ですが一番高速です。ModoのPolygon Reductionもこの方法に近いです。

Lindstrom-Turk Cost and Placement Strategyは、簡略化された表面メッシュを各ステップで元の表面メッシュ(または前のステップの表面メッシュ)と比較しない手法をとっていて、元の表面メッシュや局所的な変更履歴といった追加情報を保持しないため、メモリコストに優れています。Decimateキットではこれをデフォルトにしています。

Garland-Heckbert Cost and Placement Strategyは、結果のメッシュを元のメッシュと比較せず、局所的な変更履歴にも依存しまが、各頂点に割り当てられた二次行列を用いて、元のメッシュへのおおよその距離を符号化します。これにより均一な三角形分割を作成できるようになり、特徴感度を維持しながらノイズに対する耐性が向上するという手法らしいです。

また、境界のポリゴンにあるエッジやマテリアルとマテリアルの間にあるエッジなど重要なエッジを指定するオプションを用意しました。これらに該当するエッジはCGALのedge_collapse関数に拘束エッジ(constrained edges)としてインプットされます。Modo上でロックを設定したエッジは自動的に拘束エッジになります。

リダクション処理を終了する条件は、全体のエッジ数に対する比率もしくは折りたたむエッジの数で指定します。Decimateキットでは内部的に対象ポリゴンを三角形に分割してから処理を行っているため、最終的なポリゴン数は元のメッシュのエッジ数からの比率にはならないことに注意してください。縮退しなかった三角形は可能な限り元のポリゴンに戻しています。



2025年10月25日土曜日

YT-Tools for Blender (Clipboard その2)

前回v1.5で実装したクリップボードの動作をユーザーのみなさんからのフィードバックに基づきマイナー変更いたしました。v1.5.1のクリップボードはコピー&ペースト実行後のエレメントの選択がModoと互換になっています。エレメントをコピーした後、コピー元のエレメントの選択状態はそのまま選択状態を保持し、ペーストしたエレメントは選択状態になります。これらの動作は初期設定パネルで変更することができるようにいたしました。v1.5の動作はModoの初期バージョンやLightWaveのコピペの動作と近いものになっていました。


また、メッシュのエレメントと同様にカーブのスプラインに対しても同様のコピー&ペーストができるようにして欲しいとのリクエストがありましたので、対応いたしました。Blenderにはスプライン単位の選択というモードがないようですので、カーブ内の特定のスプラインをコピーする場合はスプラインを構成する全てのポイントを選択してからコピーを行います。スプラインを構成するポイントを選択しやすいようにダブルクリックで実行するコンテキスト選択もスプラインで動作するように変更いたしました。



2025年10月18日土曜日

YT-Tools for Blender (Clipboard)

YT-Tools for Blender v1.5を公開したしました。今回のアップデートではソフトドラッグを改良し、UVエディタ上のUVマップを編集できるようにしたのと、メッシュエレメントのコピー&ペーストを行うためのクリップボードの実装です。

Modoではツールの設計思想に"Generalize"という概念があって、一つのツールが異なる編集対象に対して、同一の操作性を提供できるように実装されていました。トランスフォームツールやペイントツール、スカルプとツールなど多くのツールはメッシュ、UV、アイテムに対して動作するように作られています。

今回はYT-Toolsで実装したソフトドラッグがUVマップの編集で動作するように改良いたしました。ツールを切り替えることなく、クリックしたビューが3Dビューの場合はメッシュの頂点の編集、UVビューをクリックした場合はUVマップの編集を行います。UVビューでの対称は、U方向をX軸、V方向をY軸に設定して動作するようにしています。UVの対称軸はクリックしたUVの正規化空間(UDIM)によって決定しています。クリックした箇所が(0,0)-(1,1)の空間であれば対称軸が0.5になります。クリックした箇所が(1,0)-(2,1)で対称がU方向の場合は1.5が対称軸になります。


コピー&ペーストを行うためのアドオンは他にも公開されているようですが、YT-Toolsで実装して欲しいとの要望がありましたので、v1.5で実装いたしました。YT-ToolsのクリップボードはモデリングワークフローのサブツールとしてEdit Modeでのみ動作し、メッシュのポリゴン、エッジ、頂点のコピー&ペーストに特化しています。ポリゴンを選択しCopyボタンを押すと選択したポリゴンがクリップボードの内部メッシュにコピーされます。Pasteボタンを押すとコピーされたポリゴンがアクティブメッシュに貼り付けられます。アクティブメッシュはコピー元のメッシュでも別のメッシュでも構いません。クリップボードのデータは次回またコピーを行うまで保存されます。クリップボードにはポリゴンの基本データの他に下記のような属性もコピーされます。
  • マテリアル
  • UVマップ、頂点カラー、シェイプキー
  • エッジクリース、スムース、シーム、Freestyle
  • 頂点ウェイト(頂点グループ)
"クリップボードから新規メッシュ作成"というボタンは、澤田さんからいただいたアイディアで、新しいメッシュオブジェクトを作成した後に、そこにクリップボードのデータを貼り付けます。macOSのプレビューといアプリにある"クリップボードから新規作成"というメニューと同じ感覚で使うことができます。作業中のメッシュの一部分を別のメッシュオブジェクトに分離したい時の手間暇が少し改善されると思います。







2025年10月7日火曜日

YT-Tools for Blender (日本語UI)

YT-Tools for Blenderv1.4.1を公開いたしました。今回のバージョンではUIの日本語化を行っています。Blenderのプリファレンスのインターフェイスタブで言語を日本語に設定するとYT-ToolsのUIが日本語に変わります。



Blenderには、内部に翻訳辞書というものがあり、言語を日本語などに設定するとアドオンなどのメニューもこの翻訳辞書に存在する用語は自動的に翻訳されたテキストが表示されます。従って多言語化を考えずにアドオンを作ると部分的にローカライズされたUIが表示されてしまいます。翻訳テキストはグローバルな辞書にも登録できますし、アドオンの独自のカテゴリでのみ使用するローカルな辞書として登録する方法もあります。なぜかマウスカーソルを重ねた時に表示される文字列はグローバル辞書でないと翻訳文字列が表示されなかったりなど、まだ謎の仕様があります。ベターなアドオン翻訳のためにもう少し調査が必要なようです。



2025年9月24日水曜日

YT-Tools for Blender (Snapping)

v1.4を公開いたしました。このバージョンでは以前から要望があったツールハンドルのスナップに対応しています。Blenderのスナップ処理は外部には公開されていないので、アドオンはスナップパネルで設定されているスナップの設定項目を参照し、アドオンで独自に実装しました。YT-Toolsでは下記のようなスナップ設定項目をサポートしています。

Snap Target

Increment, Grid, Vertex, Edge, Face, Edge Center, Edge Perpendicularに対応しています。Vertexではメッシュの頂点およびカーブの制御点にスナップします。

Target Selection

Include Activeがオフの時にはアクティブオブジェクトのエレメントにはスナップしません。

Affect

Move, Rotate, Scaleに対応しています。

Rotation Increment

標準のインクリメンタル角度を参照します。


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を無効にして試してみてください。