이번 글에서는 라이노 그래스호퍼에서 Brep의 윗면만 선택할 수 있는 방법에 대해 다룹니다.
오늘 제가 알려드릴 그래스호퍼에서 Brep의 윗면만 선택하는 방법은 두가지가 있습니다. 첫번째는 그래스호퍼의 기본 컴포넌트만 사용하는 것이고, 두번째 방법은 그래스호퍼 파이썬을 이용하는 것입니다. 두 방법 모두 설명해드릴 테니 편한 방법으로 따라하시면 됩니다.
1. 그래스호퍼 기본 컴포넌트만 사용하여 윗면 선택하기
그래스호퍼 기본 컴포넌트만을 사용하여 Brep의 윗면을 선택하는 건 어렵지 않습니다. 먼저 윗면만 선택하고 싶은 Brep을 Brep 컴포넌트에 불러와줍니다. 그리고 Deconstruct Brep 컴포넌트에 연결합니다. 이러면 참조된 Brep의 모든 면 하나 하나에 대해 접근할 수 있게 됩니다.
우리는 Brep의 면 하나 하나의 법선 벡터를 Z 방향 단위 벡터와 내적하여 해당 면의 방향을 검사할 거예요. 이때 면들의 법선 벡터 역시 길이가 1인 단위 벡터예요. Brep의 옆면들의 법선 벡터와 Z 방향 단위 벡터를 내적하면 각도가 90도이기 때문에, cos 90º = 0 이므로 0이 나와요. 그리고 Brep의 맨 밑면의 법선 벡터와 Z 방향 단위 벡터를 내적하면 각도가 180도이기 때문에 cos 180º = -1 이므로 -1이 나와요. 마지막으로 맨 윗면의 법선 벡터와 Z 방향 단위 벡터의 내적은 결국 두 벡터 길이의 곱과 같기 때문에, 두 벡터 모두 길이가 1인 단위벡터이므로 결과는 1이 나와요. 이렇게 각 면을 모두 테스트 했을 때 결과가 1이 나오는 면은 맨 윗면밖에 없다는 것을 이용하여 우리는 맨 윗면만을 고를 수 있어요.
맨 윗면을 고르는 방법에 대해 설명을 했으니, 이제 그래스호퍼로 이것을 구현하는 방법에 대해 설명할게요. Evaluate Surface 컴포넌트를 통해 각 면의 법선 벡터를 추출해요. 이때 S를 우클하여 Reparameterize를 체크해줘야 해요. 그리고 uv에는 //를 입력하여 패널을 불러온 뒤 0.5, 0.5를 입력하여 연결해줘요. 그 후 Dot Product(내적) 컴포넌트를 불러오고 A에는 Surface Evaluate의 N(Normal, 법선 벡터)을 연결해줘요. B에는 Unit Z 컴포넌트를 연결해줘요. 이때 패널을 불러와 내적의 결과물을 보면 앞서 설명한대로 하나는 1, 하나는 -1, 나머지는 모두 0이 출력되고 있는 것을 확인할 수 있을 거에요.
이제 여기서 1이라는 결과만을 선택할 때 Equality(=) 컴포넌트를 이용한다고 생각할 수 있어요. 하지만 우리는 그러지 않을 거예요. 그래스호퍼에서 출력되는 결과물이 보기엔 1로 보여서 정확하게 1로 출력된다고 생각할 수 있지만, 소수점 단위에서는 그러지 않을 수가 있어서 우리가 원하는 결과물이 선택되지 않을 수 있어요. 그래서 우리는 Smaller Than(<) 컴포넌트를 이용할 거예요.
Smaller Than(<) 컴포넌트를 불러온 뒤 A에는 내적의 결과를 연결하고 B에는 패널에 0.01을 입력하여 연결해줘요. 결과물을 패널에 연결해보면 1을 제외한 모든 항목에 True가 표시될 거예요. 이 결과물을 Cull Pattern 컴포넌트를 불러와 P에 연결해줘요. 이때 P를 우클하여 Invert를 체크해줘야 해요. L에는 앞의 Deconstruct Brep 컴포넌트의 F를 연결해줘요.
Smaller Than 컴포넌트 대신 Larger Than(>) 컴포넌트를 사용해도 돼요. 그러면 B에는 0.99를 입력하면 되고, Cull Pattern의 B에 연결할 때 P를 Invert를 하지 않아야 해요.
이렇게 그래스호퍼 기본 컴포넌트만 사용하여 Brep의 윗면을 선택하는 작업을 해봤어요. 만약 밑면만 선택하고 싶다면 어떻게 해야 할지 감이 오시나요? Z 방향 단위 벡터와 내적하였을 때 -1이 나오면 밑면이라는 뜻이니, Smaller Than 에서 B에 -0.99를 입력하면 돼요.
2. 파이썬 이용하여 윗면 선택하기
파이썬을 이용하면 컴포넌트 단 하나로 Brep의 윗면을 선택할 수 있어요. 그리고 기본 컴포넌트로 윗면을 선택할 때는 없는 장점이 생겨요. Brep의 데이터 구조가 그대로 유지된다는 장점이 있어요. 그렇게 하면 이 윗면을 선택하여 뒤에서 다른 작업을 더 할 때 데이터를 편하게 다룰 수 있어요. 아직 데이터 구조에 익숙하지 않더라도 그냥 그런가 보다 하고 그냥 따라 하기만 해도 돼요.
GhPython Script 컴포넌트를 불러와요. 그리고 왼쪽의 인풋을 확대하여 -를 눌러 입력값 하나를 없애어 입력값을 하나만 받도록 설정해요. 그리고 남은 하나에 우클하여 이름을 B로 바꿔줘요. 컴포넌트의 오른쪽에 있는 out도 같은 방법으로 없애고, a를 우클하여 이름을 F로 바꿔줘요.
그 후 B를 우클하여 List Access로 바꿔줘요.
거기서 다시 Type hint에 들어가 맨밑에 있는 Brep을 체크해줘요.
그 후 컴포넌트를 더블 클릭하여 들어간 뒤 안에 있는 모든 것을 다 지워줘요. 그리고 사진과 같이 입력하면 돼요.
mList = []
for i in range(len(B)):
f = B[i].Faces
C = f.Count
for j in range(C):
fs = f[j]
fv = (fs.NormalAt(0.5,0.5))
if fv.Z == 1:
mList.append(fs)
F = mList
혹시 따라 입력하는 것이 어렵다면 복사 붙여넣기 하면 돼요.
이 파이썬 코드 역시 그래스호퍼 기본 컴포넌트로 Brep의 윗면을 선택한 것과 거의 비슷한 원리로 윗면을 선택해요. Brep의 각 면의 법선 벡터를 추출한 뒤 만약 그것이 1이라면 윗면이라고 판단하고 결과로 출력해요. Z 방향의 단위 벡터와 비교하는 과정이 빠졌어요. 파이썬에선 좀 더 세부적으로 데이터를 다룰 수 있기 때문에 법선 벡터의 방향을 바로 조사할 수 있기 때문이에요. 이 스크립트를 작성할 때는 rhinocommon이라는 api를 활용했어요.
이렇게 그래스호퍼, 파이썬, rhinocommon을 활용하여 Brep의 윗면만 선택하는 방법을 알아봤어요. 혹시 질문이 있다면 댓글로 달아주세요!
'그래스호퍼 > 튜토리얼' 카테고리의 다른 글
그래스호퍼 기초 강의 (0) | 2022.04.21 |
---|
댓글