はじめに
カーブに沿って何かを配置したい事があります。そんな時に使えそうなノードなので見てみます
Curve Zero-Twist Frame
参照元
https://github.com/nortikin/sverchok/blob/master/docs/nodes/curve/zero_twist_frame.rst
機能
このノードは、カーブに沿って移動している間に、カーブの接線を中心とした回転が最小となるような、カーブに沿った参照フレームを計算します。
そのようなフレームを算出する為に2つのアルゴリズムが実装されています。
最初のアルゴリズムはカーブの接線(負の方向)を中心にカーブのFrenetフレームを回転させることです。より正確に言うと、カーブのねじれの不定積分が計算され、カーブの始点から他の点に移動している間に、接線の周りのフレネットフレームの総回転を得ます。
不定積分はカーブの領域を細分化して数値的に計算されます。使用する個数が多ければ多いほど計算は正確になりますが、時間がかかります。そこで、このノードでは、使用する曲線の細分化の数を指定することができます。
ノート: ゼロの曲率のポイントのFrenetフレーム(または曲線の直線セグメント)は正確に計算する事は不可能であり、したがって最初のアルゴリズムはそのようなケースで失敗することがあります。
二番目のアルゴリズムは、カーブの開始点で法線方向を取り、次の「結び目」点でカーブの接線に垂直な平面上に前の法線方向を投影することによって、カーブに沿って法線方向を「追跡」することです。次に、任意の点でのフレームは、四分儀線形補間によって計算されます。2つ目のアルゴリズムは、任意の曲線で動作することが想定されています。
入力
- Curve 必須フレームを計算するカーブ
- Resolutionねじれ積分を計算するために曲線を細分化するセグメントの数です。値が大きいほど正確な計算ができますが、時間がかかります。デフォルト値は50です。
- T フレームを計算する部分を指すカーブのTパラメータ。初期値は0.5
パラメータ
- Algorithm下記の値が利用可能です
- Integrate torsion カーブのFrenetフレームマトリックスからカーブのねじれ不定積分を”減算して”フレームを計算します
- Track normal カーブに沿った法線の方向を”追跡して”フレームを計算します
- デフォルトのオプションはIntegrate torsionです
- Joinチェックが入っている場合、すべての入力カーブに対するマトリックスのリストをフラットな単一のリストで出力します。そうでなければ入力カーブ毎に別々のマトリックスのリストを出力します。チェック状態がデフォルトです。
出力
- CumulativeTorsion カーブの始点から指定されたTパラメータ値に移動したときの、カーブの接線を中心としたカーブのフレネットフレームの回転角度の合計。角度はラジアンで表されます。この出力は、アルゴリズムパラメータがねじりの積分に設定されている場合にのみ使用できます。
- Matrix Tパラメータの指定値におけるカーブのゼロツイストフレーム。行列の位置成分はカーブの点です。マトリックスの Z 軸は、カーブの接線に沿った点です。
その他
使用例が公式にあるので見てみてください
使ってみる
サンプル1
![](https://ken26u.blog/wp-content/uploads/2020/12/ZeroTwistFrame-1024x634.png)
- 黄色い部分で何かを沿わせる為のカーブを作成
- (0, 0, 0) から (3.5, 0, 0)までの直線を作成した後でノイズを加えゆがめている
- 赤い部分でカーブに沿って10箇所のマトリックスを生成
- ここでCurve Zero-Twist Frameを使用
- 青い部分でスザンヌ(モンキー)をカーブに沿って配置
- Curve Zero Twist Frameの出力のまま使用するとスザンヌの首から頭頂部にかけてカーブが沿うようになるため、回転と縮小する為もう一つのマトリックスを作成し乗算
- 灰色の部分はカーブを表示する為だけに配置している
サンプル2
![](https://ken26u.blog/wp-content/uploads/2020/12/image-22-1024x573.png)
- 黄色い枠でベジェ曲線を作成する為の頂点を作成
- Circleをスケーリングまたは移動を4回行った各頂点から曲線を作成
- 赤い枠で曲線を生成
- Bezier Splineを生成しEvaluate Curveでメッシュデータ化、それをPolyline Viewerに渡しオブジェクト化
- 青い枠でパイプのジョイントのようなものを作成
- Curve Zero-Twist Frameで曲線のTで示すポイントのMatrixを取得
- Tには0 ~ 1を10分割したポイントを渡し各曲線10ポイントのMatrixを取得
- Cylinderをオブジェクト化し、Curve Zero-Twist Frameで得たデータを渡し回転させる
- Curve Zero-Twist Frameで曲線のTで示すポイントのMatrixを取得
- 緑の枠は中央の台に見えるシリンダー
- 白い枠は画面上にBezier Splineを生成する為に使用したCircleを表示する目的で配置
最後に
🙂こんないいノードがあったんですね。まさにほしかったものが知れました