颜色是用于在可视化程序中创建引入注目的视觉效果以及渲染输出差异的绝佳数据类型。处理抽象数据和改变数字时,有时难以了解变化内容以及变化程度。这是颜色的绝佳应用。
Dynamo 中的颜色是使用 ARGB 输入创建的。这对应于 Alpha、红、绿和蓝通道。Alpha 表示颜色的 透明度,而其他三种颜色用作原色来协调生成整个色谱。
图标 | 名称(语法) | 输入 | 输出 |
---|---|---|---|
下表中的颜色查询用于定义相应颜色的特性:Alpha、红、绿和蓝。请注意,Color.Components 节点给出全部四个不同输出,这使得该节点更适合查询颜色的特性。
图标 | 名称(语法) | 输入 | 输出 |
---|---|---|---|
下表中的颜色对应于 HSB 颜色空间。对于我们如何解释颜色,将颜色分为色调、饱和度和亮度无疑更加直观:应该是什么颜色?应该如何呈现多彩?颜色应该如何变亮或变暗?这分别是色调、饱和度和亮度的细分。
图标 | 名称(语法) | 输入 | 输出 |
---|---|---|---|
颜色范围类似于 #part-ii-from-logic-to-geometry练习中的 “Remap Range” 节点:它将数字列表重新映射到其他域。但它不会映射到 “数字” 域,而是基于 0 到 1 范围的输入数字映射到 “颜色渐变”。
当前节点运作良好,但第一次就使一切正常工作可能会有点勉强。熟悉颜色渐变的最佳方法是以交互方式对其进行测试。让我们快速练习,了解如何使用与数字对应的输出颜色设置渐变。
定义三种颜色:使用 “Code Block” 节点,通过插入相应的 “0” 和 “255” 组合来定义 红色、绿色 和 蓝色。
创建列表:将三种颜色合并到一个列表中。
定义索引:创建列表以定义每种颜色的夹点位置(范围从 0 到 1)。请注意,值 0.75 表示绿色。这会将绿颜色 3/4 置于颜色范围滑块中水平渐变的位置。
代码块:输入值(介于 0 和 1 之间)以转换为颜色。
“Display.ByGeometry” 节点使我们能够在 Dynamo 视口中为几何图形着色。这有助于分离不同类型的几何图形、演示参数化概念或定义用于模拟的分析图例。输入很简单:几何图形和颜色。要创建与上图类似的渐变,请将颜色输入连接到 “Color Range” 节点。
“Display.BySurfaceColors” 节点使我们能够使用颜色在整个曲面上映射数据!此功能为可视化通过离散分析(例如日光、能量和接近度)获得的数据引入了一些令人兴奋的可能性。在 Dynamo 中将颜色应用于曲面类似于在其他 CAD 环境中将纹理应用于材质。在下面的简短练习中,我们来演示如何使用此工具。
单击下面的链接下载示例文件。
可以在附录中找到示例文件的完整列表。
本练习重点介绍如何以参数方式控制与几何图形平行的颜色。该几何图形是基本螺旋线,我们在下面使用 “代码块” 对其进行定义。这是一种用于创建参数化函数的快速而简单的方法;由于我们的重点是颜色(而不是几何图形),因此我们使用代码块来有效地创建螺旋线,而不会使画布变得混乱。随着底漆迁移到更高级的材质,我们会更频繁地使用代码块。
代码块:使用上述公式定义两个代码块。这是用于创建螺旋的快速参数化方法。
Point.ByCoordinates:将代码块的三个输出连接到该节点的坐标。
现在,我们会看到创建螺旋线的一组点。下一步是通过这些点创建曲线,以便我们可以可视化螺旋线。
PolyCurve.ByPoints:将 “Point.ByCoordinates” 输出连接到节点的 “points” 输入。我们会得到螺旋曲线。
Curve.PointAtParameter:将 “PolyCurve.ByPoints” 输出连接到 “curve” 输入。此步骤的目的是创建一个沿曲线滑动的参数化吸引器点。由于曲线将计算参数处的点,因此我们需要输入一个介于 0 和 1 之间的 参数 值。
数字滑块:添加到画布后,将_最小_值更改为 0.0、将 最大 值更改为 1.0、将 步长 值更改为 .01。将滑块输出插入 “Curve.PointAtParameter” 的 “param” 输入。现在,我们会沿螺旋线长度看到一个点,由滑块的百分比表示(起点处为 0,终点处为 1)。
创建参照点后,我们现在将比较参照点与定义螺旋线的原始点之间的距离。此距离值将驱动几何图形以及颜色。
Geometry.DistanceTo:将 “Curve.PointAtParameter” 输出连接到 “input”。将 “Point.ByCoordinates” 连接到几何图形输入。
Watch:结果输出会显示沿曲线从每个螺旋点到参照点的距离列表。
下一步是通过从螺旋点到参照点的距离列表来驱动参数。我们使用这些距离值来沿曲线定义一系列球体的半径。为了使球体保持合适大小,我们需要 重映射 距离值。
Math.RemapRange:将 “Geometry.DistanceTo” 输出连接到数字输入。
代码块:将值为 0.01 的代码块连接到 “newMin” 输入,将值为 1 的代码块连接到 “newMax” 输入。
Watch:将 “Math.RemapRange” 输出连接到一个节点,并将 “Geometry.DistanceTo” 输出连接到另一个节点。比较结果。
此步骤已将距离列表重新映射为较小的范围。我们可以编辑 “newMin” 和 “newMax” 值,但我们认为合适。这些值将重新映射并在整个域中具有相同的 分布率。
Sphere.ByCenterPointRadius:将 “Math.RemapRange” 输出连接到 “radius” 输入,将原始 “Point.ByCoordinates” 输出连接到 “centerPoint” 输入。
更改数字滑块的值,并观察球体更新的大小。现在,我们有了一个参数化夹具
球体的大小演示了由沿曲线的参照点定义的参数化阵列。让我们对球体半径使用相同的概念来驱动其颜色。
Color Range:在画布顶部添加。将光标悬停在 “value” 输入上时,我们注意到请求的数字介于 0 和 1 之间。我们需要重新映射 “Geometry.DistanceTo” 输出中的数字,以便它们与此域兼容。
Sphere.ByCenterPointRadius:目前,我们禁用此节点上的预览(单击鼠标右键 >“预览”)
Math.RemapRange:此过程看起来很熟悉。将 “Geometry.DistanceTo” 输出连接到数字输入。
Code Block:与之前的步骤类似,为 “newMin” 输入创建值 0,为 “newMax” 输入创建值 1。注意,在这种情况下,我们能够在一个代码块中定义两个输出。
Color Range:将 “Math.RemapRange” 输出连接到 “value” 输入。
Color.ByARGB:这是我们要为创建两种颜色所执行的操作。尽管此过程看起来可能有些古怪,但它与其他软件中的 RGB 颜色相同,我们只需使用可视化编程即可实现。
Code Block:创建由 0 和 255 组成的两个值。将两个输出连接到与上图一致的两个 “Color.ByARGB” 输入(或创建您最喜欢的两种颜色)。
Color Range: “colors” 输入要求一列颜色。我们需要基于上一步中创建的两种颜色创建此列表。
List.Create:将两种颜色合并到一个列表中。将输出连接到 “Color Range” 的 “colors” 输入。
Display.ByGeometryColor:将 “Sphere.ByCenterPointRadius” 连接到 “geometry” 输入,将 “Color Range” 连接到 “color” 输入。现在,我们在曲线域上具有平滑渐变。
如果我们之前在定义中更改了 “Number Slider” 的值,则颜色和尺寸会更新。在这种情况下,颜色和半径大小直接相关:我们现在在两个参数之间有视觉链接!
单击下面的链接下载示例文件。
可以在附录中找到示例文件的完整列表。
首先,我们需要创建(或引用)一个曲面以用作 “Display.BySurfaceColors” 节点的输入。在此示例中,我们将在正弦和余弦曲线之间放样。
该组节点将沿 Z 轴创建点,然后基于正弦和余弦函数置换它们。然后,使用这两个点列表生成 NURBS 曲线。
Surface.ByLoft:在 NURBS 曲线列表之间生成插值曲面。
File Path:选择要取样的图像文件以获取下游像素数据
使用 “File.FromPath” 将文件路径转化为某个文件,然后传递给 “Image.ReadFromFile” 以输出图像进行采样
Image.Pixels:输入某个图像并提供要沿图像的 X 和 Y 标注使用的样例值。
Slider:为 “Image.Pixels” 提供样例值
Display.BySurfaceColors:在整个曲面上分别沿 X 和 Y 映射颜色值数组
输出曲面的特写预览,分辨率为 400x300 样例
逻辑,或更确切地说是条件逻辑,允许我们基于测试指定一个操作或操作集。在评估测试后,我们将得到一个布尔值,该值表示 True
或 False
,我们可以使用它来控制程序流。
数字变量可以存储整个范围的不同数字。布尔变量只能存储两个名为“True”或“False”、“Yes”或“No”、“1”或“0”的值。由于布尔范围有限,我们很少使用布尔来执行计算。
“If”语句是编程中的关键概念:如果 this 为 true,则 that 发生;否则 something else 发生。语句的结果操作由布尔值驱动。在 Dynamo 中,有多种方法可定义“If”语句:
图标 | 名称(语法) | 输入(Inputs) | 输出 (Outputs) |
---|---|---|---|
接下来,我们来看一个简短示例,分别介绍这三个节点在使用“If”条件语句时的行为。
在本图中,“boolean”设置为“true”,这意味着结果是字符串读取:“this is the result if true”。在此处,创建 “If” 语句的三个节点的工作方式相同。
同样,该节点的工作方式也相同。如果 “boolean” 更改为 “false”,则结果是 “Pi” 数字,如原始 “If” 语句中所定义。
单击下面的链接下载示例文件。
可以在附录中找到示例文件的完整列表。
我们使用逻辑将一列数字分隔为一列偶数和一列奇数。
a.Number Range - 向画布添加一个数字范围。
b.Numbers - 向画布添加三个数字节点。每个数字节点的值应为:“start”为“0.0”、“end”为“10.0”以及“step”为“1.0”。
c.Output - 输出是一列 11 个数字(范围从 0 到 10)。
d.求模(%) - “Number Range” 连接到 “x” , “2.0” 连接到 “y”。这将计算列表中每个数字除以 2 的余数。此列表的输出将给出一列介于 0 和 1 之间的交替值。
e.相等测试 (==) - 向画布添加相等测试。将 “modulo” 输出连接到 “x” 输入,将 “0.0” 输入连接到 “y” 输入。
f.Watch - 相等测试的输出是一列介于 true 和 false 之间的交替值。这些值用于分隔列表中的项目。0(或 true)表示偶数,1(或 false)表示奇数。
g.List.FilterByBoolMask - 此节点会根据输入布尔值将值过滤为两个不同的列表。将原始 “number range” 连接到 “list” 输入,将 “equality test” 输出连接到 “mask” 输入。“in” 输出表示 true 值,而 “out” 输出表示 false 值。
h.Watch - 结果,我们现在得到了一列偶数和一列奇数。我们已使用逻辑运算符将列表分成各图案!
在第一个练习中建立的逻辑基础上,我们将此设置应用于建模操作。
2.我们将从上一个具有相同节点的练习跳转。唯一的例外(除了更改格式外):
a.使用具有这些输入值的 “Sequence” 节点。
b.我们已取消将列表输入连接到 “List.FilterByBoolMask”。现在,我们将这些节点放在旁边,但稍后在练习中,它们会派上用场。
3.首先,我们创建一组单独的图形,如上图所示。该组节点表示参数方程,用于定义曲线。几点注意事项:
a.第一个 “数字滑块” 表示波浪的频率,其最小值应为 1,最大值应为 4,步长应为 0.01。
b.第二个 “数字滑块” 表示波浪的振幅,其最小值应为 0,最大值应为 1,步长应为 0.01。
c.PolyCurve.ByPoints - 如果复制上述节点图表,则在 Dynamo 预览视口中结果为正弦曲线。
此处的输入方法:使用数字节点可获得更多静态特性,使用数字滑块可获得更多灵活特性。我们希望保留在此步骤开头定义的原始数字范围。但是,我们在此处创建的正弦曲线应该具有一定的灵活性。我们可以移动这些滑块,来观察曲线更新的频率和振幅。
4.我们在定义中跳过一点,从而看一下最终结果,以便我们可以参照所得到的内容。前两个步骤是分别进行的,我们现在要将这两个步骤连接起来。我们将使用基础正弦曲线来驱动拉链组件的位置,我们将使用 true/false 逻辑以在小框和大框之间交替。
a.Math.RemapRange - 使用在步骤 02 中创建的数字序列,我们通过重新映射范围来创建一系列新数字。原始数字来自步骤 01,范围为 0-100。这些数字介于 0 到 1,分别通过 “newMin” 和 “newMax” 输入。
5.创建 “Curve.PointAtParameter” 节点,然后将步骤 04 中的 “Math.RemapRange” 输出连接为其 “param” 输入。
此步骤将沿曲线创建点。我们将数字重新映射为 0 到 1,因为 “param” 的输入将查找此范围中的值。值为 “0” 表示开始点,值为 “1” 表示结束点。介于两者之间的所有数字均在 “[0,1]” 范围内求值。
6.将 “Curve.PointAtParameter” 的输出连接到 “List.FilterByBoolMask”,以分隔奇数和偶数索引列表。
a.List.FilterByBoolMask - 将上一步的**“Curve.PointAtParameter”**连接到_“list”_输入。
b.Watch -_“in”的观察节点和“out”_的观察节点表明,我们有表示偶数索引和奇数索引的两个列表。这些点在曲线上的排序方式相同,我们将在下一步中进行演示。
7.接下来,我们将在步骤 05 中使用 “List.FilterByBoolMask” 的输出结果,以根据其索引生成具有大小的几何图形。
Cuboid.ByLengths - 重新创建在上图中所见到的连接,以沿正弦曲线获得拉链。立方体在此处就是一个框,我们将基于框中心的曲线点定义其大小。现在,偶数/奇数分割的逻辑在模型中应该一清二楚。
a.偶数索引处的立方体列表。
b.奇数索引处的立方体列表。
大功告成!您刚刚编写了一个根据本练习中演示的逻辑操作定义几何图形尺寸的过程。
在我们准备好深入探讨开发可视化程序后,我们将需要深入了解我们将使用的构建块。本章介绍有关数据的基本概念 - 介绍通过 Dynamo 程序的“导线”的内容。
正式地,字符串是代表文字常量或某种类型变量的字符序列。非正式,字符串是文本编程术语。我们已使用数字(整数和小数)来驱动参数,可以对文本执行相同操作。
字符串可用于各种应用,包括定义自定义参数、注释文档集以及解析基于文本的数据集。字符串节点位于“核心”>“输入类别”中。
上面的示例节点都是字符串。数字可以表示为字符串、字母或整个文本数组。
单击下面的链接下载示例文件。
可以在附录中找到示例文件的完整列表。
通过查询字符串,即可快速解析大量数据。我们将介绍一些基本操作,这些操作可以加快工作流并帮助实现软件互操作性。
下图考虑了来自外部电子表格的数据字符串。该字符串表示矩形在 XY 平面中的顶点。让我们在微型练习中分解一些字符串拆分操作:
“;”分隔符分割矩形的每个顶点。这将为每个顶点创建一个包含 3 个项目的列表。
点击节点中间的“+”,可创建新的分隔符。
向画布添加“,”字符串,然后连接到新的分隔符输入。
现在,我们得到了包含十个项目的列表。节点先基于 “separator0” 进行分割,然后基于 “separator1” 进行分割。
虽然上述项目列表看起来像数字,但在 Dynamo 中仍将它们视为单独的字符串。要创建点,需要将点的数据类型从“字符串”转换为“数字”。使用 “String.ToNumber” 节点可执行此操作
此节点简单明了。将 “String.Split” 结果连接到输入。输出看起来没有什么不同,但数据类型现在是 “number” ,而不是 “string”。
使用其他一些基本操作,我们现在在原点处基于原始字符串输入绘制了一个三角形。
由于字符串是通用文本对象,因此它们承载了各种应用。让我们来了解一下 Dynamo 的“核心”>“字符串类别”中的一些主要操作:
这是一个将两个字符串按顺序合并到一起的方法。这将提取列表中的每个文字字符串,并创建一个合并字符串。
以下内容表示三个字符串的串联:
通过单击节点中心的“+/-”按钮,可在串联中添加或减少字符串。
输出会提供一个串联的字符串,其中包含空格和标点符号。
合并方法与连接方法非常相似,只是它增加了标点图层。
如果您使用过 Excel,则可能遇到过 CSV 文件。这代表逗号分隔值。可以使用逗号(或在本例中,使用两个短划线)作为 “String.Join” 节点的分隔符,以创建类似的数据结构。
下图表示两个字符串的合并:
分隔符输入允许一个分隔符创建一个字符串,该字符串会分割已合并的字符串。
我们先从该诗小节的基本字符串拆分开始。首先,我们注意到书写格式基于逗号设置。我们将使用此格式来将每行分隔为单独的项目。
基础字符串将粘贴到 “String” 节点中。
另一个 “String” 节点用于表示分隔符。在本例中,我们使用的是逗号。
“String.Split” 节点将添加到画布并连接到两个字符串。
输出表明,我们现在已将各行分成各个元素。
现在,让我们了解这首诗的优美部分:最后两行。原始诗小节是一项数据。在第一步中,我们已将该数据分为各个项目。现在,我们需要搜索所需的文字。尽管我们 可以 通过选择列表的最后两项来完成此操作,但如果这是一本书,我们不希望通读所有内容并手动隔离各元素。
我们使用 “String.Contains” 节点来搜索一组字符,而不是手动搜索。这类似于在文字处理器中执行“查找”命令。在本例中,如果在项目中找到相应子字符串,则返回“true”或“false”。
在 “searchFor” 输入中,我们定义了要在诗小节中查找的子字符串。我们使用一个带有文字“And miles”的 “String” 节点。
输出结果为一列 false 或 true。我们将在下一步中使用此布尔逻辑过滤各元素。
“List.FilterByBoolMask” 是我们要用来剔除 false 和 true 的节点。“in”输出返回“mask”输入为“true”的语句,而“out”输出返回“mask”输入为“false”的语句。
“in”的输出与预期一样,为我们提供了诗小节的最后两行。
现在,我们要通过合并这两行,来再现该诗小节。查看上一步的输出时,我们注意到列表中有两个项目:
使用两个 “List.GetItemAtIndex” 节点,我们可以使用值 0 和 1 作为索引输入来隔离项目。
每个节点的输出按顺序为我们提供最后两行。
要将这两个项目合并为一个项目,我们将使用 “String.Join” 节点:
在添加 “String.Join” 节点后,我们注意到需要分隔符。
要创建分隔符,我们向画布中添加一个 “String” 节点,然后键入逗号。
最终输出已将最后两个项目合并为一个项目。
隔离最后两行看起来可能需要大量工作;确实,字符串操作通常需要一些前期工作。但它们具有可伸缩性,可以相对轻松地应用于大型数据集。如果您以参数方式使用电子表格和互操作性,请务必记住字符串操作。
数据是我们程序的内容。它穿过连线,为节点提供输入,在这些节点中处理为新形式的输出数据。让我们回顾一下数据的定义、数据的结构,然后开始在 Dynamo 中使用它。
数据是一组定性变量或定量变量的值。最简单形式的数据是数字,如 0
、3.14
或 17
。但数据也可以是多种不同的类型:表示变化数字的变量 (height
);字符 (myName
);几何图形 (Circle
);或一列数据项 (1,2,3,5,8,13,...
)。
在 Dynamo 中,我们会向节点的输入端口添加/提供数据 - 我们可以具有无需操作的数据,但我们需要数据来处理节点表示的操作。将某个节点添加到工作空间后,如果未提供任何输入,则结果将为函数,而不是操作本身的结果。
简单数据
数据和操作(A 节点)成功执行
没有数据输入的操作(A 节点)返回通用函数
注意空值,'null'
类型表示缺少数据。尽管这是一个抽象概念,但在使用可视化编程时,您可能会遇到这种情况。如果某个操作未创建有效结果,则节点会返回空值。
测试空值并从数据结构中删除空值是创建健壮程序的关键部分。
在进行可视化编程时,我们可以非常快速地生成大量数据,并需要一种方式来管理其层次结构。这是数据结构的作用,也是我们存储数据的组织方案。数据结构的具体内容及其使用方法具体取决于编程语言。
在 Dynamo 中,我们通过列表向数据添加层次结构。我们将在后续章节中深入探讨这一点,但先让我们简单介绍一下:
列表表示放置在一个数据结构中的项目集合:
我手(列表)上有五根手指(项目)。
我的街道(列表)上有十座房屋(项目)。
“Number Sequence” 节点使用 “start” 、 “amount” 和 “step” 输入来定义一列数字。使用这些节点,我们创建了两个包含十个数字的单独列表,一个列表的范围为 100-109,另一列表的范围为 0-9。
“List.GetItemAtIndex” 节点会选择列表中特定索引处的项目。选择 “0” 时,我们会得到列表中的第一项(在本例中为 “100” )。
通过将相同过程应用于第二个列表,得到的值为 “0”,即列表中的第一项。
现在,我们使用 “List.Create” 节点将这两个列表合并为一个列表。请注意,该节点将创建_一列列表_。这会更改数据的结构。
再次使用 “List.GetItemAtIndex” 时,如果索引设置为 “0”,则我们将获得该列列表中的第一个列表。这就是将列表视为项目的含义,这与其他脚本编写语言略有不同。在后面的章节中,我们将通过列表操作和数据结构获得更高级的功能。
在 Dynamo 中了解数据层次结构的关键概念:在数据结构方面,列表被视为项目。换句话说,Dynamo 通过自上而下的过程来了解数据结构。这意味着什么?我们通过一个示例来介绍它。
单击下面的链接下载示例文件。
可以在附录中找到示例文件的完整列表。
在此第一个示例中,我们装配了一个带壳圆柱体,该圆柱体遍历本节中讨论的几何图像层次结构。
1.添加 “Point.ByCoordinates” - 向画布添加节点后,我们会在 Dynamo 预览栅格的原点处看到一个点。“x,y”和“z”输入的默认值为“0.0”,从而在此位置处向我们提供一个点。
2.Plane.ByOriginNormal - 几何图形层次结构中的下一步是平面。有几种构建平面的方法,我们使用原点和法线作为输入。原点是在上一步中创建的点节点。
Vector.ZAxis - 这是 Z 方向上单位化的向量。请注意,没有输入,仅有值为 [0,0,1] 的向量。我们将此项用作 “Plane.ByOriginNormal” 节点的 “normal” 输入。这样,我们在 Dynamo 预览中就得到了一个矩形平面。
3.Circle.ByPlaneRadius - 逐步扩展层次结构,我们现在基于上一步中的平面创建曲线。在连接到节点后,我们会在原点处得到一个圆。节点上的默认半径值为 “1”。
4.Curve.Extrude - 现在,我们通过增加其深度并进入第三维,使该内容弹出。该节点基于曲线创建曲面,方法是拉伸该曲线。节点上的默认距离为 “1”,应该可以在视口中看到一个圆柱体。
5.Surface.Thicken - 此节点通过将曲面偏移给定距离并闭合形状,从而为我们提供一个闭合实体。默认厚度值为 “1”,我们会在视口中看到一个与这些值对应的带壳圆柱体。
6.数字滑块 - 我们不使用所有这些输入的默认值,而是向模型添加一些参数化控件。
域编辑 - 在向画布添加数字滑块后,单击左上角的插入符号可显示域选项。
最大值/最小值/步长 - 将 “min” 、 “max” 和 “step” 值分别更改为 “0” 、 “2” 和 “0.01”。我们这样做的目的是控制整个几何图形的大小。
7.数字滑块 - 在所有默认输入中,我们复制并粘贴此数字滑块(选择滑块、按 Ctrl+C,然后按 Ctrl+V)多次,直到具有默认值的所有输入都有滑块为止。某些滑块值必须大于零,才能使定义生效(即:需要拉伸深度才能加厚曲面)。
8.现在,我们已使用这些滑块创建参数化带壳圆柱体。尝试调整其中一些参数,然后在 Dynamo 视口中动态查看几何图形更新。
数字滑块 - 更进一步对此进行介绍,我们已向画布添加了很多滑块,并且需要清理刚刚创建的工具的界面。在一个滑块上单击鼠标右键、选择“重命名...”,然后将每个滑块更改为其参数的相应名称(厚度、半径、高度等)。
9.此时,我们创建了一个令人惊叹的加厚圆柱体。目前,这是一个对象,让我们来看看如何创建一个圆柱体阵列,其中圆柱体保持动态链接。为此,我们将创建一列圆柱体,而不是使用单个项。
加(+) - 我们的目的是在创建的圆柱体旁边添加一排圆柱体。如果要添加一个与当前圆柱体相邻的圆柱体,我们需要考虑圆柱体的半径及其壳厚度。通过添加滑块的两个值,可得到此数字。
10.该步骤更加复杂,因此让我们缓慢地逐步介绍:最终目的是创建一列数字,用于定义每个圆柱体在一排中的位置。
a.相乘 - 首先,我们要将上一步中的值乘以 2。上一步中的值表示半径,我们希望将圆柱体移动整个直径。
b.数字序列 - 使用此节点创建数字数组。第一个输入是上一步中的 “multiplication” 节点到 “step” 值。可以使用 “number” 节点将 “start” 值设置为 “0.0”。
c.整数滑块 - 对于 “amount” 值,我们会连接整数滑块。这将定义创建多少个圆柱体。
d.输出 - 此列表显示阵列中每个圆柱体移动的距离,并由原始滑块以参数化方式驱动。
11.此步骤足够简单 - 将上一步中定义的序列连接到原始 “Point.ByCoordinates” 的 “x” 输入。这将替换可以删除的滑块 “pointX”。现在,在视口中可以看到圆柱体阵列(确保整数滑块大于 0)。
12.圆柱体链仍与所有滑块动态链接。调整每个滑块以观察定义更新!
在本练习中,我们将使用查询和操作字符串的方法来解构 Robert Frost 的诗的最后一小节。这并非最实用的应用,但在我们将概念性的字符串操作应用于节奏和韵律的清晰各行时,它将有助于我们掌握此类操作。
图标 | 名称/语法 | 输入(Inputs) | 输出 (Outputs) |
---|
ARGB 颜色 (Color.ByARGB)
A,R,G,B
颜色
Alpha (Color.Alpha)
颜色
A
红色 (Color.Red)
颜色
R
绿色 (Color.Green)
颜色
G
蓝色 (Color.Blue)
颜色
B
组件 (Color.Components)
颜色
A,R,G,B
色调 (Color.Hue)
颜色
色调
饱和度 (Color.Saturation)
颜色
饱和度
亮度 (Color.Brightness)
颜色
亮度
Object.IsNull | obj | bool |
如果 (If)
test, true, false
结果
公式 (IF(x,y,z))
x, y, z
结果
代码块 ((x?y:z);)
x? y, z
结果
如果最简单的数据形式是数字,则将这些数字关联起来的最简单方法是通过数学。从除法等简单的运算符到三角函数,再到更复杂的公式,Math 是开始探索数值关系和模式的好方法。
运算符是一组组件,这些组件使用具有两个数字输入值的代数函数,这些结果产生一个输出值(加、减、乘、除等)。这些可在“运算符”>“操作”下找到。
图标 | 名称(语法) | 输入(Inputs) | 输出 |
---|---|---|---|
单击下面的链接下载示例文件。
可以在附录中找到示例文件的完整列表。
通过公式将运算符和变量组合在一起以形成更复杂的关系。使用滑块来创建可由输入参数控制的公式。
1.创建表示参数方程中“t”的数字序列,因此我们要使用足够大的列表来定义螺旋。
Number Sequence:基于以下三个输入定义数字序列:start、amount 和 step。
2.上述步骤已创建一列数字,来定义参数化域。接下来,创建表示黄金螺旋方程的节点组。
黄金螺旋定义为以下方程:
下图以可视化编程形式呈现了黄金螺旋。在逐步查看节点组时,请尝试注意可视化程序和编写方程之间的平行性。
a.Number Slider:向画布添加两个数字滑块。这些滑块将表示参数方程的 “a” 和 “b” 变量。这些表示灵活的常量,或我们可以根据所需结果调整的参数。
b.相乘 (*):乘法节点由星号表示。我们将反复使用它来连接乘法变量
c.Math.RadiansToDegrees:“t”值需要转换为度数,以便在三角函数中进行求值。请记住,Dynamo 默认使用度数来对这些函数求值。
d.Math.Pow:作为“t”和数字“e”的函数,这将创建 Fibonacci 数列。
e.Math.Cos 和 Math.Sin:这两个三角函数将分别区分每个参数点的 x 坐标和 y 坐标。
f.Watch:现在,我们看到输出为两个列表,它们将是用于生成螺旋的点的 x 和 y 坐标。
现在,上一步中的大部分节点都可以正常工作,但这种工作量很大。要创建更高效的工作流,请查看“DesignScript”,以将 Dynamo 表达式的字符串定义到一个节点中。在接下来的一系列步骤中,我们将了解如何使用参数方程绘制 Fibonacci 螺旋。
Point.ByCoordinates:将上乘法节点连接到 “x” 输入,将下乘法节点连接到 “y” 输入。现在,我们在屏幕上会看到点的参数化螺旋。
Polycurve.ByPoints:将上一步的 “Point.ByCoordinates” 连接到 “points”。我们可以不输入而保留 “connectLastToFirst”,因为我们不会绘制闭合曲线。这将创建穿过上一步中定义的每个点的螺旋。
我们现在已完成 Fibonacci 螺旋!让我们从此处开始进一步研究两个独立的练习,我们称之为 Nautilus 和 Sunflower。这些是自然系统的抽象表示,但 Fibonacci 螺旋的两种不同应用将得到充分体现。
Circle.ByCenterPointRadius:我们将在此处使用“Circle”节点,其输入与上一步相同。半径值默认为 “1.0”,因此可以看到圆即时输出。这些点与原点之间的分离程度立即清晰可辩。
Number Sequence:这是 “t” 的原始数组。通过将其连接到 “Circle.ByCenterPointRadius” 的半径值,圆心仍会与原点进一步偏离,但圆的半径不断增大,从而创建一个时髦的 Fibonacci 圆图形。
如果使其成为三维形式,可获得奖励积分!
现在的情况是,我们已创建一个圆形 Nautilus 壳,接下来我们转到参数化栅格。我们将在 Fibonacci 螺旋上使用基本旋转来创建 Fibonacci 栅格,然后在向日葵种子生长后对结果进行建模。
作为一个跳跃点,我们从上一练习的相同步骤开始:使用 “Point.ByCoordinates” 节点创建点的螺旋阵列。
![](../images/5-3/2/math-part IV-01.jpg)
接下来,按照这些小步骤操作以生成一系列不同旋转的螺旋。
a.Geometry.Rotate:有多个 “Geometry.Rotate” 选项;请务必选择将 “geometry” 、 “basePlane” 和 “degrees” 作为其输入的节点。将 “Point.ByCoordinates” 连接到几何图形输入。在该节点上单击鼠标右键,并确保将连缀设置为“叉积”
b.Plane.XY:连接到 “basePlane” 输入。我们将绕原点旋转,该原点与螺旋的底部位置相同。
c.Number Range:对于度数输入,我们要创建多个旋转。我们可以使用 “Number Range” 组件快速完成此操作。将其连接到 “degrees” 输入。
d.Number:要定义数字范围,请按垂直顺序将三个数字节点添加到画布。从上到下,分别指定值 “0.0,360.0,” 和 “120.0”。这些驱动螺旋的旋转。将三个数字节点连接到相应节点后,请注意 “Number Range” 节点的输出结果。
我们的输出开始类似于旋涡。我们调整一些 “Number Range” 参数,看一看结果如何变化。
将 “Number Range” 节点的步长从 “120.0” 更改为 “36.0”。请注意,这将创建更多旋转,因此会为我们提供更密集的栅格。
将 “Number Range” 节点的步长从 “36.0” 更改为 “3.6”。现在,我们得到更密集的栅格,但螺旋的方向性尚不清楚。女士们,先生们:我们创建了一颗向日葵。
相加 (+)
var[]...[], var[]...[]
var[]...[]
相减 (-)
var[]...[], var[]...[]
var[]...[]
相乘 (*)
var[]...[], var[]...[]
var[]...[]
相除 (/)
var[]...[], var[]...[]
var[]...[]