명령어가 갑자기 안 먹힐 때 : 라이노 객체 탐구
INTRO : 수학은 개념. 라이노도 개념

라이노를 쓰다 보면 분명히 썼던 명령어가 갑자기 안 먹히는 순간이 있습니다. 대개 두 객체의 상태가 달라서, 혹은 어딘가 불량 객체가 끼어들어서입니다. 문제는 이게 티가 잘 안 난다는 거예요. 작업하는 동안 모르는 사이에 조용히 일어납니다.
이 시리즈는 그 원인을 거슬러 올라가는 글입니다. 라이노 객체가 어떤 종류로 나뉘고, 각각 어떤 특성을 갖는지 먼저 살펴본 다음, 불량 객체가 왜 생기는지를 짚어볼 예정입니다. 라이노는 오래 사용했지만 주의 깊게 보지 않았던 내용이라 예상합니다.
EP1. 라이노 Nurbs 개체 분류
|
종류 |
정의 |
차원 |
|
Point |
위치 정보를 가진 점 객체 |
0차원 |
|
Line, Curve |
점으로 형태가 결정되는 선 객체 |
1차원 |
|
Surface |
면적을 가지는 면 객체 |
2차원 |
|
Polysurface |
2차원 면 객체들이 경계를 공유하며 결합된 객체 |
2차원 |
|
Solid |
면 객체들이 닫혀 체적을 지닌 객체 |
3차원 |
라이노의 기본 객체들은 위 표와 같이 분류할 수 있습니다. 한편 라이노는 3차원 공간이기 때문에 점·선·면이 보이는 대로 항상 평평하지 않습니다. 이는 자유로운 형태를 가능하게 하는 동시에 예상치 못한 오류의 원인이 되기도 합니다. 본격적으로 객체의 특성과 명령어를 상세히 알아보겠습니다.
-
Point(Pt:점)

Point는 위치 정보를 지닌 단일 객체입니다. 길이도, 면적도, 체적도 없는 0차원에 속합니다. 그렇기에 가시적인 모델링 요소는 아닙니다. 주로 모델링의 기준점과 참조점을 설정하거나, 특정 부분의 위치를 추출하는 경우에 사용합니다.
-
Curve(Crv:선)

Curve는 점과 점 사이를 잇는 1차원 객체 중 하나입니다. 라이노에서 선은 크게 세 가지로 구분합니다.
Line: 두 점을 최단거리로 잇는 직선
Polyline: 여러 점을 순차적으로 이어 꺾인 선
곡선: 제어점의 위치에 따라 곡률이 결정되는 선
제어점이란 곡선을 점 방향으로 자연스럽게 잡아당기는 역할을 합니다. 제어점이 꼬이거나 겹치면 커브 자체가 오류가 되기도 합니다. 커브를 만들거나 수정할 때 제어점을 주기적으로 확인하는 습관이 오류를 줄이는 데 도움이 됩니다. 제어점 오류로 인한 구체적인 사례는 다음 편에서 다루겠습니다.
-
Surface

Surface는 면적을 지닌 2차원 객체입니다. 3차원 공간 내에 존재하지만 두께는 없습니다. 마치 종이처럼 생각하면 됩니다. 종이는 말고, 휘고, 구부리고, 자를 수 있습니다. 그러나 한 점을 꾹 눌러 찌그러뜨리거나 구기는 순간, 쓰기 어려운 종이가 됩니다. Surface도 유사합니다. Surface가 현실에 있는 종이라고 생각하면 편합니다. Surface를 생성하고 수정할 때, 직관적으로 어떤 행위를 가하는지 고려해야합니다.
+Addition
서피스에는 본질적인 직사각형 구조가 있습니다. 두 가장자리가 서로 만나는 곳을 심(seam)이라고 합니다. 직사각형 형태가 아닌 서피스는 부분적으로 잘렸거나(트림: trim) 가장자리의 제어점이 이동된 것입니다.
-
Polysurface > Solid

Polysrf는 Srf가 모서리를 공유하며 결합한 형태입니다. 마치 종이 2개의 끝을 붙인 형태입니다. Srf는 2차원 객체이지만, 3차원 공간 내에서 회전되어 연결할 수 있습니다. 따라서 Polysrf는 두 상태로 구분합니다. Open과 Closed 상태입니다.
Open Polysrf: 면을 붙인 2차원 객체의 집합
Closed Polysrf: 면들이 닫혀, 체적을 지닌 3차원 입체 = Solid
Open 상태는 아직 2차원 객체 집합이므로 Boolean 계열 명령어(입체 전용)가 불가능한 경우가 있습니다. 이제는 겉으로 닫힌 도형이더라도, 속성 창에서 객체의 상태를 파악해 고칠 수 있습니다.
EP2. 라이노 특이 개체 분류
|
종류 |
정의 |
주 원인 |
|
Self-intersecting Curve |
커브가 자기 자신과 교차한 상태 |
제어점이 꼬임 겹침 |
|
The Ghost Gap |
서피스의 모서리가 실제 경계와 맞닿지 않은 상태 |
복잡한 서피스 생성 |
|
Naked Edge |
서피스 모서리가 인접 면과 연결되지 않아 열린 상태 |
gap·Trim 경계 불일치 |
|
Non-manifold Edge |
하나의 모서리에 세 개 이상의 면이 연결된 상태 |
면을 잘못된 방향으로 Join |
1편에서 기본 객체의 종류와 특성을 톺아보았습니다. 이번에는 불량 객체를 알아봅니다. 불량 객체는 대부분 겉으로 티가 나지 않습니다. 정상 객체 같아 보이지만, 명령어를 실행하는 순간 알아채게 됩니다. 문제는 불량이 언제 생겼는지도 모르는 채 작업을 진행하는 점입니다. 불량 객체의 유형과 원인을 알아두면, 오류가 생기는 지점을 조금이나마 의심할 수 있습니다.
-
Curve 불량 객체
커브 불량은 주로 제어점이 의도치 않게 꼬이거나 겹치면서 발생합니다. 눈에 보이지 않는 경우가 많아, 서피스를 만들려는 순간 오류로 드러납니다.
– Self-intersecting Curve

커브가 자기 자신과 교차한 상태입니다. 주로 제어점을 과도하게 이동하거나, 가져온 커브에서 발생합니다. Offset 명령어를 사용할 때도 안쪽으로 지나치게 좁혀지면 교차가 생깁니다.
확인 방법은 SelintersectingCrv 명령어로 커브 상태를 진단할 수 있습니다. 교차 지점 근처 제어점을 찾아 위치를 조정하거나, 해당 구간을 Rebuild, CurveBoolean으로 재구성하면 해결되는 경우가 많습니다.
-
Surface 불량 객체
이전에 Srf는 종이와 유사하다고 설명한 것 기억나시나요? Rhino는 현실에서 보기 힘든 특이한 형태의 Srf도 만들 수 있습니다. 그러나 특정 Srf는 Polysrf가 될 때 문제를 일으키곤 합니다. 종이를 이어 붙일 때 모서리가 정확히 맞닿지 않으면 들뜨는 것처럼, Srf도 모서리가 맞닿지 않으면 Join 시 문제가 생깁니다. 이번에는 모서리가 맞닿지 않는 Srf가 만들어지는 세 가지 케이스(Loft, Sweep, NetworkSrf)를 알아보겠습니다.
– Loft
Loft는 두 개 이상의 커브를 순차적으로 통과하는 서피스를 생성합니다. 단면 커브의 구조(제어점, 차수)가 다르면 모서리 불일치가 발생합니다. 주로 세 가지 상황이 있습니다.

– 단면 커브들의 제어점 개수가 다른 경우
– 닫힌 커브의 시작점(Seam) 위치나 방향이 반대인 경우
– 직선(1차수)과 곡선(3차수)을 혼용한 경우
[예방 및 해결] Loft 전에 모든 단면 커브를 Rebuild로 동일한 제어점 개수(Point Count)와 차수(Degree)로 맞추는 습관이 중요합니다. Loft 미리보기 상태에서 Align Profiles 옵션으로 커브 방향과 Seam 위치를 정렬하는 것도 도움이 됩니다. 생성 후에는 ShowEdges로 모서리 상태를 확인합니다.
– NetworkSrf
NetworkSrf는 가로(U)·세로(V) 방향의 커브망을 이용해 서피스를 생성합니다. Loft보다 자유도가 높지만 모서리 불일치가 생기기 쉽습니다. 주로 세 가지 상황이 있습니다.

– 가로 커브와 세로 커브가 허용 오차 내에서 정확히 만나지 않을 때
– 너무 많은 커브를 사용해 제어점이 과도하게 늘어날 때
– 경계 커브들이 매끄럽지 않아 인접 서피스와 연속성이 맞지 않을 때
[예방 및 해결] 커브 교차 시 Int 스냅으로 교차점을 정확히 일치시킵니다. 생성 전 Rebuild로 커브 구조를 단순화하고, 생성 후에는 ShowEdges로 모서리 상태를 확인합니다.
– Sweep
Sweep은 단면 커브를 레일 커브를 따라 이동시켜 서피스를 생성합니다. 레일의 상태가 서피스 품질을 결정하는 핵심입니다. 주로 세 가지 상황이 있습니다.

– 단면 커브의 끝점이 레일 위에 정확히 올라가 있지 않을 때
– 레일 커브에 꺾임(Kink)이 있을 때
– 레일과 단면 커브의 차수(Degree)가 크게 다를 때
[예방 및 해결] 단면 커브 배치 시 End 스냅으로 끝점이 레일 위에 정확히 올라가 있는지 확인합니다. SimplifyCrv로 레일 커브의 불필요한 꺾임을 제거하고, 생성 후에는 ShowEdges로 모서리 상태를 확인합니다.
-
Polysurface 불량 객체
앞서 살펴본 서피스 모서리 불일치는 Join 이후 크게 두 가지 불량으로 드러납니다. Naked Edge와 Non-manifold Edge입니다.
– Naked Edge = Open Polysrf

Naked Edge는 서피스나 폴리서피스의 모서리가 인접한 면과 연결되지 않은 상태입니다. 종이를 이어붙였는데 한쪽 끝이 들떠있는 상태와 같아요. Solid 객체에는 Naked Edge가 없습니다. Rhino 즉 Naked Edge가 하나라도 있으면 Solid가 아니고, Boolean 연산이 작동하지 않습니다. 주로 세 가지 상황에서 발생합니다.
– 서피스 모서리 간 간격이 허용 오차를 초과한 경우
– Loft·Sweep·NetworkSrf 생성 시 모서리가 정확히 맞닿지 않은 경우
– Trim 이후 경계선이 인접 면과 일치하지 않은 경우
확인은 ShowEdges → Naked edges 체크하면 해당 모서리가 표시됩니다. 해결은 RebuildEdges로 모서리를 재정렬한 후 다시 Join하거나, 모서리가 Gap이 큰 경우 해당 서피스를 재생성하는 것이 가장 확실합니다.
– Non-manifold Edge
하나의 모서리에 세 개 이상의 면이 연결된 상태가 Non-manifold입니다. Rhino 정상적인 Polysurface에서 모든 모서리는 정확히 두 개의 면이 공유해요. 여기에 세 번째 면이 같은 모서리에 붙어버리면 라이노가 “이 모서리의 안쪽이 어디고 바깥쪽이 어디인지” 판단하지 못합니다. 주로 두 가지 상황에서 발생합니다.

– Patch·NetworkSrf로 생성한 서피스의 모서리가 주변 면과 어긋난 채 Join될 때.
– Boolean 연산에서 올바르지 않은 두 객체가 모서리에서 겹칠 때.
확인은 ShowEdges → Non-manifold edges 체크하면 마젠타색으로 표시됩니다. 해결은 ExtractSrf로 문제 면을 분리한 후 해당 서피스를 재생성하고 다시 Join하는 것이 가장 확실합니다.
OUTRO : 누구나 알지만 본 사람은 없는

Rhino 사용자 분들도 아마 마감이 다가오면 숨통이 조이는 경험을 하셨을거라 생각합니다. 필자의 경우 중간에 오류가 발생하면 이 잡듯 뒤지거나 일단 출력하고 보는 경우가 허다했습니다. 이번 기회에 다시금 기본 원리를 알아보고, 앞으로는 조금 더 체계적이고 명석한 모델링 하실 수 있길 바랍니다. 오늘도 고생하셨습니다.

