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と同じアイディアに基づくものです。頂点数の多いメッシュの処理では、ハンドルがストレスなく動作します。
0 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。