色は、効果的なビジュアルを作成するためだけではなく、ビジュアル プログラムの出力で差異をレンダリングするためにも重要なデータ タイプです。抽象的なデータや変化する数値を操作する場合、何がどの程度変化するのかを確認するのが難しいことがあります。Dynamo は、色の処理に優れたアプリケーションです。
Dynamo では、ARGB 入力を使用して色を作成します。これは、アルファ、赤、緑、青の各チャネルに対応しています。アルファは色の 透明度 を表し、他の 3 つのチャネルは、色のスペクトル全体を生成するための原色として組み合わせて使用されます。
アイコン | 名前(構文) | 入力 | 出力 |
---|---|---|---|
次の表に記載されている各ノードにより、色を定義するアルファ、赤、緑、青の各プロパティのクエリーが実行されます。Color.Components ノードは、これら 4 つのプロパティをそれぞれ異なる出力として生成します。そのため、色のプロパティのクエリーを実行する場合は、このノードを使用すると便利です。
アイコン | 名前(構文) | 入力 | 出力 |
---|---|---|---|
次の表に記載されている色は、HSB 色空間に対応しています。色を、色相、彩度、明るさに分割すると、より直感的に色を解釈することができます。たとえば、最初に処理する色を決め、次にその色の彩度と明るさを設定します。このように、色相、彩度、明るさをそれぞれ個別に設定していきます。
アイコン | 名前(構文) | 入力 | 出力 |
---|---|---|---|
色範囲は、#part-ii-from-logic-to-geometry の演習で説明した、数値のリストを別の範囲に再マッピングする Remap Range ノードに似ています。ただし、色範囲は、数値 の範囲にマッピングされるのではなく、入力された 0 から 1 までの数値に基づいて 色のグラデーション にマッピングされます。
現在のノードは正しく機能しますが、最初からすべてを正しく機能させるのは少し大変です。色のグラデーションを理解するための最適な方法は、色のグラデーションを対話式に試す方法です。ここでは、簡単な演習を行い、数値に対応する色の出力を使用してグラデーションを設定する方法を確認します。
3 つの色を定義する: Code Block ノードを使用して 0 から 255 までの適切な数値の組み合わせに接続することにより、赤、緑 、 青 を定義します。
リストを作成する: 3 つの色を 1 つのリストにマージします。
インデックスを定義する: 0 から 1 までの範囲で、各色のグリップ位置を定義するリストを作成します。緑の値が 0.75 になっていることに注意してください。これにより、色範囲スライダの水平方向のグラデーションの 4 分の 3 が緑色になります。
Code Block ノードを設定する: 0 から 1 までの値を入力することで、グラデーションを色に変換します。
Display.ByGeometry ノードを使用すると、Dynamo のビューポート内でジオメトリに色を付けることができます。この機能は、ジオメトリの各種タイプを区別する場合、パラメータの概念を表現する場合、シミュレーション用の解析凡例を定義する場合に便利です。この場合の入力は単純で、ジオメトリと色だけです。上の図のようなグラデーションを作成するには、color 入力を Color Range ノードに接続します。
Display.BySurfaceColors ノードを使用すると、サーフェス全体にデータを色でマッピングすることができます。この機能により、日照解析、エネルギー解析、近接度解析など、各種の解析で取得したデータを視覚化することができます。Dynamo では、他の CAD 環境でマテリアルにテクスチャを適用する場合と同様に、サーフェスに色を適用することができます。次の簡単な演習で、このツールの使用方法を確認します。
下のリンクをクリックして、サンプル ファイルをダウンロードします。
すべてのサンプルファイルの一覧については、付録を参照してください。
この演習では、パラメータを使用して、ジオメトリと並行して色の管理を行います。この演習で使用するジオメトリは、単純ならせん構造です。このらせん構造は、Code Block ノードを使用して定義します。これは、パラメータを使用する関数をすばやく簡単に作成するための方法です。この演習の目的は、ジオメトリではなく色を操作することであるため、コード ブロックを使用してキャンバスを見やすい状態に保ったまま、らせん構造を効率的に作成します。この手引ではより高度なマテリアルを取り上げるようになるため、ここからは、コード ブロックを頻繁に使用することになります。
Code Block ノードを使用して、上図に示す式を持つ 2 つのコード ブロックを定義します。これは、パラメータを使用してらせん構造をすばやく作成するための方法です。
Point.ByCoordinates ノードの座標(x,y,z)に Code Block ノードの 3 つの出力を接続します。
これで、らせん構造を形成する点の配列が表示されます。次の手順では、このらせん構造の点群から曲線を作成して、完全ならせん構造を作成します。
PolyCurve.ByPoints ノードの points 入力に Point.ByCoordinates ノードの出力を接続します。これにより、らせん状の曲線が作成されます。
Curve.PointAtParameter ノードの curve 入力に PolyCurve.ByPoints ノードの出力を接続します。この手順の目的は、曲線に沿ってスライドするパラメータのアトラクタ点を作成することです。この曲線によってパラメータの点が評価されるため、0 から 1 の範囲で param の値を入力する必要があります。
Number Slider ノードをキャンバスに追加したら、Min の値を 0.0 、Max の値を 1.0、Step の値を .01 に変更します。次に、Number Slider ノードの出力を Curve.PointAtParameter ノードの param 入力に接続します。らせん構造全体に沿って表示されている点を、スライダのパーセンテージとして表すことができるようになりました(開始点は 0、終点は 1)。
これで、参照点が作成されました。次に、この参照点から、らせん構造を定義する元の点までの距離を比較します。この距離により、色とジオメトリをコントロールします。
Geometry.DistanceTo ノードの other 入力に Curve.PointAtParameter ノードの出力を接続します。geometry 入力に Point.ByCoordinates ノードを接続します。
Watch ノードに、らせん構造の曲線を構成するそれぞれの点から参照点までの距離のリストが表示されます。
次の手順では、らせん構造の各点から参照点までの距離のリストを使用して、パラメータを設定します。また、これらの距離の値を使用して、曲線に沿った一連の球形の半径を定義します。これらの球形を適切なサイズに保つには、距離の値を 再マッピング する必要があります。
Math.RemapRange ノードの numbers 入力に Geometry.DistanceTo ノードの出力を接続します。
値が 0.01 の Code Block ノードを Math.RemapRange ノードの newMin 入力に接続し、値が 1 の Code Block ノードを Math.RemapRange ノードの newMax 入力に接続します。
いずれかの Watch ノードに Math.RemapRange ノードの出力を接続し、もう一方の Watch ノードに Geometry.DistanceTo ノードの出力を接続します。次に、結果を比較します。
この手順により、距離のリストがより狭い範囲に再マッピングされます。再マッピングの結果が適切な場合であっても、newMin と newMax の値を編集することができます。これらの値は、範囲全体で 分布比率 を保持したまま再マッピングされます。
Sphere.ByCenterPointRadius ノードの radius 入力に Math.RemapRange ノードの出力を接続し、元の Point.ByCoordinates ノードの出力を Sphere.ByCenterPointRadius ノードの centerPoint 入力に接続します。
Number Slider ノードの値を変更し、球体のサイズが更新されることを確認します。ここで、パラメータ ツールを使用します。
球体のサイズは、曲線に沿った参照点によって定義されるパラメータ配列を示しています。ここでは、球体の半径と同じ考え方で、球体の色を操作してみます。
Color Range ノードをキャンバス上に追加します。value 入力にマウス ポインタを置くと、0 から 1 までの範囲で数値を指定する必要があることがわかります。ここでは、Geometry.DistanceTo ノードの出力から数値を再マッピングして、それらの数値をこの範囲に対応させる必要があります。
Sphere.ByCenterPointRadius ノードでのプレビューを一時的に無効にします(右クリックして[プレビュー]を選択)。
Math.RemapRange ノードの numbers 入力にも同様にGeometry.DistanceTo ノードの出力を接続します。
Code Block ノードを使用して、Math.RemapRange ノードの newMin 入力の値として 0 を設定し、newMax 入力の値として 1 を設定します。この場合、1 つのコード ブロックで 2 つの出力を定義できることに注意してください。
Color Range ノードの value 入力に Math.RemapRange 出力を接続します。
Color.ByARGB ノードを使用して、2 つの色を作成します。この手順は複雑そうに感じるかもしれませんが、他のソフトウェアで使用する RGB カラーの場合と同じです。ここでは、ビジュアル プログラミングを使用して色を処理するというだけのことです。
Code Block ノードを使用して、0 と 255 という 2 つの値を作成します。次に、上の図のように、この 2 つの値を Color.ByARGB の各入力に接続します(または、任意の色を 2 つ作成します)。
Color Range ノードの colors 入力では、色のリストが必要になります。上の手順で作成した 2 つの色を使用して、色のリストを作成する必要があります。
List.Create ノードを使用して、2 つの色を 1 つのリストにマージします。次に、このノードの出力を Color Range ノードの colors 入力に接続します。
Display.ByGeometryColor ノードの geometry 入力に Sphere.ByCenterPointRadius ノードを接続し、Color Range ノードを Display.ByGeometryColor ノードの color 入力に接続します。これで、曲線領域全体にスムーズな色のグラデーションが適用されます。
前の手順の Number Slider ノードの値を定義内で変更すると、色とサイズが変更されます。この場合、色と半径のサイズは相互に直接関係しています。これで、2 つのパラメータ間の関係を視覚的に確認することができます。
下のリンクをクリックして、サンプル ファイルをダウンロードします。
すべてのサンプルファイルの一覧については、付録を参照してください。
最初に、Display.BySurfaceColors ノードの入力として使用するサーフェスを作成(または参照)する必要があります。この例では、正弦曲線と余弦曲線間をロフトします。
このノード グループ は、Z 軸に沿って点を作成してから、正弦関数と余弦関数に基づいてそれらの点の位置を変更します。その後、2 つの点リストを使用して NURBS 曲線が生成されます。
Surface.ByLoft ノードを使用して、NURBS 曲線のリスト間に、補間されたサーフェスを生成します。
File Path ノードを使用して、下流のピクセル データのサンプリングを行うためのイメージ ファイルを選択します。
File.FromPath ノードを使用してファイル パスをファイルに変換し、そのファイルを Image.ReadFromFile ノードに渡してサンプリング用のイメージを出力します。
Image.Pixels ノードを使用してイメージを入力し、そのイメージの X、Y 座標に対応して使用されるサンプル値を指定します。
Slider ノードを使用して、Image.Pixels ノードのサンプル値を指定します。
Display.BySurfaceColors ノードを使用して、色の値の配列を、X、Y 座標に対応してサーフェス全体にマッピングします。
400x300 のサンプル解像度で、出力サーフェスのプレビューを拡大します。
ARGB Color (Color.ByARGB)
A、R、G、B
color
アルファ(Color.Alpha)
color
A
赤(Color.Red)
color
R
緑(Color.Green)
color
G
青(Color.Blue)
color
B
コンポーネント(Color.Components)
color
A、R、G、B
色相(Color.Hue)
color
Hue
彩度(Color.Saturation)
color
Saturation
明るさ(Color.Brightness)
color
Brightness
データの最も単純な形式が数値だとするならば、数値を関連づける最も簡単な方法は数学的方法を活用することです。割り算のような単純な演算子から、三角関数などの複雑な計算式まで、数学的方法は数値の関係とパターンを調べるための非常に便利な方法です。
演算子は、代数関数と 2 つの入力値を組み合わせて使用する一連のコンポーネントであり、1 つの出力値を生成します(加算、減産、乗算、除算など)。演算子は、[Operators] > [Actions]で使用できます。
アイコン | 名前(構文) | 入力 | 出力 |
---|---|---|---|
下のリンクをクリックして、サンプル ファイルをダウンロードします。
すべてのサンプル ファイルの一覧については、付録を参照してください。
演算子と変数を組み合わせて、式を使用してより複雑な関係を形成します。スライダを使用して、入力パラメータでコントロールできる式を作成します。
1. この数列は、パラメータ式内の「t」を表しています。ここでは、サイズの大きなリストを使用して、らせん構造を定義します。
Number Sequence ノードで、start、amount、step という 3 つの入力に基づいて数列を定義します。
2.上記の手順により、パラメータ領域を定義するための数値のリストが作成されます。次に、黄金螺旋式を表すノードのグループを作成します。
黄金螺旋は、次の等式として定義されます。
次の図は、ビジュアル プログラミング形式の黄金螺旋を表しています。ここからは、順を追ってノード グループを確認していきます。ビジュアル プログラムと記述形式の等式との相違点に注意してください。
a.Number Slider ノードを使用して、キャンバスに 2 つの数値スライダを追加します。これらのスライダは、パラメータ式の変数である「a」と「b」を表します。これらの変数は、柔軟に変化する定数や、必要な結果に合わせて調整可能なパラメータを表します。
b.Multiplication (*) ノードはアスタリスクで表されます。このノードを繰り返し使用して、乗算変数を接続します。
c.Math.RadiansToDegrees ノードで「t」の値を角度に変換して、三角関数内でその角度を評価します。Dynamo では、三角関数の評価には角度が既定で使用されます。
d.Math.Pow ノードは、「t」および数値「e」の関数として動作し、フィボナッチ数列を作成します。
e.Math.Cos と Math.Sin ノードは、三角関数です。パラメータ指定の各点の X 座標と Y 座標を識別します。
f.Watch ノードで、出力値として 2 つのリストが生成されたことを確認します。これらのリストが、らせんの生成に使用される点群の x 座標と y 座標になります。
上記の手順でも問題なく機能しますが、多数のノードを使用するため、手間がかかります。より効率的なワークフローを作成するには、DesignScript を確認し、Dynamo 表現の文字列を 1 つのノード内に定義します。次の手順では、パラメータ式を使用してフィボナッチ曲線を描画する方法について確認します。
Point.ByCoordinates ノードの x 入力に上部の乗算ノードを接続し、y 入力に下部の乗算ノードを接続します。この操作により、パラメータで制御された点群のらせん構造が画面上に表示されます。
Polycurve.ByPoints ノードは、前のステップの Point.ByCoordinates を points に接続します。ここでは閉曲線は作成しないため、connectLastToFirst 入力には何も接続しなくてかまいません。この操作により、前の手順で定義した各点を通過するらせん構造が作成されます。
これで、フィボナッチ曲線が作成されました。ここからは、2 つの演習で「オウムガイ」と「ヒマワリ」を作成してみましょう。これらは自然界にみられる形状を抽象的に表しているばかりではなく、フィボナッチ曲線の 2 つの異なる適用例を的確に表現しています。
円弧を作成するための Circle.ByCenterPointRadius ノードの入力ポートに、前の手順と同じ値を接続します。radius 入力の値は既定で 1.0 に設定されているため、出力として円弧が即座に表示されます。点群が基準点から遠ざかっていく様子がよくわかります。
数列のノード グループは「t」の元の配列です。これを Circle.ByCenterPointRadius の radius 入力に接続すると、円弧の中心は基準点から離れていきますが、円の半径は次第に長くなっていき、特長的な形状のらせん構造が作成されます。
余裕があれば、これを 3D に変換してみてください。
ここまでの手順では、円弧を重ねたオウムガイのような形状を作成しました。次に、パラメータ制御のグリッドを使用してみましょう。ここでは、フィボナッチ曲線の基本的ならせんを使用して、フィボナッチ グリッドを作成していきます。結果として、ヒマワリのようならせん形状が作成されます。
最初に、前の演習と同じ手順を実行します。Point.ByCoordinates ノードを使用して、点群をらせん状に並べた配列を作成します。
![](../images/5-3/2/math-part IV-01.jpg)
次に、これらの手順に従って、さまざまな回転の一連のらせんを生成します。
a.Geometry.Rotate ノードには、同じ名前のノードが複数存在します。geometry、basePlane、degrees という入力を持つ Geometry.Rotate ノードを選択してください。geometry 入力に Point.ByCoordinates ノードを接続します。このノードを右クリックして、レーシングが「直積」に設定されていることを確認します。
b.Plane.XY ノードを basePlane 入力に接続します。これにより、基準点に向かって回り込んでいくように点が描画されます。基準点の位置は、らせんの基準の位置と同じです。
c.Number Range ノードで角度を入力することにより、複数の巻き筋を作成します。Number Range コンポーネントを使用すると、この操作をすばやく実行することができます。このコンポーネントを degrees 入力に接続します。
d.Number ノードをキャンバスに 3 つ追加して縦に並べ、数値の範囲を定義します。上から下に、それぞれ 0.0、360.0、120.0 の値を割り当てます。これらの値により、らせんの巻き筋が制御されます。Number Range ノードに 3 つの Number ノードを接続すると、結果が出力されます。
出力結果が渦の流れのようになってきました。Number Range パラメータの一部を調整して、出力結果がどのように変わるか確認してみましょう。
Number Range ノードの step の入力値を 120.0 から 36.0 に変更します。この操作により、巻き筋の数が増え、グリッドの密度が上がります
Number Range ノードの step の入力値を 36.0 から 3.6 に変更します。この操作により、グリッドの密度が大幅に上がり、螺旋の方向が不明瞭になります。これで、ヒマワリが完成しました。
文字列とは、正確には、リテラル定数や何らかのタイプの変数を表す一連の文字の集合のことです。広い意味では、文字列とは、テキストを意味するプログラミング用語です。ここまでの手順では、整数と小数の両方を使用してパラメータをコントロールしてきましたが、テキストについても同じ処理を行うことができます。
文字列は、カスタム パラメータの定義、ドキュメント セットの注釈付け、テキストベースのデータ セットの解析など、さまざまな目的で使用することができます。String ノードは、[Core] > [Input]カテゴリで使用することができます。
上記のサンプル ノードは、すべて文字列用のノードです。数値は文字と同様に、文字列として表すことも、テキスト配列全体として表すこともできます。
下のリンクをクリックして、サンプル ファイルをダウンロードします。
すべてのサンプルファイルの一覧については、付録を参照してください。
文字列のクエリーを実行することにより、大量のデータをすばやく解析することができます。ここでは、ワークフローを促進してソフトウェアの相互運用性を向上させるための基本的な操作について説明します。
次の図は、外部のスプレッドシートから取得したデータの文字列を示しています。この文字列は、XY 面上の長方形の頂点を表しています。簡単な演習として、文字列の分割操作を確認してみましょう。
「;」セパレータは、長方形の各頂点を分割します。これにより、各頂点の 3 つの項目が含まれているリストが作成されます。
String.Split ノードの中央にある[+]をクリックして、新しいセパレータを作成します。
「,」という文字をキャンバスに追加し、separator1 入力に接続します。
リストの項目が 10 個になります。String.Split ノードは、separator0 に基づいて分割を行ってから、separator1 に基づいて分割を行います。
上記のリストの項目は数値に見えますが、Dynamo 内では個別の文字列として認識されます。点群を作成するには、データ タイプを文字列から数値に変換する必要があります。これを行うには String.ToNumber ノードを使用します。
String.ToNumber ノードは、単純なノードです。String.Split ノードの出力を String.ToNumber ノードの入力に接続します。出力の表示は変わりませんが、データ タイプは 文字列 から 数値 に変換されています。
いくつかの基本的な操作を実行すると、元の文字列の入力に基づいて基準点に三角形が描画されます。
文字列は一般的なテキスト オブジェクトであるため、さまざまな目的で使用することができます。ここでは、[Core] > [String]カテゴリの主要なアクションをいくつか見てみましょう。
このカテゴリには、複数の文字列を順に結合する方法が用意されています。リストから各リテラル文字列を取得して、1 つの文字列に結合します。
以下は、3 つの文字列を連結する方法を示しています。
String.Concat ノード中央の[+]/[-]ボタンをクリックして、連結する文字列の追加と除外を行います。
出力として、スペースと句読点を含む 1 つの連結された文字列が生成されます。
結合操作は連結操作に非常によく似ていますが、句読点のレイヤーが追加される点が異なります。
Excel を使用したことがあれば、CSV ファイルについても知っているでしょう。CSV とは、カンマ区切り値という意味です。セパレータとしてカンマ(この場合は 2 つのダッシュ)を String.Join ノードで使用すると、CSV に似たデータ構造を作成することができます。
次の図は、2 つの文字列を結合する方法を示しています。
separator 入力を使用して、結合された文字列の区切り文字を指定することができます。
この演習では、文字列のクエリーと文字列の操作を実行して、Robert Frost の「Stopping By Woods on a Snowy Evening」という詩の最後の節を分解してみましょう。実際の開発作業で詩の文字列を操作することはありませんが、文字列に対する操作を理解するのに役立ちます。
最初に、節の文字列を分解する基本的な操作を実行します。文字はカンマに基づいて書式設定されていることがわかります。この書式を使用して、各行を個々の項目に分割します。
ベースとなる文字列を String ノードに貼り付けます。
別の String ノードを使用して、セパレータを指定します。ここでは、カンマをセパレータとして使用します。
String.Split ノードをキャンバスに追加し、2 つの String ノードに接続します。
出力として、各行が個別の要素に分割されます。
次に、詩のサビとなる最後の 2 行を処理しましょう。元の節は 1 つのデータ項目でした。最初の手順で、このデータを個別の項目に分割しました。そのため、必要な文字列を検索する必要があります。この例では、リストの最後にある 2 つの項目を選択することは難しく ありません が、書籍全体が処理対象になるような場合、内容をすべて読んでから各要素を手作業で区別するのは大変な作業になります。
String.Contains ノードを使用して文字セットを検索すれば、こうした手作業を行う必要はありません。これは、文書ファイルで「検索」コマンドを実行するのと似ています。この場合、対象のサブストリングが項目内で見つかったかどうかに応じて、「true」または「false」が返されます。
String.Contains ノードの searchFor 入力で、節内で検索するサブストリングを定義します。ここでは、String ノードで「And miles」と指定します。
出力として、false と true のリストが表示されます。次の手順では、このブール値ロジックを使用して各要素をフィルタします。
List.FilterByBoolMask ノードを使用して false と true を抽出します。in 出力は、mask 入力が true になっているステートメントを返し、out 出力は、mask 入力が false になっているステートメントを返します。
in 出力により、節の最後の 2 行が返されます。この 2 行には、「And miles」という文字列が含まれています。
次に、最後の 2 行を結合して節の繰り返しを強調します。前の手順の出力を確認すると、リスト内に 2 つの項目が含まれていることがわかります。
2 つの List.GetItemAtIndex ノードを使用し、0 と 1 を index 入力の値として指定することにより、2 つの項目を分離することができます。
各ノードの出力として、最後の 2 行が順に表示されます。
これらの 2 つの項目を 1 つに結合するには、String.Join ノードを使用します。
String.Join ノードを追加したら、セパレータを指定する必要があります。
セパレータを指定するには、キャンバスに String ノードを追加してカンマを入力します。
最終的な出力として、最後の 2 行が 1 行に結合されます。
このように、最後の 2 行を分割する作業は手間がかかります。文字列の操作では、多くの場合、事前の作業が必要になります。ただし、文字列の操作は拡張可能であるため、大規模なデータセットにも比較的簡単に適用することができます。スプレッドシートでパラメータを使用して対話式に操作する場合は、文字列の操作を実行すると便利です。
ロジック(正確には条件付きロジック)により、テストに基づく単一のアクションや一連のアクションを指定することができます。テストの評価を行うと、True
または False
のブール値が返されます。このブール値を使用して、プログラム フローをコントロールすることができます。
数値変数には、さまざまな数値の範囲全体を格納することができます。ブール変数には、True または False、Yes または No、1 または 0 など、2 つの値のみを格納することができます。このようにブール値の範囲は限られているため、ブール値を使用して計算を行うことはほとんどありません。
If ステートメントは、プログラミングにおける重要な概念です。このステートメントは、「 この条件 が真である場合は この処理 を実行し、偽である場合は 別の処理 を実行する」という形式で記述されます。このステートメントの結果として出力されるアクションは、ブール値によって制御されます。Dynamo で If ステートメントを定義する場合、いくつかの方法があります。
アイコン | 名前(構文) | 入力 | 出力 |
---|---|---|---|
ここでは簡単な例を使用して、If 条件ステートメントを使用する 3 つのノードの動作を確認していきます。
上の図では、Boolean ノードの出力値が True に設定されているため、その結果として "this is the result if true" という文が表示されます。この場合、If ステートメントを構成する 3 つのノードの動作は同じになります。
繰り返しますが、これら 3 つのノードの動作はすべて同じになります。ブール値 を False に変更すると、元の If ステートメントで定義されているとおりに、出力結果の値が Pi になります。
下のリンクをクリックして、サンプル ファイルをダウンロードします。
すべてのサンプル ファイルの一覧については、付録を参照してください。
ここでは、ロジックを使用して、数値のリストを偶数のリストと奇数のリストに分割してみましょう。
a.Number Range ノードを使用して、数値の範囲をキャンバスに追加します。
b.Number ノードを使用して、3 つの Number ノードをキャンバスに追加します。各 Number ノードで、次のように値を指定します。start 入力: 0.0、end 入力: 10.0、step 入力: 1.0。
c.Output として、0 から 10 までの範囲にわたる 11 個の数値のリストが生成されます。
d.「(%)」ノード(モジュロ演算ノード)の x 入力に Number Range ノードを接続し、y 入力で 2.0 を指定します。この操作により、リスト内の各数値を 2 で除算した場合の余りが算出されます。このリストの出力値は、0 と 1 が交互に現れる数値のリストになります。
e.「(==)」ノード(等価テスト ノード)を使用して、キャンバスに等価テストを追加します。「(%)」ノードの出力を「(==)」ノードの x 入力に接続し、Number ノードの 0.000 出力を「(==)」ノードの y 入力に接続します。
f.Watch ノードを使用して、等価テストの出力が true と false の値を交互に繰り返すリストになっていることを確認します。これらの値を使用して、リスト内の項目が区別されます。0 (または true)は偶数を表し、1 (または false)は奇数を表します。
g.List.FilterByBoolMask ノードは、ブール値の入力に基づいて数値をフィルタし、2 つの異なるリストに分割します。元の 数値の範囲 を list 入力に接続し、「(==)」ノードの出力を mask 入力に接続します。in 出力は true の値を表し、out 出力は false の値を表します。
h.Watch ノードを使用して、偶数のリストと奇数のリストが生成されたことを確認します。これで、論理演算子を使用して、リストがパターン別に分類されました。
ここでは、最初の演習で作成したロジックを変更してモデリング操作に適用してみましょう。
2.ここでも、前の演習と同じノードを使用します。ただし、次のように、いくつか違いがあります。
a.これらの入力値で Sequence ノードを使用します。
b.List.FilterByBoolMask ノードの list 入力に対する接続が解除されています。これらのノードは、この演習の後半で使用します。
3.最初に、上の図に示されているように、グラフの別のグループを作成します。このノード グループは、曲線を定義するためのパラメータ制御式を表しています。ここで、次の点に注意する必要があります。
a.最初の Number Slider は、波の周波数を表します。最小 1、最大 4、ステップ 0.01 の値である必要があります。
b.2 番目の Number Slider は、波の振幅を表します。最小 0、最大 1、ステップ 0.01 の値である必要があります。
c.PolyCurve.ByPoints ノードにより、上図のとおりにノード ダイアグラムを構成した時点で、Dynamo のプレビューに正弦曲線が出力されます。
ここでは、静的なプロパティで Number ノードを使用し、動的なプロパティで Number Slider ノードを使用して入力を行います。この手順の最初で定義した元の数値の範囲をそのまま使用してもかまいませんが、ここで作成する正弦曲線に対して、ある程度の柔軟性を設定しておく必要があります。Number Slider ノードの値を変更して、曲線の周波数と振幅がどのように変化するかを確認してください。
4.ここで少し先回りをして、最終的な結果を確認しましょう。個別に作成した最初の 2 つのステップを接続する必要があります。基本の正弦曲線を使用して、ジッパー状のコンポーネントの位置をコントロールし、真偽判定のロジックを使用して、小さなボックスと大きなボックスを交互に配置します。
a.Sequence ノードの step 入力の値 2 で作成された数列の範囲を Math.RemapRange ノードで再マッピングして、新しい一連の数値を作成します。元の数値の範囲は、0 から 100 までになります(step 値 1)。新しい数値の範囲は、0 から 1 になります。最小値の 0 を newMin 入力に接続し、最大値の 1 を newMax 入力に接続します。
5.Curve.PointAtParameter ノードを作成し、ステップ 04 の Math.RemapRange 出力を param 入力として接続します。
この操作により、曲線に沿って点群が作成されます。ここでは数値の範囲を 0 から 1 までの範囲に再マッピングしましたが、その理由は、param 入力に 0 から 1 までの範囲の値を指定する必要があるためです。0 の値は始点を表し、1 の値は終点を表します。すべての中間値は、[0,1] の範囲内で評価されます。
6.Curve.PointAtParameter ノードの出力を List.FilterByBoolMask ノードに接続し、奇数インデックスと偶数インデックスのリストを分離します。
a.List.FilterByBoolMask ノードの list 入力に、前の手順で使用した Curve.PointAtParameter ノードを接続します。
b.Watch ノードを in 出力と out 出力に 1 つずつ接続し、偶数値のインデックスを表すリストと奇数値のインデックスを表すリストが生成されたことを確認します。これらの点群は、曲線上に同じ方法で配置されます。これについては、次の手順で確認します。
7.次に、ステップ 05 で List.FilterByBoolMask ノードの出力結果を使用して、インデックスに従ってサイズが設定されたジオメトリを生成します。
Cuboid.ByLengths ノードを上の図のように接続し、正弦曲線に沿ったジッパー構造を作成します。ノード名の「Cuboid」とは、直方体という意味です。ここでは、直方体の中央に位置する曲線上の点を基準として、直方体のサイズを定義します。この操作により、偶数と奇数の除算ロジックがモデル内に明示的に定義されます。
a.偶数インデックスの直方体のリスト。
b.奇数インデックスの直方体のリスト。
できました!この演習で説明したロジック演算に従ってジオメトリ寸法を定義するプロセスをプログラムしました。
データは、各種プログラムの構成要素です。データはワイヤ経由でやり取りされ、そのデータを処理するノードに入力情報を提供します。処理されたデータは、新しい形式の出力データになります。ここでは、データの定義と構造について確認し、Dynamo で実際にデータを使用してみます。
データとは、定性的な変数や定量的な変数の集まりのことです。最も単純な形式のデータは、0
、3.14
、17
などの数値です。この他にも、変化する数値を表す変数(height
)、文字(myName
)、ジオメトリ(Circle
)、データ項目のリスト(1,2,3,5,8,13,...
)など、さまざまな種類のデータがあります。
Dynamo のノードの入力ポートには、データを追加または送信する必要があります。アクションが設定されていないデータを使用することはできますが、ノードが表すアクションを処理する場合はデータが必要になります。ノードをワークスペースに追加する際に、そのノードに対して入力データを指定しなかった場合、結果として関数が返されます。アクション自体の結果は返されません。
単純なデータ
データとアクション(ノード)が正常に実行される
入力データが指定されていないアクション(ノード)から一般的な関数が返される
Null に注意しましょう。'null'
タイプはデータが存在しないことを表します。これは抽象的な概念ですが、ビジュアル プログラミングを使用しているとよく登場します。たとえば、アクションを実行して正しい結果が生成されなかった場合に、ノードから NULL が返されます。
安定したプログラムを作成するには、NULL をテストし、データ構造から NULL を削除することが重要になります。
ビジュアル プログラミングを行うと、大量のデータを非常に短時間で生成できるため、データ階層を管理するための手段が必要になります。これを行うには、データ構造を使用します。データ構造とは、データを格納するための構造化されたスキームのことです。データ構造の仕様と使用方法は、プログラミング言語によって異なります。
Dynamo の場合、リストを使用してデータに階層を追加します。これについては、これ以降の章で詳しく説明します。ここでは、簡単な操作から始めてみましょう。
リストは、1 つのデータ構造内に配置された項目の集合を表します。リストと項目の関係は次のようになります。
私の手(リスト)には 5 本の指(項目)がある。
私の家の前の通り(リスト)には 10 軒の家(項目)が建っている。
Number Sequence ノードは、start 入力、amount 入力、step 入力を使用して数値のリストを定義します。上の図の 2 つのノードを使用して、10 個の数値を格納する 2 つのリストを作成しました。一方のリストには 100 から 109 までの数値が格納され、もう一方のリストには 0 から 9 までの数値が格納されています。
List.GetItemAtIndex ノードは、特定のインデックスを使用して、リスト内の特定の項目を選択します。0 を選択すると、リスト内の最初の項目(この場合は 100)が取得されます。
もう一方のリストでも同じ手順を実行すると、リスト内の最初の項目である 0 が取得されます。
次に、List.Create ノードを使用して、2 つのリストをマージして 1 つのリストを作成します。このノードによって「リストのリスト」が作成されることに注意してください。これにより、データの構造が変化します。
インデックスを 0 に設定してもう一度 List.GetItemAtIndex ノードを使用すると、「リストのリスト」内の最初の項目が取得されます。この場合、リストが項目として処理されます。この動作は、他のスクリプト言語とは多少異なっています。リストの操作とデータ構造については、これ以降の章でさらに詳しく説明します。
Dynamo のデータ階層を理解するには、「データ構造については、リストが項目として認識される」という概念を理解する必要があります。つまり、Dynamo は、トップダウン プロセスを使用してデータ構造を認識するということです。これは何を意味するのでしょうか。例を使用して詳しく説明します。
下のリンクをクリックして、サンプル ファイルをダウンロードします。
すべてのサンプルファイルの一覧については、付録を参照してください。
この最初の例では、ジオメトリ階層全体にわたるシェル化された円柱を作成します。ジオメトリ階層については、このセクションで説明します。
1.Point.ByCoordinates を追加する - このノードをキャンバスに追加すると、Dynamo プレビュー グリッドの基準点に点が表示されます。x,y 入力と z 入力の既定値は 0.0 です。この場合、Dynamo プレビュー グリッドの基準点に点が表示されます。
2.Plane.ByOriginNormal - ジオメトリ階層内の次の段階は、平面です。平面を作成する方法はいくつかありますが、ここでは、基準点と法線を入力して作成します。ここで使用する基準点は、前の手順で作成した点ノードです。
Vector.ZAxis - このノードは、Z 方向の単位ベクトルです。このノードには入力はなく、[0,0,1]という値のベクトルしかないことに注意してください。このノードは、Plane.ByOriginNormal ノードの normal の入力として使用します。これにより、Dynamo のプレビューに長方形の平面が表示されます。
3.Circle.ByPlaneRadius - 次に、前の手順で作成した平面から曲線を作成して階層を拡張します。このノードに接続すると、基準点に円が表示されます。このノードの半径の既定値は 1 です。
4.Curve.Extrude - このノードに深さを設定することにより、基準点に表示されている円を立体的な 3 次元の円柱にします。このノードは、曲線を押し出してサーフェスを作成します。このノードの距離の既定値は 1 です。この場合、ビューポートに円柱が表示されます。
5.Surface.Thicken - このノードは、指定の距離でサーフェスをオフセットして形状を閉じることにより、閉じたソリッドを作成します。厚さの既定値は 1 です。この場合、その値に従って、シェル化された円柱がビューポートに表示されます。
6.Number Slider - ここでは、すべての入力に対して既定値を使用するのではなく、パラメータ制御をモデルに追加してみましょう。
範囲編集用キャレット - 数値スライダをキャンバスに追加したら、左上のキャレットをクリックして範囲オプションを表示します。
Min/Max/Step - Min、Max、Step の値を、それぞれ 0、2、0.01 に変更します。これにより、ジオメトリ全体のサイズをコントロールします。
7.Number Slider - すべての既定の入力で、この数値スライダのコピー アンド ペースト操作を繰り返します(Number Slider ノードを選択して[Ctrl]+[C]を押し、次に[Ctrl]+[V]を押す)。この操作は、既定値が設定されているすべての入力に Number Slider ノードが接続されるまで繰り返します。定義を有効にするには、一部のスライダ値をゼロより大きな値に設定する必要があります。たとえば、サーフェスに厚みを付ける場合は、押し出しの深さをゼロより大きな値に指定する必要があります。
8.これで、数値スライダを使用したパラメータ制御のシェル化された円柱が作成されました。いくつかのパラメータの値を変更して、Dynamo のビューポート内でジオメトリが動的に更新されることを確認してください。
Number Slider - これまでの手順で、多くのスライダをキャンバスに追加してきました。そのため、作成したツールのインタフェースをクリーンアップする必要があります。各スライダを右クリックして[名前変更]を選択し、そのスライダのパラメータ(厚さ、半径、高さなど)に適した名前に変更します。
9.ここまでの手順で、厚みのある円柱が作成されました。この時点では、この円柱はまだ 1 つのオブジェクトにすぎません。ここからは、動的にリンクされた円柱の配列を作成していきます。そのためには、項目を 1 つずつ操作するのではなく、円柱のリストを作成します。
追加用ノード (+) - ここでの目的は、前の手順で作成した円柱の横に、一連の円柱を追加することです。現在の円柱の横に別の円柱を追加するには、円柱の半径とシェルの厚さの両方を考慮する必要があります。ここでは、2 つのスライダの値を追加して、円柱の半径とシェルの厚さを設定します。
10.この操作は少し複雑であるため、手順を追って詳しく説明します。最終的な目標は、連続する各円柱の位置を定義する数値のリストを作成することです。
a.乗算用ノード (*) - 最初に、前の手順で指定した値を 2 倍にします。前の手順で指定した値は半径でしたが、ここでは円柱の直径を指定します。
b.Sequence - 次に、このノードを使用して、数値の配列を作成します。最初の入力は、前の手順の 乗算用ノード (*) の step の値です。start の値は、Number ノードを使用して 0.0 に設定します。
c.Integer Slider - Integer Slider ノードを接続して amount の値を設定します。これにより、作成される円柱の数が決まります。
d.出力のリスト - このリストには、配列内の各円柱の移動距離が表示されます。このリストは、元のスライダのパラメータによって制御されます。
11.この手順は簡単です。前の手順で指定したシーケンスを、元の Point.ByCoordinates ノードの x 入力に接続するだけです。この操作により、pointX スライダが置き換えられます。このスライダは、削除してかまいません。これで、ビューポートに円柱の配列が表示されます(Integer Slider ノードで 0 よりも大きな値を設定してください)。
12.円柱の配列は、すべてのスライダに動的にリンクされたままの状態になっています。各スライダの値を変更して、円柱の定義がどのように更新されるかを確認してください。
ここまでの説明で、ビジュアル プログラミングの基本的な仕組みについて確認しました。ここからは、ビジュアル プログラミングで使用する構成要素について詳しく見ていきましょう。この章では、Dynamo 内で受け渡されるデータの基本的な概念について説明します。
アイコン | 名前/構文 | 入力 | 出力 |
---|---|---|---|
Object.IsNull
obj
bool
加算(+)
var[]...[], var[]...[]
var[]...[]
減算(-)
var[]...[], var[]...[]
var[]...[]
乗算(*)
var[]...[], var[]...[]
var[]...[]
除算(/)
var[]...[], var[]...[]
var[]...[]
If (If)
test、true、false
結果
Formula (IF(x,y,z))
x、y、z
結果
Code Block ((x?y:z);)
x? y, z
結果