はじめに
Sverchokのドキュメントを色々見始めて少し経つけど、一番最初に気になったくらいのノードがこのノード。
しかしどう使ってもエラーになるので使わないようにしていた。
今回Sverchokに色々機能が追加された為、もしやして使える様になったか?という事でドキュメントを見てみる
参照元
Adaptive Polygons MK2
機能
このノードはドナーと呼ばれる1つの(変形された)オブジェクトのコピーを受信者と呼ばれる別のオブジェクトの面に沿って配置します。
コピーされたドナーオブジェクトは受信者の面の形と法線にマッチするように変形されます。
このノードの主にQuad(四角メッシュ)とTris(三角メッシュ)で動作します; もしNGons(N > 4)を適用しようとすると、奇妙な結果を生むでしょう。
オプションとして、このノードはいわゆるFrame/FanモードにおいてならNGonsも処理できます。このモードでは受信者のメッシュのそれぞれの面はいくつかのQuadsかTrisに置き換えら、次に通常通り処理されます。
または受信者ノードをInset Specialノードを通してTissueのFanやFrameモードと類似の結果を得ることが出来ます。
多くのケースでこのノードの出力をRemove Doubleノードに通すことは良いアイデアです。
このノードはAlessandro Zomparelli(sketchesofcode)のオリジナルコードから許可を得てた上で基づいています。さらなる機能はその後Alesandroによって開発されたTissueアドオンにあります。
入力
このノードは下記の入力があります
- VersR 必須 受信者オブジェクトの頂点
- PolsR 必須 受信者オブジェクトの面。各面のインデックスの順番がドナーオブジェクトの回転に影響を与えることを覚えておいてください。例えば
[0, 1, 2, 3]
は1回転、[3, 0, 1, 2]
は90度回転と同じ。 - VersD 必須 ドナーオブジェクトの頂点
- PolsDドナーオブジェクトの面
- FaceDataD ドナーオブジェクトの各面における任意のデータアイテムを含むリスト。例えば、ドナーオブジェクトの面のマテリアルインデックスが与えられたりするでしょう。
- Width coeff ドナーオブジェクトの幅の係数(通常はX、Yに沿ったサイズ)。初期値は 1.0。この入力はドナーオブジェクトの各面毎に1つの番号を期待する。
- Frame width “Frame/Fan”モードにおけるframeの幅。最大値の1.0は面の中心からのギャップが無いことを意味する。なのでこれは”Fan”モードとなる。初期値は0.5。この入力はFrameモードのパラメータが設定されている場合のみ使われそれ以外の場合は使われない。
- Z coeff ドナーオブジェクトの係数のサイズで、受信者オブジェクトの面の法線に沿ったものです。正確な意味はZ scaleパラメータに依存します(下記を参照)。初期値は1.0。入力値は受信者オブジェクトの各面に1つの数値を期待しています。
- Z offset ドナーブジェクトのオフセットで受信者オブジェクトの面の法線に沿っています。初期値は0.0。この入力は受信者オブジェクトの各面毎に1つの数値を期待しています。
- Z Rotation ドナーオブジェクトの回転で受信者オブジェクトの面の法線に沿っています。初期値は0.0。この入力は受信者オブジェクトの各面毎に1つの数値を期待しています。
- PolyRotation 受信者オブジェクトの各面のインデックスの回転。初期値は0。例えば、受信者の面が
[3, 4, 5, 6]
で定義されていて、PolyRotationが1で設定されている時、面は[4, 5, 6, 3]
と解釈される。これはドナーオブジェクトの向きに影響する。 - PolyMask 受信者オブジェクトの面処理の為のMask。マスクアウトされた顔をどのように処理するかは、Mask Modeパラメータ(後述)で定義されています
- Threshold “remove doubles”と”merge by sitance”関数で統合するしきい値。初期値は0.0001。この入力はRemove doublesパラメータにチェックが入っている時のみ表示される
パラメータ
このノードはいくつかのパラメータがあり、それらの多くはNパネルからのみアクセス可能です。
- Join もしチェックが入っているなら、コピーされ生成されたすべてのドナーオブジェクトは1つのオブジェクトに統合される。チェックされていない状態がデフォルト
- Remove doubles もしチェックが入っているなら”Remove doubles”/”merge by distance”関数が結果のメッシュに適用される。例えば頂点がほぼ同じ位置にある場合、1つに統合される。統合しきい値はThreshold入力パラメータにより制御される。このパラメータはJoinパラメータがチェックされている場合のみ表示される。デフォルトはチェックなし。
- Matching mode ドナーオブジェクトのリストをどのように受信者オブジェクトのリストにマッチさせるかを定義します。利用可能な値は
- Match longest 受信者とドナーオブジェクトのそれぞれのペアが処理されます。例えば、2つの受信者と2つのドナーオブジェクトがあるなら2つの出力となります。recipient[1] + donor[1] と recipient[2] + donor[2]。もしどちらかのリストが他のリストより短い場合、最後のオブジェクトが必要な分だけ繰り返されます。例えば1受信者に対して2ドナーオブジェクトの場合2つの出力はこのようになります recipient[1] + donor[1] と recipient[1] + donor[2]。
- Donor per face ドナーオブジェクトのリストは”1つのドナーオブジェクトが1つの受信者オブジェクトの面”として扱われます。出力の数は受信者オブジェクトの数によって定義されます。
- デフォルトはMatch longestです
- Normal axis ドナーオブジェクトの軸を受信者オブジェクトの面の法線に合わせます。利用可能な値はX、YとZで、デフォルトはZです。
- Z Scale これは受信者の面の法線に沿ってドナーオブジェクトのサイズをどう計算するかを定義する。利用可能な値は
- Proportional サイズはZ coeff入力とZ軸(またはNormal axisパラメータで定義された部分で計算される)を掛けた値にそって計算される
- Constant サイズはZ Coeff入力から取る
- Auto 他の2つの軸に沿ったスケールに基づいて、スケールを自動的に計算する。自動的に計算された値をZ Coeff入力から取得した値で掛ける
- デフォルトはProportional
- Use normals これは受信者オブジェクトの法線がどのようにドナーオブジェクトを変形させるかに使われる。利用可能な値は
- Map 受信者オブジェクトの頂点法線間の補間はドナーオブジェクトの変形に使用される。この結果スムーズな結果が生成される一方で、ドナーオブジェクトの変形量が多くなる
- Face 受信者オブジェクトの面の法線はドナーオブジェクトの方向を決めるのに使われる。ドナーオブジェクトの変形量が少なくなるが、コピー間のギャップができる
- デフォルト値は Map
- Interpolate normals このパラメータはUse normalsがMapに設定される場合のみ利用可能。これは受信者オブジェクトの頂点法線間の補間メソッドを定義する。利用可能な値は
- Linear 線形補間が使われる
- Unit length 線形補間が使われるが、結果の法線は1.0の長さでリサイズされる。これはあるケースではよりスムーズな結果を生む
- 初期値はLinear
- Use shell factor もしチェックが入っているなら、各頂点の法線は”Shell factor**と呼ばれるものに乗算される。頂点のシャープネスに基づいて計算された数。flatは表面は1.0で、それより高い値はよりシャープな辺を持つ。このパラメータがチェックされている場合、結果の形はの”Thickness”はよりコンスタントになる。チェックされていない場合、形はよりスムーズになる傾向がある。チェックされていないのがデフォルト
- Coordinates 受信者の面の法線に直交する2軸に沿ったドナーオブジェクトの座標の計算方法を定義します。いずれにしても、ソース領域と呼ばれるXOY平面(法線軸パラメータに応じて他の平面でもよい)の一部の領域を受信者オブジェクトの面に変換することで位置が定義されます。問題は、ソース領域が何であるかということです。利用可能な値は以下の通りです。
- Bounds ソースエリアは下記の通り定義されます
- Quad受信者オブジェクトにおいて、ドナーオブジェクトの外接矩形が取られる
- Tris受信者オブジェクトにおいて、ドナーオブジェクトの外接三角形が取られます。外接三角形は最小の三角形と定義され、底面がX軸に平行な状態ですべてのドナー頂点を覆う(またはNormal axisパラメータの軸に従う)。三角形はBounding triangleパラメータに依存して正面か直方体となる。
- As is このソースエリアは下記の通り定義される
- Quad face [-1/2; 1/2] x [-1/2; 1/2] の単位の二乗を取る
- Tris face 単位三角形が取られる。三角形は*Bounding triangleパラメータに依存して正面か直方体として定義される。
- Bounds ソースエリアは下記の通り定義されます
Boundsモードの定義によって、ドナーオブジェクトは常にソース領域内にある事を注意してください。
As is モードではこのノードにわたす前にドナーオブジェクトを手動で変換することができます。ソース領域よりもドナーオブジェクトを小さくした時、大きくした時、またはその外側にした時に興味深い結果となります。
初期値はBoundsです
- Bounding traiangle ベース領域として使われる三角形の形を定義します。利用可能な値は
- Equilateral ベースの三角形はすべての側が同じサイズになります。CoordinatesパラメーターがAs isに設定されている時、この三角の中央は(0, 0, 0)で側面は 1 となります。Boundsモードでは、これは外接三角形になります。
- Rectangular 一つの角が90度の三角形としてベース三角形が定義されます。Coordinate パラメータが As is の時、次辺の中心を(0, 0, 0)として次辺の長さは2に等しくなります。Boundsモードの時、外接三角形になります。
外接三角形のイラストが下記にありますので見てください。初期値はEquilateralです。
- Frame mode これは”Frame/Fan”モードをいつ適用するかを定めます。利用可能な値は
- Do not use Frame/Fanモードは使われません
- NGons only Frame/FanモードはNGon(N > 4)のときのみ使われます。他の面は単純な置き換えモードで処理されます。
- NGons and Quads Frame/FanモードはNGonsでQuads(n >= 4)の時に使用されます。これは単純置き換えモードで処理されます。
- Always Frame/Fanモードはすべての面で使用されます。
初期値はDo not useです。
”Frame/Fan”モードは受信者オブジェクトの各面の外側からいくつかのQuad(FrameWidth < 1.0の時)やいくつかのTris(FrameWidth == 1.0の時)のいずれかを作成することに注意してください。これらのQuadsとTrisがどのように処理されるかはFaces modeのパラメータに定義されます。
- Faces mode これはQuadとTris受信者オブジェクトの面において、ドナーオブジェクトの変形(deform)がどのように計算されるかを定義します。利用可能な値は
- Quads/Tris Auto Quad面において、線形変形が使われます。Tris面においては受信者オブジェクト内のソース三角形の変形に重心変換が使われます。
- Quads Always このモードの時、Tris面は3番目と4番目の頂点が一致するQuadのように扱われます。そのような変形はドナーオブジェクトの1つの角を他に比べてシャープにし、Trisのあるケースでは奇妙な結果にもなります。しかしそのような結果は時に興味深いものです。Tissue addonは常にこのモードを使用しています。
初期値はQuads/Tris Autoです。
- Mask mode これはPolyMask入力によって除外された受信者オブジェクトの面をどうするかを定義します。利用可能な値は
- Skip そのような面は完全にスキップします。これはいかなる頂点も面も生成しません
- As is そのような面はそのまま出力されます。ある面の出力はそのまま受信者オブジェクトの面となります。
初期値はSkipです。
- NGons これはNGon(面を構成する頂点数が4より多い)の受信者オブジェクトの面をどうしたいかを定義します。利用可能な値は
- As Quads そのような面はQuadsであるかのように処理されます。Quadを形成するために最初の3つの頂点と最後の頂点を使います。そのような面では奇妙な結果を生み出します。
- Skip そのような面は完全にスキップします。これはいかなる頂点も面も生成しません
- As is そのような面はそのまま出力されます。ある面の出力はそのまま受信者オブジェクトの面となります。
初期値はAs Quadsです
ベース領域図
下記のイラストは”外接長方形”という言葉の意味を示しています(CoordinatesがBoundsに設定されている時、これはQuadとして使われます)
下記は単位正方形です(CoordinatesがAs isの時にQuadsとして使われます)
例
最後に
ふむふむZ coeffが影響のある範囲のドナーオブジェクトのサイズを変えて、Z Offset はドナーオブジェクトの位置を変える(視聴者オブジェクトからドナーが離れる)か…
Tissueアドオンの原案みたいなノードなのかな。
複雑でまだまだ理解していない機能があるけど、つまるところ受信側の各面にドナーを配置するみたいだ。