메뉴 건너뛰기

A11Y

'사과 회사'의 맥미니(Mac mini) 본체 3D 모델링하기

이번 시간에는 우리가 손으로 만져본 경험이 있을 법한, '사과 회사'의 맥미니(Mac mini) 본체를 3D 모델로 함께 만들어 보겠습니다.

맥미니의 형태 관찰하기

맥미니 본체를 손으로 만져보면, 가로와 세로가 약 20cm 정도로 비슷한 정사각형 모양입니다. 하지만 모서리는 날카롭지 않고 부드럽게 둥글려져 있죠. 높이는 약 4cm 정도로 낮고 넓적한 형태를 하고 있습니다. 그리고 본체를 뒤집어 바닥을 만져보면, 안정적으로 놓일 수 있도록 중앙에 넓고 둥근 받침대 공간이 살짝 파여있는 것을 느낄 수 있습니다.

이번 시간에는 바로 이 모서리가 둥근 본체와 바닥의 원형으로 파인 부분을 만들어 보겠습니다.

모델링을 위한 오늘의 도구 세 가지

모델링을 시작하기 전에, 오늘 사용할 세 가지 중요한 명령어를 먼저 알아보겠습니다. 이 명령어들을 우리의 조각칼이나 연장이라고 생각해 보세요.

1. cylinder() (원기둥 만들기)

cylinder(r=반지름, h=높이); 형식으로 사용합니다.

마치 통조림 캔이나 기둥처럼, 지정한 반지름과 높이를 가진 원기둥을 만들어주는 명령어입니다. 우리는 이 원기둥을 맥미니의 둥근 모서리를 만드는 데 사용할 겁니다.

2. hull() (감싸서 합치기)

hull() { ... } 형식으로 사용하며, 중괄호 {} 안에 있는 모든 물체를 하나의 덩어리로 감싸주는 역할을 합니다.

예를 들어, 공간에 네 개의 기둥을 세운 뒤 hull() 명령어로 감싸면, 마치 네 개의 기둥 바깥으로 신축성 좋은 천을 팽팽하게 당겨 씌운 것처럼, 모서리가 둥근 사각 기둥 모양이 만들어집니다.

3. difference() (깎아내기)

difference() { ... } 형식으로 사용합니다. 중괄호 {} 안에 있는 첫 번째 물체를 기준으로, 그 뒤에 오는 나머지 물체들의 모양대로 파내는 명령어입니다.

지난 시간에 배운 union()이 여러 물체를 풀로 붙여 하나로 '더하기'하는 개념이었다면, difference()는 첫 번째 물체에서 나머지 물체들을 '빼기'하여 모양을 다듬는 조각칼 같은 역할을 합니다.

OpenSCAD 모델링 코드

자, 그럼 이 세 가지 도구를 가지고 맥미니 본체 모델링을 시작하겠습니다.

Mac mini 본체 모델링 OpenSCAD 코드

코드의 시작 <<<


// 1. 설계도를 위한 기본 치수 설정 (단위: mm)

// 맥미니의 전체 가로/세로 크기
mac_mini_size = 197;

// 맥미니의 높이
mac_mini_height = 36;

// 모서리의 둥근 정도 (원의 반지름으로 표현)
corner_radius = 20;

// 바닥에 파낼 원형 받침대의 반지름
bottom_foot_radius = 70;

// 바닥 원형 받침대의 파이는 깊이
bottom_foot_depth = 1.5;

// 렌더링 품질 (값이 높을수록 표면이 부드러워집니다)
$fn = 100;


// ======================================================
// 2. 실제 맥미니 본체 만들기
// ======================================================

// 'difference()' 명령으로 '깎아내기' 작업을 시작합니다.
difference() {
    
    // 첫 번째 물체: 깎아낼 대상이 되는 기본 몸체
    // 'hull()' 명령으로 네 개의 기둥을 감싸 모서리가 둥근 몸체를 만듭니다.
    hull() {
        // 네 개의 원기둥(기둥)을 각 모서리에 배치합니다.
        // 먼저, 중심에서 각 기둥까지의 거리를 계산합니다.
        offset = mac_mini_size / 2 - corner_radius;
        // offset의 값은 197 / 2 - 20 = 78.5 입니다.

        // 오른쪽 위 모서리에 기둥 배치
        translate([offset, offset, 0])
            cylinder(h = mac_mini_height, r = corner_radius);
            
        // 왼쪽 위 모서리에 기둥 배치
        translate([-offset, offset, 0])
            cylinder(h = mac_mini_height, r = corner_radius);
            
        // 오른쪽 아래 모서리에 기둥 배치
        translate([offset, -offset, 0])
            cylinder(h = mac_mini_height, r = corner_radius);
            
        // 왼쪽 아래 모서리에 기둥 배치
        translate([-offset, -offset, 0])
            cylinder(h = mac_mini_height, r = corner_radius);
    }
    
    // 두 번째 물체: 깎아내는 도구 역할
    // 바닥의 원형 받침대 부분을 파낼 원기둥을 만듭니다.
    translate([0, 0, -1]) // 확실하게 잘라내기 위해 살짝 아래에서 시작
        cylinder(h = bottom_foot_depth + 2, r = bottom_foot_radius);

}
        

>>> 코드의 끝

코드 설명: 한 단계씩 이해하기

이 코드가 어떻게 맥미니 모양을 만들어내는지 차근차근 살펴보겠습니다.

  1. 기본 치수 설정 (변수)

    코드의 가장 윗부분에서는 맥미니의 크기, 높이, 모서리의 둥근 정도 등을 숫자로 정해두었습니다. 이렇게 이름을 붙여두면 나중에 크기를 바꾸고 싶을 때 이 숫자들만 수정하면 되므로 매우 편리합니다. 마치 요리 레시피의 재료 목록과 같습니다.

  2. difference()로 조각 시작하기

    전체 코드는 difference()로 시작합니다. 이는 "이제부터 깎아내는 작업을 할 거야. 첫 번째 나오는 물체가 재료이고, 두 번째부터는 깎아낼 조각칼이야."라고 선언하는 것과 같습니다.

  3. hull()로 몸체 만들기 (재료 준비)

    difference() 안의 첫 번째 작업은 hull()을 이용해 맥미니의 기본 몸체를 만드는 것입니다. hull() 안을 보면 네 개의 cylinder가 있습니다. 이것이 바로 우리가 세울 네 개의 기둥입니다.

    offset이라는 계산은 이 네 기둥을 정확한 모서리 위치에 세우기 위한 좌표 계산입니다. translate 명령어를 사용해 네 개의 원기둥을 각각 오른쪽 위, 왼쪽 위, 오른쪽 아래, 왼쪽 아래, 이렇게 네 꼭짓점 위치로 옮겨줍니다. hull()은 이렇게 배치된 네 개의 기둥을 부드럽게 감싸서, 우리가 상상했던 모서리가 둥근 사각 기둥 형태의 몸체를 완성합니다.

  4. cylinder로 바닥 파내기 (조각칼 사용)

    difference() 안의 두 번째 물체는 바닥을 파내는 역할을 합니다. translate([0, 0, -1])은 바닥을 확실히 파내기 위해, 파내는 도구 역할을 할 원기둥을 아주 살짝 아래쪽에서 시작하도록 위치를 조정하는 것입니다. 그 다음에 나오는 cylinder는 넓고 얇은 원기둥 모양의 조각칼입니다. 이 조각칼이 hull()로 만든 몸체의 바닥 부분을 깎아내어, 우리가 만져봤던 그 둥글고 오목한 받침대 공간을 만들어냅니다.

직접 만들어보고 응용하기

위 코드를 OpenSCAD 편집기에 붙여넣고 F6 키를 눌러 렌더링을 실행하면, 잠시 후 맥미니의 본체가 3D 모델로 완성됩니다. 변수의 값을 바꿔서 다른 모양으로도 만들 수 있습니다.

  • mac_mini_size를 300으로 바꾸면 '맥 라지(Mac large)'가 탄생합니다.
  • mac_mini_height를 1000으로, bottom_foot_depth를 960 정도로 바꾸면 속이 깊게 파인 형태가 되어, 멋진 우산꽂이나 흰지팡이꽂이로 변신시킬 수도 있답니다.
번호 제목 날짜 조회 수
36 About: MSAA, Microsoft Active Accessibility 2024.09.05 671
35 센스리더에서 지원하는 SSML 2024.09.05 956
34 About: Microsoft Windows IUIAutomation Interface 2024.09.06 658
33 윈도우 접근성 기술: MSAA와 UIAutomation 비교 2024.09.09 671
32 시각장애인 접근성 향상을 위한 응용프로그램 조작 인터페이스 2024.09.11 720
31 접근성 역할에서 "link"와 "button"의 차이 2024.09.24 1120
30 시각장애인을 위한 음성 접근성 정보 제공 방법 2024.09.25 690
29 시각장애인 접근성 음성 정보의 맹점 2024.10.02 713
28 시각장애인을 위한 소리 정보 제공 시 기본 파형 사용 주의사항 2024.10.02 712
27 센스리더의 "기능 검색" 기능에 대하여 2024.10.08 911
26 센스리더의 브라우저 탭키 환경과 가상커서 탭키 환경 2024.10.11 1062
25 시각장애인과의 협업을 위한 특수문자 발음의 이해 2024.10.18 721
24 여러 단계로 이루어진 서비스 제공시 시각장애인 접근성 개선 방안 2024.10.22 734
23 [세미나] 시각장애 개발자와 함께 하는 아이디어 마이닝 #1. 목적 2024.11.11 769
22 시각장애 개발자와 함께하는 아이디어 마이닝 #2. 텍스트와 오디오 2024.11.12 842
21 시각장애 개발자와 함께하는 아이디어 마이닝 #3. 이미지 2024.11.13 712
20 시각장애 개발자와 함께하는 아이디어 마이닝 #4. 의사 코드 2024.11.14 694
19 시각장애 개발자와 함께하는 아이디어 마이닝 #5. HTML 2024.11.18 798
18 시각장애 개발자와 함께하는 아이디어 마이닝 #6. 스크립트 언어 2024.11.19 819
17 시각장애 개발자와 함께하는 아이디어 마이닝 #7. 스크립트 예시, CMD 2024.11.20 775