메뉴 건너뛰기

A11Y

이번 시간에는 OpenSCAD를 이용해 주사위처럼 모서리와 꼭짓점이 부드럽게 둥근 정육면체를 만드는 방법을 배워보겠습니다.

우리가 만들고 싶은 모양은 각진 정육면체가 아니라, 손에 쥐었을 때 부드러운 느낌을 주는 둥글둥글한 주사위입니다.

혹시 이런 생각을 하실 수도 있습니다. '정육면체의 여덟 개 꼭짓점마다 작은 공을 하나씩 두고, 이 모든 것을 hull()이라는 명령으로 감싸면 되지 않을까?' 하고 말이죠. 아주 좋은 아이디어지만, hull()을 사용하면 꼭짓점뿐만 아니라 모서리 전체가 함께 둥글어져서 우리가 원하는 주사위 모양과는 조금 다른, 캡슐 여러 개가 뭉쳐진 듯한 모양이 됩니다.

그래서 오늘은 더 정교하고 멋진 방법을 사용해 보겠습니다. 바로 두 도형이 겹치는 부분만 남기는 방법입니다.

먼저, 우리가 만들고 싶은 크기의 정육면체를 하나 만듭니다. 그리고 그 정육면체보다 조금 더 큰 투명한 공을, 정육면체와 같은 중심에 겹쳐서 놓습니다. 이때 정육면체의 날카로운 꼭짓점과 모서리들은 공의 표면 바깥으로 살짝 튀어나가게 되겠죠?

이제 마법을 부릴 시간입니다. 두 도형이 정확히 겹쳐지는 공간만 남기고 나머지는 모두 없애는 겁니다. 그러면 어떻게 될까요? 공 안쪽에 있던 정육면체의 평평한 면들은 그대로 남고, 공 바깥으로 튀어나갔던 날카로운 꼭짓점과 모서리들은 공의 둥근 표면을 따라 깔끔하게 잘려나가게 됩니다. 바로 이것이 우리가 원하던, 꼭짓점과 모서리가 부드럽게 둥근 주사위의 몸체입니다.

이러한 '겹치는 부분만 남기기'를 수행하는 OpenSCAD 명령이 바로 intersection() 입니다. 우리말로 하면 '교집합'이라는 뜻이죠.

intersection() 명령은 괄호 {} 안에 있는 모든 물체들이 공통으로 차지하는 공간만 결과물로 보여줍니다. 오늘 배울 주사위뿐만 아니라, 음료수 캔의 위아래처럼 살짝 볼록하게 튀어나온 원기둥을 만들 때도 아주 유용하게 쓰이는 기능입니다.

OpenSCAD 코드 예제

자, 그럼 실제 코드를 통해 어떻게 둥근 주사위 몸체가 만들어지는지 차근차근 살펴보겠습니다.

intersection()을 이용한 둥근 주사위 몸체 생성 코드

코드의 시작 <<<


// 주사위의 한 변 길이를 정하는 변수입니다.
die_size = 20;

// 모서리의 둥근 정도를 결정하는 구의 반지름입니다.
// 이 값이 클수록 더 완만하게 둥글어집니다.
rounding_radius = die_size * 0.7;

// 3D 모델의 곡면을 얼마나 부드럽게 표현할지 정하는 값입니다.
// 숫자가 클수록 표면이 매끄러워집니다.
$fn = 50;


// =================================
// 주사위 몸체 만들기 (intersection 사용)
// =================================

// intersection: 중괄호 안의 도형들이 겹치는 부분만 남깁니다.
intersection() {
    // 첫 번째 도형: 기본이 되는 정육면체입니다.
    // center=true 옵션으로 좌표의 중심에 만듭니다.
    cube(die_size, center=true);
    
    // 두 번째 도형: 정육면체를 덮는 큰 구입니다.
    // 이 구의 반지름이 모서리의 둥근 정도를 결정합니다.
    sphere(r = rounding_radius);
}
                

>>> 코드의 끝

코드 해설

코드를 한 줄씩 자세히 뜯어보겠습니다.

1. 변수 설정

먼저, 모델의 특성을 결정하는 세 가지 변수를 설정했습니다.

  • die_size = 20;
    주사위의 가로, 세로, 높이 크기를 20으로 정합니다. 이 값을 바꾸면 주사위의 전체 크기가 조절됩니다.
  • rounding_radius = die_size * 0.7;
    이것이 오늘 배움의 핵심입니다. 정육면체와 겹칠 구의 반지름을 정하는 값이죠. 이 값이 주사위 모서리의 둥근 정도를 결정합니다. 만약 이 반지름이 너무 작으면 정육면체를 다 덮지 못하고, 반대로 너무 크면 정육면체의 날카로운 부분이 거의 잘려나가지 않아 둥근 효과가 미미해집니다. 보통 주사위 크기의 절반보다는 크고, 주사위 크기보다는 약간 작게 설정하면 자연스러운 모양이 나옵니다.
  • $fn = 50;
    $fn은 OpenSCAD의 특별한 변수로, 모델에 포함된 모든 곡면의 부드러움을 조절합니다. 컴퓨터는 완벽한 곡선을 그릴 수 없기 때문에, 실제로는 아주 작은 평면들을 여러 개 이어 붙여 곡선처럼 보이게 만듭니다. $fn은 이 평면 조각의 개수를 정하는 값으로, 숫자가 클수록 더 부드럽고 실제 같은 곡면이 만들어집니다.

2. 주사위 몸체 만들기

이제 실제 모양을 만드는 intersection() 부분을 살펴보겠습니다.

  • intersection() { ... }
    이 명령은 중괄호 {} 안에 있는 모든 도형들을 대상으로 "모두의 공통 영역만 남겨라" 라고 지시하는 역할을 합니다.
  • cube(die_size, center=true);
    intersection() 안의 첫 번째 도형은 주사위의 기본 뼈대가 될 정육면체입니다. center=true 옵션을 주어 좌표계의 원점(0, 0, 0)을 중심으로 생성되도록 했습니다.
  • sphere(r = rounding_radius);
    두 번째 도형은 바로 이 정육면체를 둥글게 깎아낼 '칼' 역할을 하는 구입니다. 앞서 설정한 rounding_radius 값을 반지름으로 가지며, 정육면체와 마찬가지로 좌표계의 원점을 중심으로 생성됩니다.

이렇게 두 도형을 intersection() 안에 넣어주면, OpenSCAD는 두 도형이 정확히 겹치는 공간을 계산해서 최종 결과물, 즉 모서리가 부드럽게 깎인 멋진 주사위 몸체를 우리에게 보여줍니다.

정리: 불리언 연산과 CSG

오늘 배운 intersection()과 같이, 여러 개의 3D 모델을 합치거나, 빼거나, 공통 부분만 찾는 연산을 불리언 연산(Boolean Operations) 이라고 부릅니다. 이는 수학의 '집합' 개념을 3D 모델링에 적용한 것입니다.

OpenSCAD의 대표적인 불리언 연산 세 가지는 다음과 같습니다.

OpenSCAD의 주요 불리언 연산
OpenSCAD 함수 집합 연산 설명
union() 합집합 모든 도형을 하나로 합쳐서 하나의 덩어리로 만듭니다. (A 또는 B)
difference() 차집합 첫 번째 도형에서, 그 뒤에 오는 모든 도형들을 빼내어 조각합니다. (A 이면서 B는 아님)
intersection() 교집합 모든 도형들이 공통으로 겹치는 부분만 남깁니다. (A 이면서 B)

이처럼 정육면체, 구, 원기둥 같은 단순한 기본 도형들을 불리언 연산을 이용해 조합하고, 깎아내고, 겹쳐가며 복잡한 형태를 만들어나가는 모델링 방식을 CSG (Constructive Solid Geometry), 우리말로는 '구성적 입체 기하학' 이라고 합니다.

OpenSCAD는 바로 이 CSG 방식의 가장 대표적인 모델링 도구입니다. 이 세 가지 불리언 연산만 잘 이해하고 활용하신다면, 여러분이 상상하는 거의 모든 형태를 코드로 구현해낼 수 있을 겁니다.

번호 제목 날짜 조회 수
» OpenSCAD#9. 시각장애인도 3D 디자인을 - 모서리가 둥근 큐브 만들기 new 2026.03.31 8
35 OpenSCAD#8. 시각장애인도 3D 디자인을 - scale, 빵 만들기 2026.03.27 19
34 OpenSCAD#7. 시각장애인도 3D 디자인을 - 곡면의 이해 - 품질과 성능 2026.03.26 25
33 OpenSCAD#6. 시각장애인도 3D 디자인을 - 맥미니에 구멍 뚫기 2026.03.24 34
32 OpenSCAD#5. 시각장애인도 3D 디자인을 - 맥미니(Mac mini) 만들기 2026.03.23 55
31 OpenSCAD#4. 시각장애인도 3D 디자인을 - 미키마우스 머리 만들기 2026.03.20 59
30 [수정] OpenSCAD#3. 시각장애인도 3D 디자인을 - 공간의 이해 - 좌표, 단위, 회전 2026.03.19 74
29 OpenSCAD#2. 시각장애인도 3D 디자인을 - 설치와 실행 2026.03.18 77
28 OpenSCAD#1. 시각장애인도 3D 디자인을 - 소개편 2026.03.17 67
27 센스리더 어센드 멀티라인 점자 출력 기능 2026.02.20 175
26 센스리더 가상커서 해제시 포커스 정보에 관하여 2026.02.09 225
25 센스리더 즐겨찾기 도구의 A.I. 프롬프트 사용 안내 2026.02.03 204
24 센스리더 도구에 대한 간략한 소개 2026.01.27 292
23 alt="" 접근성을 더욱 위배할 수 있다. 2025.05.14 810
22 시각장애 개발자와 함께하는 아이디어 마이닝 #9. 마치며 2024.11.22 1008
21 시각장애 개발자와 함께하는 아이디어 마이닝 #8. 자바스크립트 2024.11.21 853
20 시각장애 개발자와 함께하는 아이디어 마이닝 #7. 스크립트 예시, CMD 2024.11.20 775
19 시각장애 개발자와 함께하는 아이디어 마이닝 #6. 스크립트 언어 2024.11.19 819
18 시각장애 개발자와 함께하는 아이디어 마이닝 #5. HTML 2024.11.18 798
17 시각장애 개발자와 함께하는 아이디어 마이닝 #4. 의사 코드 2024.11.14 692