리스트는 요소 또는 항목의 모음입니다. 예를 들어 바나나 묶음을 고려해보십시오. 각 바나나는 리스트(또는 묶음) 내의 항목입니다. 각 바나나를 따로 잡는 것보다 바나나 묶음을 잡는 것이 더 쉬운데, 이는 데이터 구조의 파라메트릭 관계에 따라 요소를 그룹화하는 경우에도 마찬가지입니다.
사진 출처: Augustus Binu
식료품을 구입할 때는 구입한 모든 항목을 바구니에 넣습니다. 이 바구니 또한 리스트입니다. 바나나 빵을 만들려면 3묶음의 바나나가 필요합니다(바나나 빵을 많이 만드는 경우). 이 바구니는 바나나 묶음 리스트를 나타내고 각 묶음은 바나나 리스트를 나타냅니다. 바구니는 리스트의 리스트(2차원)이고 바나나 묶음은 리스트(1차원)입니다.
Dynamo에서는 리스트 데이터가 정렬되고, 각 리스트의 첫 번째 항목은 색인 "0"을 갖습니다. 아래에서는 Dynamo에서 리스트가 정의되는 방법과 여러 리스트가 서로 어떻게 연관되는지 알아보겠습니다.
처음에 다소 이상해 보일 수 있는 점은 리스트의 첫 번째 색인이 항상 1이 아니라 0이라는 것입니다. 따라서 리스트의 첫 번째 항목이라고 하면 실제로 색인 0에 해당하는 항목을 의미합니다.
예를 들어 오른손의 손가락 수를 셀 경우 1에서 5까지 셀 수 있습니다. 그러나 손가락을 하나의 리스트에 포함하면 Dynamo에서는 0부터 4까지의 색인을 지정할 것입니다. 프로그래밍 초보자에게는 다소 이상해 보일 수 있지만 대부분의 계산 시스템에서는 0부터 시작하는 색인이 표준 방식입니다.
리스트에는 항목이 5개 있으며, 해당 리스트에서는 0부터 시작하는 계산 시스템을 사용합니다. 리스트에 저장되는 항목은 숫자일 필요가 없습니다. 점, 곡선, 표면, 패밀리 등 Dynamo에서 지원하는 어떤 데이터 유형도 될 수 있습니다.
a. 색인
b. 점
c. 항목
종종 리스트에 저장된 데이터 유형을 확인하는 가장 쉬운 방법은 watch 노드를 다른 노드의 출력에 연결하는 것입니다. 기본적으로 watch 노드에서는 자동으로 리스트 왼쪽에 모든 색인이 표시되고 오른쪽에 데이터 항목이 표시됩니다.
이러한 색인은 리스트로 작업할 때 중요한 요소입니다.
리스트와 관련해서, 입력 및 출력은 사용 중인 Dynamo 노드에 따라 달라집니다. 예를 들어 5개의 점 리스트를 사용하며, 이 출력을 두 개의 다른 Dynamo 노드인 PolyCurve.ByPoints 및 Circle.ByCenterPointRadius에 연결해 보겠습니다.
PolyCurve.ByPoints의 points 입력의 경우 "Point[]" 를 찾습니다. 이것은 점 리스트를 나타냅니다.
PolyCurve.ByPoints의 출력은 점 5개의 리스트에서 작성된 단일 PolyCurve입니다.
Circle.ByCenterPointRadius의 centerPoint 입력의 경우 "Point" 를 요청합니다.
Circle.ByCenterPointRadius의 출력은 중심이 점의 원래 리스트에 해당하는 원 5개의 리스트입니다.
PolyCurve.ByPoints 및 Circle.ByCenterPointRadius의 입력 데이터는 동일하지만, Polycurve.ByPoints 노드에서는 하나의 polycurve를 제공하며, Circle.ByCenterPointRadius 노드에서는 각 점에 중심이 있는 5개의 원을 제공합니다. 즉, polycurve는 5개의 점을 연결하는 곡선으로 그려지고, 원은 각 점에 서로 다른 원을 작성합니다. 그렇다면 데이터는 어떻게 될까요?
Polycurve.ByPoints의 points 입력 위에 커서를 놓으면 해당 입력이 "Point[]" 를 찾는 것을 확인할 수 있습니다. 끝에 각괄호가 있다는 점에 유의하십시오. 이는 점 리스트를 나타내며, polycurve를 작성하려는 경우 입력은 각 polycurve에 대한 리스트여야 합니다. 따라서 이 노드에서는 각 리스트를 하나의 polycurve로 압축합니다.
반면, Circle.ByCenterPointRadius의 centerPoint 입력에서는 "Point" 를 요청합니다. 이 노드에서는 원의 중심점을 정의하기 위한 항목으로 하나의 점을 찾습니다. 바로 이 때문에 입력 데이터에서 5개의 원을 얻게 되는 것입니다. 이렇게 Dynamo에서 입력과 다른 점을 인식하면 데이터 관리 시 노드가 작동하는 방식을 보다 잘 이해할 수 있습니다.
명확한 솔루션이 없으면 데이터 일치는 문제가 됩니다. 이 문제는 노드가 다른 크기의 입력에 액세스할 수 있는 경우에 발생합니다. 데이터 일치 알고리즘을 변경하면 결과가 크게 달라질 수 있습니다.
점 사이에 선 세그먼트를 작성하는 노드가 있다고 상상해 보십시오(Line.ByStartPointEndPoint). 여기에는 다음과 같이 점 좌표를 제공하는 두 개의 입력 매개변수가 있습니다.
가장 간단한 방법은 더 이상 짝을 지을 수 없을 때까지 입력을 일대일로 연결하는 것입니다. 이를 "최단 리스트" 알고리즘이라고 합니다. 다음은 Dynamo 노드의 기본 동작입니다.
"최장 리스트" 알고리즘은 더 이상 짝을 지을 수 없을 때까지 입력을 계속 연결하고 요소를 재사용합니다.
마지막으로 “외적” 메서드는 가능한 모든 연결을 설정합니다.
보시다시피 이러한 점 세트 사이에 선을 그릴 수 있는 방법은 여러 가지가 있습니다. 레이싱 옵션은 노드의 중심을 마우스 오른쪽 버튼으로 클릭하고 "레이싱" 메뉴를 선택하여 찾을 수 있습니다.
아래 링크를 클릭하여 예제 파일을 다운로드하십시오.
전체 예시 파일 리스트는 부록에서 확인할 수 있습니다.
아래의 레이싱 작업을 보여드리기 위해 이 기준 파일을 사용하여 최단 리스트, 최장 리스트 및 외적을 정의해 보겠습니다.
Point.ByCoordinates의 레이싱만 변경하고 위의 그래프의 다른 부분은 변경하지 않습니다.
_최단 리스트_를 레이싱 옵션(기본 옵션)으로 선택하면 5개의 점으로 구성된 기본 대각선이 표시됩니다. 5개의 점은 더 짧은 리스트의 길이이므로 최단 리스트 레이싱은 한 리스트의 끝에 도달하면 중지됩니다.
레이싱을 최장 리스트 로 변경하면 수직으로 확장되는 대각선이 표시됩니다. 개념 다이어그램과 동일한 방법으로, 5개 항목 리스트의 마지막 항목이 반복되면서 더 긴 리스트의 길이에 도달합니다.
레이싱을 외적 으로 변경하면 각 리스트 간에 모든 조합이 모여 5x10개의 점 그리드가 제공됩니다. 이는 현재 데이터가 리스트의 리스트라는 점을 제외하고, 위 개념 다이어그램에 표시된 것처럼 외적에 대한 동일한 데이터 구조입니다. polycurve를 연결하면 각 리스트가 X 값으로 정의되어 수직선의 행이 표시되는 것을 볼 수 있습니다.
리스트는 데이터를 구성하는 방법입니다. 컴퓨터의 운영 체제에는 파일과 폴더가 있습니다. Dynamo에서는 이러한 파일과 폴더를 각각 항목과 리스트로 간주할 수 있습니다. 운영 체제처럼, 여러 가지 방법으로 데이터를 작성, 수정 및 조회할 수 있습니다. 이 장에서는 Dynamo에서 리스트가 관리되는 방식에 대해 자세히 알아보겠습니다.
계층에 티어를 하나 더 추가하겠습니다. 원래 예시에서 카드 데크를 가져와 여러 개의 데크가 포함된 상자를 작성하면 이제 상자에는 데크 리스트가 나타나고 각 데크에는 카드 리스트가 나타납니다. 이것은 리스트의 리스트입니다. 이 섹션의 내용을 바탕으로 유추해 보자면 아래의 이미지에는 동전 묶음 리스트가 포함되어 있고, 각 묶음에는 페니 리스트가 포함되어 있습니다.
사진 출처: Dori
리스트의 리스트에서 만들 수 있는 조회는 무엇일까요? 이러한 조회에서는 기존 특성을 확인합니다.
동전의 유형은 몇 가지입니까? 2.
각 동전 유형의 값은 얼마입니까? $0.01 및 $0.25입니다.
쿼터는 무엇으로 만들어졌습니까? 75%의 구리와 25%의 니켈로 만들어졌습니다.
페니는 무엇으로 만들어졌습니까? 97.5%의 아연과 2.5%의 구리로 만들어졌습니다.
리스트의 리스트에서 수행할 수 있는 작업은 무엇일까요? 작업을 수행하면 해당 작업을 기준으로 리스트의 리스트가 변경됩니다.
특정 쿼터 또는 페니의 스택을 선택합니다.
특정 쿼터 또는 페니를 선택합니다.
쿼터와 페니의 스택을 재정렬합니다.
스택을 한꺼번에 섞습니다.
다시 말씀드리지만, Dynamo에는 위에 나와 있는 각 작업과 유사한 노드가 있습니다. 우리는 물리적 객체가 아니라 추상 데이터로 작업하므로 데이터 계층을 위아래로 이동하는 방법을 제어하는 규칙 세트가 필요합니다.
리스트의 리스트를 다루는 경우에는 데이터가 겹쳐 있어 복잡하지만, 몇 가지 놀라운 파라메트릭 작업을 수행할 수 있습니다. 아래의 단원에서 기본 사항을 자세히 살펴보고 몇 가지 추가 작업에 대해 논의해 보겠습니다.
아래 링크를 클릭하여 예제 파일을 다운로드하십시오.
전체 예시 파일 리스트는 부록에서 확인할 수 있습니다.
이 섹션에서 배울 기본 개념은 Dynamo에서는 리스트를 자체의 내부 객체로 취급한다는 점입니다. 이 하향식 계층은 객체 지향적 프로그래밍을 염두에 두고 개발되었습니다. Dynamo에서는 List.GetItemAtIndex와 같은 명령으로 하위 요소를 선택하는 대신, 데이터 구조에서 주 리스트의 색인을 선택합니다. 그리고 해당 항목은 다른 리스트가 될 수 있습니다. 다음과 같이 예시 이미지로 자세히 살펴보겠습니다.
Code Block을 사용하여 두 개의 범위(
0..2; 0..3;
)를 정의했습니다.이러한 범위는 레이싱이 "외적" 으로 설정된 Point.ByCoordinates 노드에 연결됩니다. 이렇게 하면 점 그리드가 작성되고, 또한 리스트의 리스트가 출력으로 반환됩니다.
Watch 노드에서는 각 리스트에 4개의 항목이 있는 3개의 리스트를 제공합니다.
색인이 0인 List.GetItemAtIndex를 사용하는 경우 Dynamo에서는 첫 번째 리스트와 해당 컨텐츠를 모두 선택합니다. 다른 프로그램에서는 데이터 구조에 있는 모든 리스트의 첫 번째 항목을 선택하겠지만, Dynamo에서는 데이터를 다룰 때 하향식 계층을 채택합니다.
아래 링크를 클릭하여 예제 파일을 다운로드하십시오.
전체 예시 파일 리스트는 부록에서 확인할 수 있습니다.
Flatten을 사용하면 데이터 구조에서 데이터의 모든 티어가 제거됩니다. 이는 데이터 계층이 작업에 필요하지 않은 경우에 유용하지만, 정보가 제거되므로 위험할 수 있습니다. 아래 예에서는 데이터 리스트를 단순화한 결과를 보여줍니다.
코드 줄을 하나 삽입하여 Code Block의 범위(
-250..-150..#4;
)를 정의합니다.code block 을 Point.ByCoordinates 노드의 x 및 y 입력에 플러깅하면 레이싱이 "외적" 으로 설정되어 점의 그리드가 가져와집니다.
Watch 노드는 리스트의 리스트가 있음을 보여줍니다.
PolyCurve.ByPoints 노드는 각 리스트를 참조하고 각 polycurve를 작성합니다. Dynamo 미리보기에는 그리드의 각 행을 나타내는 4개의 polycurve가 있습니다.
polycurve 노드 앞에 flatten 을 삽입하여 모든 점에 대해 하나의 리스트를 작성했습니다. PolyCurve.ByPoints 노드는 리스트를 참조하여 하나의 곡선을 작성합니다. 모든 점은 하나의 리스트에 있으므로, 전체 점 리스트를 통과하는 하나의 지그재그 polycurve를 얻게 됩니다.
또한 격리된 데이터 티어를 단순화할 수도 있습니다. List.Flatten 노드를 사용하면 계층 상단에서 단순화할 지정된 수의 데이터 티어를 정의할 수 있습니다. 이는 워크플로우와 관련이 없을 수도 있는 복잡한 데이터 구조 문제로 고심하고 있는 경우에 정말 유용한 도구입니다. 또 다른 옵션은 List.Map에서 flatten 노드를 함수로 사용하는 것입니다. 아래에서 List.Map에 대해 자세히 알아보겠습니다.
아래 링크를 클릭하여 예제 파일을 다운로드하십시오.
전체 예시 파일 리스트는 부록에서 확인할 수 있습니다.
파라메트릭 모델링을 사용할 경우 기존 리스트에 데이터 구조를 수정해야 하는 경우도 있습니다. 여기에 여러 노드를 사용할 수도 있으며, chop이 가장 기본적인 버전입니다. chop을 사용하면 리스트를 설정된 항목 수의 하위 리스트로 분할할 수 있습니다.
chop 명령을 사용하면 지정된 리스트 길이를 기준으로 리스트가 분할됩니다. 어떤 면에서 chop은 flatten과 반대입니다. 즉, 데이터 구조를 제거하는 것이 아니라 새로운 티어를 데이터 구조에 추가합니다. 이 도구는 아래 예처럼 형상 작업에 유용한 도구입니다.
아래 링크를 클릭하여 예제 파일을 다운로드하십시오.
전체 예시 파일 리스트는 부록에서 확인할 수 있습니다.
List.Map/Combine에서는 지정된 함수를 입력 리스트에 적용하지만 계층의 한 단계 아래에 적용합니다. 조합은 지정된 함수의 입력에 해당하는 여러 입력이 있을 수 있다는 점을 제외하고 맵과 동일합니다.
_참고: 이 연습은 이전 버전의 Dynamo로 작성되었습니다. _ List.Map 기능의 대부분은 List@Level _기능을 추가하여 해결되었습니다. 자세한 내용은 아래의 _ List@Level 을 참조하십시오.
간단한 소개를 위해 이전 섹션의 List.Count 노드를 살펴보겠습니다.
List.Count 노드는 리스트의 모든 항목을 계산합니다. 이를 사용하여 List.Map 의 작동 방식을 보여드리겠습니다.
Code Block에 다음 두 줄의 코드를 삽입합니다.
-50..50..#Nx; -50..50..#Ny;
이 코드를 입력하면 code block에서 Nx와 Ny에 대한 두 개의 입력을 작성합니다.
두 개의 integer sliders 를 사용하여 Nx 및 Ny 값을 Code Block에 연결하여 정의합니다.
code block의 각 줄을 Point.ByCoordinates 노드의 각 X 및 Y 입력에 연결합니다. 노드를 마우스 오른쪽 버튼으로 클릭하고 "레이싱"을 선택한 다음 "외적" 을 선택합니다. 그러면 점의 그리드가 작성됩니다. 범위는 -50에서 50 사이로 정의했으므로 기본 Dynamo 그리드에 걸쳐 있습니다.
Watch 노드에 작성된 점이 표시됩니다. 데이터 구조를 알 수 있습니다. 리스트의 리스트를 작성했습니다. 각 리스트에는 그리드 점의 행이 나타납니다.
이전 단계에서 Watch 노드의 출력에 List.Count 노드를 부착합니다.
Watch 노드를 List.Count 출력에 연결합니다.
List.Count 노드는 5 값을 제공합니다. 이는 code block에 정의된 "Nx" 변수와 동일합니다. 그 이유는 무엇일까요?
먼저, Point.ByCoordinates 노드는 리스트를 작성하기 위한 기본 입력으로 "x" 입력을 사용합니다. Nx가 5이고 Ny가 3인 경우 각각 3개의 항목이 포함된 리스트의 리스트를 5개 얻게 됩니다.
Dynamo에서는 리스트를 자체의 내부 객체로 취급하므로 List.Count 노드가 계층의 주 리스트에 적용됩니다. 결과는 값 5 또는 주 리스트의 리스트 수입니다.
List.Map 노드를 사용하여 계층에서 한 단계 내려가 이 레벨에서 "함수" 를 수행합니다.
List.Count 노드에 입력이 없습니다. 이 노드는 함수로 사용되고 있으므로 계층에서 한 단계 아래의 모든 개별 리스트에 List.Count 노드가 적용됩니다. List.Count의 빈 입력은 List.Map의 리스트 입력에 해당합니다.
이제 List.Count의 결과로 각각 값이 3인 항목 5개의 리스트가 제공됩니다. 이는 각 하위 리스트의 길이를 나타냅니다.
참고: 이 연습은 이전 버전의 Dynamo로 작성되었습니다. List.Combine 기능의 대부분은 List@Level _기능을 추가하여 해결되었습니다. 자세한 내용은 아래의 List@Level 을 참조하십시오.
이 연습에서는 List.Combine을 사용하여 별도의 객체 리스트에 함수를 적용하는 방법을 보여 줍니다.
먼저 두 점 리스트를 설정합니다.
Sequence 노드를 사용하여 각각 10단계로 증분하는 10개의 값을 생성합니다.
결과를 Point.ByCoordinates 노드의 x 입력에 연결합니다. 이렇게 하면 Dynamo에 점 리스트가 작성됩니다.
두 번째 Point.ByCoordinates 노드를 작업공간에 추가하고, 동일한 Sequence 출력을 x 입력으로 사용하되 Interger Slider를 해당 y 입력으로 사용하고, 해당 값을 31(첫 번째 점 세트와 겹치지 않는 한, 어떤 값도 사용할 수 있음)로 설정하여 두 점 세트가 서로 겹치지 않게 합니다.
다음으로 List.Combine을 사용하여 두 개의 개별 리스트에 있는 객체에 함수를 적용합니다. 이 경우 간단한 선 그리기 함수가 됩니다.
List.Combine을 작업공간에 추가하고 두 점 세트를 list0 및 list1 입력으로 연결합니다.
Line.ByStartPointEndPoint를 List.Combine에 대한 입력 함수로 사용합니다.
완료되면 두 점 세트가 Line.ByStartPointEndPoint 함수를 통해 압축/쌍으로 연결되며, Dynamo에서 10개의 선이 반환됩니다.
n-차원 리스트의 연습을 참조하여 List.Combine을 사용하는 또 다른 예제를 살펴보십시오.
아래 링크를 클릭하여 예제 파일을 다운로드하십시오.
전체 예시 파일 리스트는 부록에서 확인할 수 있습니다.
List.Map을 선호하는 경우 List@Level 기능을 통해 노드의 입력 포트에서 바로 작업할 리스트 레벨을 선택할 수 있습니다. 이 기능을 이용하면 노드의 모든 수신 입력에 적용할 수 있으며 다른 방법보다 쉽고 빠르게 리스트의 레벨에 액세스할 수 있습니다. 입력으로 사용할 리스트의 레벨만 노드에 지정하고 노드에서 나머지 작업을 수행하도록 합니다.
이 연습에서는 List@Level 기능을 사용하여 특정 레벨의 데이터를 격리합니다.
간단한 3D 점 그리드부터 시작하겠습니다.
그리드는 X, Y, Z의 범위로 구성되며, 데이터는 X 리스트, Y 리스트, Z 리스트의 3가지 티어로 구성됩니다.
이러한 티어는 서로 다른 레벨에 존재합니다. 레벨은 미리보기 버블 아래에 표시됩니다. 리스트 레벨 열은 위 리스트 데이터에 해당하므로 그 안에서 작업할 레벨을 식별하는 데 도움이 됩니다.
리스트 레벨은 가장 낮은 레벨 데이터가 항상 "L1"에 오도록 역순으로 구성됩니다. 그러면 그래프가 업스트림으로 변경되는 경우에도 계획대로 작동할지 확인할 수 있습니다.
List@Level 함수를 사용하려면 '>'을 클릭합니다. 이 메뉴 내에 두 개의 확인란이 있습니다.
레벨 사용 - List@Level 기능을 사용할 수 있습니다. 이 옵션을 클릭하면 노드를 사용할 입력 리스트 레벨을 클릭하여 선택할 수 있습니다. 이 메뉴를 사용하면 위 또는 아래를 클릭하여 여러 레벨 옵션을 빠르게 시도할 수 있습니다.
리스트 구조 유지 - 이 옵션을 사용하면 해당 입력의 레벨 구조를 유지할 수 있습니다. 경우에 따라 데이터를 고의적으로 하위 리스트로 구성했을 수 있습니다. 이 옵션을 선택하면 리스트 구성이 그대로 유지되고 정보가 손실되지 않습니다.
간단한 3D 그리드를 사용하면 리스트 레벨을 통해 전환하여 리스트 구조를 액세스하고 시각화할 수 있습니다. 각 리스트 레벨과 색인 조합은 원래 3D 세트와 다른 점 세트를 반환합니다.
DesignScript의 "@L2"에서는 레벨 2의 리스트만 선택할 수 있습니다. 색인 0이 있는 레벨 2의 리스트는 첫 번째 Y 점 세트만 포함하여 XZ 그리드만 반환합니다.
레벨 필터를 "L1"로 변경하면 첫 번째 리스트 레벨의 모든 항목을 볼 수 있습니다. 색인 0이 있는 레벨 1의 리스트는 모든 3D 점을 단순 리스트로 포함합니다.
"L3"에 대해 동일한 작업을 시도하는 경우 세 번째 리스트 레벨 점만 표시됩니다. 색인 0이 있는 레벨 3의 리스트에는 첫 번째 Z 점 세트만 포함되며 XY 그리드만 반환됩니다.
"L4"에 대해 동일한 작업을 시도하는 경우 세 번째 리스트 레벨 점만 표시됩니다. 색인 0이 있는 레벨 4의 리스트에는 첫 번째 X 점 세트만 포함되며 YZ 그리드만 반환됩니다.
이 특정 예는 List.Map에서도 작성할 수 있지만, List@Level에서는 상호작용을 크게 단순화하여 노드 데이터에 쉽게 액세스할 수 있게 합니다. 아래에서 List.Map 및 List@Level 메서드를 서로 비교하며 살펴보십시오.
두 메서드 모두 동일한 점에 대한 액세스를 제공하지만, List@Level 메서드를 사용하면 단일 노드 내의 데이터 도면층 간에 쉽게 전환할 수 있습니다.
List.Map을 사용하여 점 그리드에 액세스하려면 List.Map과 함께 List.GetItemAtIndex 노드를 사용해야 합니다. 단계를 내려가는 모든 리스트 레벨마다 추가 List.Map 노드를 사용해야 합니다. 리스트의 복잡도에 따라 적절한 레벨의 정보에 액세스하려면 그래프에 상당한 양의 List.Map 노드를 추가해야 할 수 있습니다.
이 예에서는 List.Map 노드가 있는 List.GetItemAtIndex 노드가 '@L3'이 선택된 List.GetItemAtIndex와 동일한 리스트 구조를 가진 동일한 점 세트를 반환합니다.
아래 링크를 클릭하여 예제 파일을 다운로드하십시오.
전체 예시 파일 리스트는 부록에서 확인할 수 있습니다.
Transpose는 리스트의 리스트를 다룰 때 기본적인 함수입니다. 스프레드시트 프로그램과 마찬가지로 transpose는 데이터 구조의 열과 행을 반전합니다. 아래 기본 행렬을 사용하여 이 내용을 보여드리고, 다음 섹션에서는 Transpose를 사용하여 기하학적 관계를 작성할 수 있는 방법을 보여드리겠습니다.
이전 연습에서 List.Count 노드를 삭제하고 일부 형상으로 이동하여 데이터 구조 방식을 살펴보겠습니다.
PolyCurve.ByPoints를 Point.ByCoordinates의 Watch 노드의 출력에 연결합니다.
출력에는 5개의 polycurve가 표시되며 Dynamo 미리보기에서는 곡선을 볼 수 있습니다. Dynamo 노드에서는 점 리스트(또는 이 경우 점 리스트의 리스트)를 찾고 여기에서 단일 polycurve를 작성합니다. 기본적으로 각 리스트가 데이터 구조에서 곡선으로 변환되었습니다.
List.Transpose 노드는 모든 항목을 리스트의 리스트에 있는 모든 리스트로 바꿉니다. 이 방법은 복잡하게 들리지만 Microsoft Excel의 transpose와 동일한 논리입니다. 즉, 데이터 구조에서 열을 행으로 바꿉니다.
추상 결과 확인: transpose로 인해 리스트 구조가 각각 3개의 항목이 있는 5개의 리스트에서 각각 5개의 항목이 있는 3개의 리스트로 바뀌었습니다.
기하학적 결과 확인: PolyCurve.ByPoints를 사용하여 원래 곡선에 수직 방향으로 3개의 polycurve가 표시됩니다.
Code block 줄임에서는 "[]"을 사용하여 리스트를 정의합니다. 그러면 List.Create 노드보다 훨씬 빠르고 효율적인 방법으로 리스트를 작성할 수 있습니다. Code block에 대해서는 Code Blocks 및 DesignScript에서 자세히 설명합니다. 아래 이미지를 참조하여 여러 표현식이 포함된 리스트를 code block으로 정의할 수 있는 방법을 확인하십시오.
Code block 축약형은 "[]"를 사용하여 복잡한 데이터 구조에서 원하는 특정 항목을 빠르고 쉽게 선택할 수 있습니다. Code blocks에 대해서는 Code Block 및 DesignScript 장에서 자세히 설명합니다. 아래 이미지를 참조하여 여러 데이터 유형이 포함된 리스트를 code block으로 조회할 수 있는 방법을 확인하십시오.
아래 링크를 클릭하여 예제 파일을 다운로드하십시오.
전체 예시 파일 리스트는 부록에서 확인할 수 있습니다.
이 연습에서는 이전 연습에서 설정한 몇 가지 논리를 사용하여 표면을 편집합니다. 여기서 우리의 목표는 직관적이지만 데이터 구조 탐색 시 더욱 관련성을 높이는 것입니다. 우리는 제어점을 이동하여 표면을 분명하게 표현하려고 합니다.
위 노드의 문자열로 시작합니다. 기본 Dynamo 그리드에 걸쳐 있는 기본 표면을 작성하고 있습니다.
Code Block을 사용하여 다음 두 코드 줄을 삽입하고 Surface.PointAtParameter의 u 및 v 입력에 각각 연결합니다.
-50..50..#3;
-50..50..#5;
Surface.PointAtParameter의 레이싱을 "외적" 으로 설정해야 합니다.
Watch 노드에 각각 5개의 항목이 있는 리스트 3개의 리스트가 표시됩니다.
이 단계에서는 우리가 작성한 그리드의 중심점을 조회하려고 합니다. 이렇게 하려면 중간 리스트에서 중간 점을 선택합니다. 이해되시죠?
이것이 올바른 점인지 확인하려면 Watch 노드 항목을 클릭하여 올바른 항목을 대상으로 하는지 확인할 수도 있습니다.
Code Block을 사용하여 다음과 같이 리스트의 리스트를 조회하기 위한 기본 코드 줄을 작성하겠습니다.
points[1][2];
Geometry.Translate를 사용하여 선택한 점을 Z 방향으로 20 단위씩 위로 이동할 것입니다.
List.GetItemAtIndex 노드가 있는 점의 중간 행도 선택하겠습니다. 참고: 이전 단계와 마찬가지로,
points[1];
줄을 사용하여 Code Block으로 리스트를 조회할 수도 있습니다.
지금까지 중심점을 성공적으로 조회하여 위로 이동했습니다. 이제 이동한 이 점을 원래 데이터 구조에 다시 삽입해야 합니다.
먼저, 이전 단계에서 격리한 리스트의 항목을 대치하려고 합니다.
List.ReplaceItemAtIndex를 사용하여 "2" 의 색인으로 중간 항목을 이동된 점에 연결된 대치 항목(Geometry.Translate)으로 대치할 것입니다.
이 출력은 이동된 점을 리스트의 중간 항목으로 입력했음을 보여줍니다.
이제 리스트를 수정했으므로 이 리스트를 원본 데이터 구조(리스트의 리스트)에 다시 삽입해야 합니다.
동일한 논리 다음에 List.ReplaceItemAtIndex를 사용하여 중간 리스트를 수정된 리스트로 대치합니다.
이러한 두 노드의 색인을 정의하는 Code Block 은 1과 2이며, Code Block(points[1][2])의 원래 조회와 일치합니다.
index 1 에서 리스트를 선택하면 Dynamo 미리보기에 데이터 구조가 강조 표시됩니다. 이동된 점을 원래 데이터 구조에 병합했습니다.
이 점 세트에서 표면을 만드는 여러 가지 방법이 있습니다. 이 경우 곡선을 함께 로프트하여 표면을 작성하겠습니다.
NurbsCurve.ByPoints 노드를 작성하고 새 데이터 구조를 연결하여 세 개의 NURBS 곡선을 작성합니다.
Surface.ByLoft를 NurbsCurve.ByPoints의 출력에 연결합니다. 이제 수정된 표면이 있습니다. 형상의 원래 Z 값을 변경할 수 있습니다. 변환 후 형상 업데이트를 확인하십시오!
지금까지 리스트가 무엇인지 확인했으므로 리스트에서 수행할 수 있는 작업에 대해 설명하겠습니다. 리스트가 하나의 게임 카드 세트라고 생각해 보십시오. 세트는 리스트이며, 각 카드는 하나의 항목을 나타냅니다.
리스트에서는 어떤 조회를 만들 수 있을까요? 이러한 조회에서는 기존 특성을 확인합니다.
한 세트에 들어 있는 카드의 수는? 52.
짝을 이루는 패의 수는? 4.
재료? 종이.
길이는? 3.5" 또는 89mm.
폭은? 2.5" 또는 64mm.
리스트에서 수행할 수 있는 작업은 무엇일까요? 작업을 수행하면 해당 작업을 기준으로 리스트가 변경됩니다.
세트를 섞을 수 있습니다.
값별로 세트를 정렬할 수 있습니다.
짝을 이루는 패별로 세트를 정렬할 수 있습니다.
세트를 나눌 수 있습니다.
각 사람에게 카드를 나눠주기 위해 세트를 나눌 수 있습니다.
세트에서 특정 카드를 선택할 수 있습니다.
위에 나열된 모든 작업에는 일반 데이터 리스트로 작업할 수 있도록 비슷한 Dynamo 노드가 있습니다. 아래 단원에는 리스트에서 수행할 수 있는 기본적인 작업 중 일부가 나와 있습니다.
아래 링크를 클릭하여 예제 파일을 다운로드하십시오.
전체 예시 파일 리스트는 부록에서 확인할 수 있습니다.
아래 이미지는 두 원 사이에 선을 그려 기본 리스트 작업을 표현하는 기준 그래프입니다. 리스트 내에서 데이터를 관리하는 방법을 살펴보고 아래의 리스트 작업을 통해 시각적 결과를 표시해 보겠습니다.
값이
500;
인 Code Block으로 시작합니다.Point.ByCoordinates 노드의 x 입력에 연결합니다.
이전 단계의 노드를 Plane.ByOriginNormal 노드의 원점 입력에 연결합니다.
Circle.ByPlaneRadius 노드를 사용하여 이전 단계의 노드를 평면 입력에 연결합니다.
Code Block을 사용하여 radius에 대해 값
50;
을 지정합니다. 다음은 작성할 첫 번째 원입니다.Geometry.Translate 노드를 사용하여 Z 방향으로 최대 100개 단위만큼 원을 이동합니다.
Code Block 노드에서 코드 줄
0..1..#10;
을 사용하여 0과 1 사이의 10개 숫자 범위를 정의합니다.이전 단계의 code block을 두 Curve.PointAtParameter 노드의 param 입력에 연결합니다. Circle.ByPlaneRadius를 최상위 노드의 곡선 입력에 연결하고 Geometry.Translate를 그 아래 노드의 곡선 입력에 연결합니다.
Line.ByStartPointEndPoint를 사용하여 두 Curve.PointAtParameter 노드를 연결합니다.
아래 링크를 클릭하여 예제 파일을 다운로드하십시오.
전체 예시 파일 리스트는 부록에서 확인할 수 있습니다.
List.Count 노드는 간단합니다. 리스트의 값 개수를 계산하고 해당 수를 반환합니다. 이 노드는 리스트의 리스트로 작업할 경우 미묘한 차이가 있으며, 이 내용은 다음 섹션에서 살펴보겠습니다.
**List.Count ****** 노드에서는 Line.ByStartPointEndPoint 노드의 줄 수를 반환합니다. 이 경우 해당 값은 원래 Code Block 노드에서 작성된 점 수와 일치하는 10입니다.
아래 링크를 클릭하여 예제 파일을 다운로드하십시오.
전체 예시 파일 리스트는 부록에서 확인할 수 있습니다.
List.GetItemAtIndex는 기본적으로 리스트의 항목을 조회하는 기본적인 방법입니다.
먼저 Line.ByStartPointEndPoint 노드를 마우스 오른쪽 버튼으로 클릭하여 해당 미리보기를 끕니다.
List.GetItemAtIndex 노드를 사용하여 색인 "0" 또는 줄 리스트의 첫 번째 항목을 선택합니다.
슬라이더 값을 0에서 9 사이로 변경하여 List.GetItemAtIndex를 통해 다른 항목을 선택합니다.
아래 링크를 클릭하여 예제 파일을 다운로드하십시오.
전체 예시 파일 리스트는 부록에서 확인할 수 있습니다.
List.Reverse 는 리스트의 모든 항목 순서를 반대로 합니다.
반전된 줄 리스트를 올바르게 시각화하려면 Code Block을
0..1..#50;
으로 변경하여 더 많은 줄을 작성합니다.Line.ByStartPointEndPoint 노드를 복제하고 Curve.PointAtParameter 및 두 번째 Line.ByStartPointEndPoint 사이에 List.Reverse 노드를 삽입합니다.
Watch3D 노드를 사용하여 두 가지 다른 결과를 미리 봅니다. 첫 번째 항목에서는 반전된 리스트가 없는 결과를 보여 줍니다. 줄은 인접한 점에 수직으로 연결됩니다. 그러나 반전된 리스트에서는 모든 점을 다른 리스트에 반대 순서로 연결합니다.
아래 링크를 클릭하여 예제 파일을 다운로드하십시오.
전체 예시 파일 리스트는 부록에서 확인할 수 있습니다.
List.ShiftIndices는 틀기 또는 나선형 패턴이나 기타 유사한 데이터 조작을 작성하는 데 유용한 도구입니다. 이 노드에서는 리스트의 항목을 지정된 색인만큼 이동합니다.
반전 리스트와 동일한 프로세스에서 Curve.PointAtParameter 및 Line.ByStartPointEndPoint에 List.ShiftIndices를 삽입합니다.
Code Block을 사용하여 리스트를 1개 색인만큼 이동하기 위해 값 "1"을 지정했습니다.
변경된 정도는 미세하지만 다른 점 세트에 연결할 때 하단 Watch3D 노드의 모든 줄이 1개 색인만큼 이동되었습니다.
예를 들어 Code Block을 더 큰 값인 "30" 으로 변경하면 대각선이 크게 달라진다는 것을 알 수 있습니다. 이 경우 이동은 카메라의 홍채처럼 작동하여 원래의 원통형 형식에서 틀기가 작성됩니다.
아래 링크를 클릭하여 예제 파일을 다운로드하십시오.
전체 예시 파일 리스트는 부록에서 확인할 수 있습니다.
List.FilterByBooleanMask는 부울 리스트나 "true" 또는 "false" 값을 기준으로 특정 항목을 제거합니다.
"true" 또는 "false" 값 리스트를 작성하려면 좀 더 많은 작업이 필요합니다.
Code Block을 사용하여
0..List.Count(list);
구문으로 표현식을 정의합니다. Curve.PointAtParameter 노드를 list 입력에 연결합니다. code block록 장에서 이 설정에 대해 좀 더 자세히 설명하겠지만, 이 경우에는 코드 줄에서 Curve.PointAtParameter 노드의 각 색인을 나타내는 리스트를 제공합니다.%** (modulus)** 노드를 사용하여 code block 의 출력을 x 입력에 연결하고 4 값을 y 입력에 연결합니다. 이렇게 하면 색인 리스트를 4로 나눈 나머지가 표시됩니다. Modulus는 패턴 작성에 매우 유용한 노드입니다. 모든 값은 가능한 나머지 4개(0, 1, 2, 3)로 표시됩니다.
%** (modulus)** 노드에서 0 값은 색인이 4로 나누어떨어짐을 의미합니다(0, 4, 8 등). == 노드를 사용하면 "0" 값을 기준으로 테스트하여 나누어떨어지는지 테스트할 수 있습니다.
Watch 노드에서는 true,false,false,false... 로 표시되는 true/false 패턴이 있음을 나타냅니다.
이 true/false 패턴을 사용하여 두 List.FilterByBooleanMask 노드의 마스크 입력에 연결합니다.
Curve.PointAtParameter 노드를 List.FilterByBooleanMask의 각 리스트 입력에 연결합니다.
Filter.ByBooleanMask의 출력은 "in" 및 "out" 으로 표시됩니다. "In" 은 마스크 값이 "true" 인 값을 나타내고 "out" 은 마스크 값이 "false" 인 값을 나타냅니다. Line.ByStartPointEndPoint 노드의 "in" 출력을 startPoint 및 endPoint 입력에 연결하여 필터링된 선 리스트를 작성했습니다.
Watch3D 노드에서는 점보다 선 수가 더 적은 것을 나타냅니다. true 값만 필터링하여 노드의 25%만 선택했습니다.
토끼굴 더 아래로 내려가면서 계층에 더 많은 계층을 추가해 보겠습니다. 데이터 구조는 3차원 이상의 리스트의 리스트로 더 확장될 수 있습니다. 리스트는 Dynamo의 자체 항목이므로 가능한 많은 차원이 있는 데이터를 작성할 수 있습니다.
여기에서 작업하는 것은 러시아 마트료시카에 비유할 수 있습니다. 각 리스트는 여러 항목을 포함하는 하나의 컨테이너로 간주할 수 있습니다. 각 리스트는 고유한 특성을 가지며, 고유한 객체로 간주됩니다.
러시아 마트료시카(사진 출처: ) 세트는 n차원 리스트와 비슷합니다. 각 도면층은 리스트를 나타내고 각 리스트 안에는 항목이 포함되어 있습니다. Dynamo의 경우 각 컨테이너 안에는 여러 개의 컨테이너가 포함될 수 있습니다(각 리스트의 항목을 나타냄).
n차원 리스트는 시각적으로 설명하기 어렵지만, 이 장에서는 3차원 이상의 리스트를 중점적으로 다루는 몇 가지 연습을 진행해보겠습니다.
매핑은 Dynamo의 데이터 관리에서 가장 복잡한 부분이며, 특히 리스트의 복잡한 계층 작업을 수행할 때와 관련이 있습니다. 아래에 제공되는 일련의 연습을 진행하면서 데이터가 다차원이 될 때 매핑 및 조합을 사용해야 하는 경우를 살펴보겠습니다.
List.Map 및 List.Combine은 이전 섹션에서 이미 설명했습니다. 아래의 마지막 연습에서는 복잡한 데이터 구조에서 이러한 노드를 사용해 보겠습니다.
아래 링크를 클릭하여 예제 파일을 다운로드하십시오.
전체 예시 파일 리스트는 부록에서 확인할 수 있습니다.
이 연습은 가져온 형상을 연결하는 3개의 연습 시리즈 중 첫 번째입니다. 이 연습 시리즈의 각 부분에서는 점점 더 복잡한 데이터 구조를 다룹니다.
연습 파일 폴더에 있는 .sat 파일로 시작하겠습니다. File Path 노드를 사용하여 이 파일을 선택할 수 있습니다.
Geometry.ImportFromSAT를 사용하여 형상을 Dynamo 미리보기에 두 개의 표면으로 가져옵니다.
이 연습에서는 간단한 작업을 위해 표면 중 하나로 진행합니다.
색인 1을 선택하여 위쪽 표면을 선택합니다. 이 작업은 List.GetItemAtIndex 노드를 사용하여 수행합니다.
Geometry.ImportFromSAT 미리보기에서 형상 미리보기를 끕니다.
다음 단계에서는 표면을 점 그리드로 분할합니다.
1. Code Block을 사용하여 다음 두 코드 줄을 삽입합니다.
0..1..#10;
0..1..#5;
2. Surface.PointAtParameter에서 두 Code Block 값을 u 및 v 에 연결합니다. 이 노드의 레이싱 을 "외적" 으로 변경합니다.
3. 출력에는 데이터 구조가 표시되며 Dynamo 미리보기에서도 이 구조를 볼 수 있습니다.
다음으로, 마지막 단계의 점을 사용하여 표면을 따라 10개의 곡선을 생성했습니다.
데이터 구조가 구성되는 방식을 확인하기 위해 NurbsCurve.ByPoints를 Surface.PointAtParameter의 출력에 연결합니다.
더 명확한 결과를 얻기 위해 지금은 List.GetItemAtIndex 노드의 미리보기를 끌 수 있습니다.
기본 List.Transpose를 사용하면 리스트의 리스트를 구성하는 열과 행이 반전됩니다.
List.Transpose의 출력을 NurbsCurve.ByPoints에 연결하면 이제 5개의 곡선이 표면을 가로질러 가로로 표시됩니다.
이전 단계에서 NurbsCurve.ByPoints 노드의 미리보기를 꺼서 이미지에서 동일한 결과를 얻을 수 있습니다.
좀 더 복잡한 작업을 수행해 보겠습니다. 이전 연습에서 작성한 곡선에 대해 작업을 수행하려고 한다고 가정해 보겠습니다. 이러한 곡선을 다른 표면과 연관 짓고 그 사이에서 로프트를 수행하고자 할 수도 있습니다. 이렇게 하려면 데이터 구조에 더 많은 신경을 써야 하지만 기본 논리는 동일합니다.
이전 연습의 단계로 시작하고 List.GetItemAtIndex 노드를 사용하여 가져온 형상의 상단 표면을 구분합니다.
Surface.Offset을 사용하여 표면을 10 씩 간격을 띄웁니다.
이전 연습과 같은 방법으로 다음과 같은 코드 두 줄을 사용하여 code block 을 정의합니다.
0..1..#10;
0..1..#5;
이러한 출력을 두 개의 Surface.PointAtParameter 노드에 연결하고 각 레이싱 을 "외적" 으로 설정합니다. 이러한 노드 중 하나는 원래 표면에 연결되어 있고 다른 노드는 오프셋 표면에 연결되어 있습니다.
이러한 표면의 미리보기를 끕니다.
이전 연습에서와 같이 출력을 두 개의 NurbsCurve.ByPoints 노드에 연결합니다. 결과에는 두 표면에 해당하는 곡선이 표시됩니다.
List.Create를 사용하면 두 곡선 세트를 한 리스트의 리스트로 결합할 수 있습니다.
출력에서 각 NURBS 곡선 연결 세트를 나타내는 10개 항목을 각각 포함하는 리스트가 2개 생성됩니다.
Surface.ByLoft를 수행하면 이 데이터 구조를 시각적으로 이해할 수 있습니다. 이 노드에서는 각 하위 리스트의 모든 곡선을 로프트합니다.
이전 단계에서 사용한 Surface.ByLoft 노드의 미리보기를 끕니다.
List.Transpose를 사용하여 모든 열과 행을 반전합니다. 이 노드는 10개의 곡선으로 이루어진 2개의 리스트를 2개의 곡선으로 이루어진 10개의 리스트로 전송합니다. 이제 각 NURBS 곡선이 다른 표면의 이웃 곡선과 연관됩니다.
Surface.ByLoft를 사용하여 리브 구조에 도달합니다.
다음으로, 이 결과를 얻기 위한 대체 프로세스를 살펴보겠습니다.
혼동을 피하기 위해, 시작하기 전에 이전 단계의 Surface.ByLoft 미리보기를 끕니다.
List.Transpose 대신 List.Combine 을 사용할 수 있습니다. 이는 각 하위 리스트에서 "연결자" 로 작동합니다.
이 경우에는 List.Create 를 "연결자" 로 사용하여 하위 리스트에서 각 항목의 리스트를 작성합니다.
Surface.ByLoft 노드를 사용하여 이전 단계와 동일한 표면을 표시합니다. 이 경우 행과 열을 더 쉽게 바꿀 수 있지만 데이터 구조가 훨씬 복잡해지면 List.Combine을 사용하는 것이 더 안정적입니다.
몇 단계 이전으로 되돌아가서 리브 구조의 곡선 방향을 전환하려면 NurbsCurve.ByPoints에 연결하기 전에 List.Transpose를 사용할 수 있습니다. 그러면 열과 행이 반전되어 5개의 수평 리브가 생성됩니다.
이제 한 단계 더 진행해 보겠습니다. 이 연습에서는 가져온 두 표면을 모두 사용하고 복합 데이터 계층을 작성합니다. 이번에도 동일한 기본 논리를 사용하여 동일한 작업을 완료하는 것이 작업 목표입니다.
이전 연습에서 가져온 파일로 시작합니다.
이전 연습에서와 같이 Surface.Offset 노드를 사용하여 10 만큼 간격을 띄웁니다.
출력에서 오프셋 노드를 사용하여 두 개의 표면을 생성했습니다.
이전 연습과 같은 방법으로 다음과 같은 코드 두 줄을 사용하여 Code Block을 정의합니다.
0..1..#20;
0..1..#20;
이러한 출력을 두 개의 Surface.PointAtParameter 노드에 연결하고 각 레이싱을 "외적" 으로 설정합니다. 이러한 노드 중 하나는 원래 표면에 연결되어 있고 다른 노드는 오프셋 표면에 연결되어 있습니다.
이전 연습에서와 같이 출력을 두 개의 NurbsCurve.ByPoints 노드에 연결합니다.
NurbsCurve.ByPoints의 출력을 보면 이전 연습보다 더 복잡한 두 리스트의 리스트가 생성된 것을 알 수 있습니다. 데이터는 기본 표면을 기준으로 분류되므로 데이터 구조에 다른 계층을 추가했습니다.
또한 Surface.PointAtParameter 노드가 좀 더 복잡해졌습니다. 이 경우에는 리스트의 리스트의 리스트를 얻게 됩니다.
계속 진행하기 전에 기존 표면의 미리보기를 끕니다.
List.Create 노드를 사용하여 NURBS 곡선을 하나의 데이터 구조로 병합함으로써 리스트의 리스트의 리스트를 작성합니다.
Surface.ByLoft 노드를 연결하면 각각 원래 데이터 구조에서 작성된 대로 자체 리스트에 남기 때문에 원래 표면의 버전을 얻게 됩니다.
이전 연습에서는 List.Transpose를 사용하여 리브 구조를 작성할 수 있었지만, 여기서는 이 기능이 작동하지 않습니다. 바꾸기는 2차원 리스트에서 사용해야 하는데, 현재 리스트는 3차원 리스트이므로 "열 및 행 반전" 작업이 쉽게 작동하지 않습니다. 리스트는 객체이므로 List.Transpose를 사용하면 하위 리스트가 있는 리스트가 반전되지만, 계층에서 한 리스트 아래에 있는 NURBS 곡선의 행과 열이 반전되지는 않습니다.
여기서는 List.Combine이 더 적합합니다. 보다 복잡한 데이터 구조로 이동하는 경우에는 List.Map 및 List.Combine 노드를 사용할 수 있습니다.
List.Create 를 "연결자" 로 사용하면 더 잘 작동하는 데이터 구조가 작성됩니다.
데이터 구조는 여전히 계층 구조 중 한 단계 아래에서 행과 열이 바뀌어야 합니다. 이렇게 하려면 List.Map을 사용합니다. 이 방법은 입력 리스트가 두 개 이상이 아닌 1개가 있는 경우를 제외하고, List.Combine과 유사하게 작동합니다.
List.Map에 적용할 함수는 List.Transpose로, 이를 사용하면 기본 리스트 내의 하위 리스트에 포함된 열과 행이 반전됩니다.
마지막으로 적절한 데이터 계층을 사용해 NURBS 곡선을 로프트하여 리브 구조를 얻을 수 있습니다.
다음과 같이 입력 설정이 지정된 Surface.Thicken 노드를 사용하여 형상에 깊이를 추가해 보겠습니다.
이 두 구조를 지지하는 표면을 추가하는 것이 좋으므로, 다른 Surface.ByLoft 노드를 추가하고 이전 단계의 NurbsCurve.ByPoints에 대한 첫 번째 출력을 입력으로 사용합니다.
미리보기가 복잡해지므로 각 노드를 마우스 오른쪽 버튼으로 클릭하고 '미리보기'를 선택취소하여 이러한 노드의 미리보기를 끄면 더 나은 결과를 확인할 수 있습니다.
선택한 이러한 표면을 두껍게 하면 연결이 완료됩니다.
가장 편안한 흔들의자는 아니지만 많은 데이터가 사용되었습니다.
마지막 단계로 줄무늬 멤버의 방향을 반대로 바꿉니다. 이전 연습에서 행과 열을 바꾸는 작업을 사용했으므로 여기에도 비슷한 작업을 수행합니다.
계층 구조에 계층이 1개 더 있으므로 List.Tranpose 함수와 함께 List.Map을 사용하여 NURBS 곡선의 방향을 변경해야 합니다.
디딤판 수를 늘리려는 경우 Code Block을
0..1..#20;
0..1..#30;
으로 변경할 수 있습니다.
흔들의자의 첫 번째 버전은 날렵한 모습이었으므로, 두 번째 모델은 오프로드에서 휴식을 취하기 적절한 스포츠 유틸리티 버전으로 만들었습니다.
사진 출처: