지난 강좌들에서 잠시 언급했던 $fn = 100; 코드를 기억하시나요? 렌더링 품질을 높여주는 이 특별 변수들에 대해 깊이 있게 알아보겠습니다. 바로 $fn, $fs, $fa 입니다.
완벽한 곡면은 없다: 조각(Fragment)의 개념
우리가 3D 모델링에서 sphere(구)나 cylinder(원기둥)처럼 둥근 모양을 만들 때, 그 결과물은 완전한 곡면이 아닙니다. 컴퓨터는 완벽한 곡면 대신, 아주 잘게 쪼갠 직선이나 평면을 여러 개 이어 붙여 곡면처럼 '보이게' 만듭니다. 3D 프린터로 출력된 최종 결과물은 바로 이 수많은 작은 평면들의 집합체입니다.
이 작은 조각(fragment)들을 어떻게 제어하느냐에 따라, 우리 모델의 표면이 거칠게 느껴질 수도, 아주 매끄럽게 느껴질 수도 있습니다. 바로 이 '조각'을 제어하는 도구가 $fn, $fs, $fa 입니다.
1. $fn (Fragment Number): 조각의 '개수'로 품질 결정하기
$fn은 "Fragment Number"의 약자로, 360도 전체 원을 만드는 데 사용할 조각(평면)의 총 개수를 직접 지정하는 변수입니다.
예시 1: $fn=6
cylinder(r=20, h=10, $fn=6);
이 코드는 반지름 20, 높이 10인 기둥을 만들되, 밑면의 원을 정확히 6개의 평면으로 만들라는 의미입니다.
촉감 예측: 3D 프린터로 출력된 결과물은 원기둥이 아니라 육각기둥이 됩니다. 손으로 만져보면 6개의 뚜렷한 모서리와 평평한 면을 느낄 수 있습니다.
예시 2: $fn=100
cylinder(r=20, h=10, $fn=100);
이 코드는 같은 크기의 기둥을 정확히 100개의 평면으로 만들라는 의미입니다.
촉감 예측: 100개의 작은 면들이 모여 만들어졌기 때문에, 각 면 사이의 경계가 거의 느껴지지 않습니다. 손으로 만져보면 아주 부드럽고 매끄러운 원기둥으로 느껴집니다.
언제 사용하나요?
$fn은 너트나 볼트 머리처럼 정확한 각의 개수가 필요할 때 매우 유용합니다. 예를 들어, 육각 너트를 모델링하려면 $fn=6을 사용하면 됩니다.
2. $fs (Fragment Size): 조각의 '크기'로 품질 결정하기
$fs는 "Fragment Size"의 약자로, 원을 구성하는 각 조각의 최대 길이(mm)를 지정합니다. 개수를 직접 정하는 대신, 조각 하나의 크기를 정해주는 방식입니다.
예시 1: $fs=5
cylinder(r=20, h=10, $fs=5);
이 코드는 반지름 20인 원을 만들 때, 사용되는 각 직선 조각의 길이가 최대 5mm를 넘지 않도록 하라는 의미입니다. OpenSCAD는 이 조건에 맞춰 필요한 조각의 개수(약 25~26개)를 자동으로 계산합니다.
촉감 예측: 약간의 각을 느낄 수 있는, 부드러움이 부족한 기둥이 됩니다.
예시 2: $fs=0.5
cylinder(r=20, h=10, $fs=0.5);
이번에는 각 조각의 최대 길이를 0.5mm로 매우 작게 설정했습니다. OpenSCAD는 이 조건을 맞추기 위해 약 251개의 조각을 사용하게 됩니다.
촉감 예측: $fn=100보다도 훨씬 많은 조각을 사용하므로, 손끝으로는 구별할 수 없는 매우 매끄러운 원기둥이 만들어집니다.
언제 사용하나요?
$fs는 모델의 크기와 상관없이 일정한 수준의 부드러움을 유지하고 싶을 때 유용합니다. 큰 원이든 작은 원이든 조각의 크기를 기준으로 품질이 결정되므로 일관된 결과물을 얻을 수 있습니다.
3. $fa (Fragment Angle): 조각의 '각도'로 품질 결정하기
$fa는 "Fragment Angle"의 약자로, 각 조각들이 이루는 모서리의 최대 각도를 지정합니다.
예시 1: $fa=30
cylinder(r=20, h=10, $fa=30);
이 코드는 조각과 조각이 만나는 모서리의 각도가 최대 30도를 넘지 않도록 하라는 의미입니다. 전체 360도를 30도로 나누면 12가 나오므로, 12각형 기둥이 만들어집니다.
촉감 예측: 12개의 각이 만져지는, 다소 각진 기둥이 됩니다.
예시 2: $fa=5
cylinder(r=20, h=10, $fa=5);
이번에는 모서리 각도를 최대 5도로 매우 작게 설정했습니다. 360도를 5도로 나누면 72가 나오므로, 72개의 면을 가진 기둥이 만들어집니다.
촉감 예측: 72개의 면으로 이루어져 있으므로, 매우 부드러운 원기둥으로 느껴집니다.
언제 사용하나요?
$fa는 $fs와 마찬가지로 모델의 크기에 크게 구애받지 않고 전반적인 부드러움을 설정하고 싶을 때 사용합니다.
세 변수의 우선순위와 사용법 정리
세 변수를 동시에 사용하면 어떻게 될까요? OpenSCAD에는 명확한 우선순위 규칙이 있습니다.
$fn이 최우선:$fn값이 0이 아닌 값으로 설정되어 있다면, OpenSCAD는$fs와$fa값을 완전히 무시하고$fn에 지정된 개수만큼 조각을 만듭니다.$fn이 없을 경우:$fn이 설정되지 않았다면, OpenSCAD는$fs와$fa값을 모두 고려하여, 두 조건 중 더 높은 품질(더 많은 조각)을 만드는 쪽을 선택합니다.
최종 요약: 언제 무엇을 쓸까요?
- 정확한 다각형이 필요할 때 (예: 육각 너트, 삼각형 기둥):
망설임 없이$fn을 사용하세요. (예:... $fn=6;) - 그냥 부드러운 곡면을 원할 때:
코드 맨 위에$fs=0.5;와$fa=5;처럼 기본값을 작게 설정해두면 모든 곡면이 알아서 부드럽게 만들어집니다.
품질과 성능, 그 사이의 줄다리기: 렌더링 성능에 대한 이해
$fn, $fs, $fa 값을 조절하여 모델의 부드러움을 제어하는 법을 배웠습니다. 하지만 여기에는 중요한 대가, 바로 컴퓨터의 계산 시간과 성능이 따릅니다. 조각의 수가 많아질수록 계산량은 기하급수적으로 늘어납니다.
고품질 설정이 성능에 미치는 영향
- 미리보기(F5) 속도 저하:
$fn값을 매우 높게 설정하면, 미리보기 화면 업데이트가 느려지고 마우스 조작 시 버벅거릴 수 있습니다. - 렌더링(F6) 시간 급증: 최종 렌더링 시, 낮은 품질에서 몇 초면 끝날 작업이 높은 품질에서는 수 분 이상 걸릴 수 있습니다.
- 파일 크기 증가: 조각의 수가 많아지면 최종 STL 파일의 크기가 커지고, 슬라이서 프로그램에서 처리하는 시간 또한 길어집니다.
현명한 작업 흐름: 품질과 속도 모두 잡기
효율적인 작업 전략의 핵심은 "모델링은 빠르게, 출력은 고품질로" 입니다. 작업 단계에 따라 품질 설정을 다르게 가져가는 것입니다.
1단계: 설계 및 모델링 (빠른 미리보기)
모델의 형태를 잡고 수정하는 단계에서는 속도가 중요합니다. 이때는 일부러 낮은 품질 설정을 사용합니다.
// --- 모델링 중: 빠른 미리보기를 위해 낮은 값 사용 ---
$fn = 24;
// 여기에 여러분의 모델링 코드를 작성합니다.
cylinder(r=20, h=10);
// ... 기타 복잡한 코드들
$fn=24 정도로 설정하면 미리보기는 거의 즉각적으로 반응하며, 형태를 파악하는 데 아무런 문제가 없습니다.
2단계: 최종 렌더링 및 내보내기 (고품질)
모델 디자인이 모두 완성되었을 때, 딱 한 번만 품질 설정을 높여줍니다.
// --- 최종 렌더링 시: 아래 주석을 풀고 위 라인을 주석 처리 ---
// $fn = 24;
$fn = 120;
// 또는 더 부드럽게
// $fs = 0.4;
// $fa = 3;
// 여기에 여러분의 모델링 코드를 작성합니다.
cylinder(r=20, h=10);
// ... 기타 복잡한 코드들
이제 F6 키를 눌러 렌더링을 시작합니다. 시간은 좀 걸리겠지만, 이미 디자인을 완성했으므로 차분히 기다리기만 하면 매끄러운 고품질 모델을 얻을 수 있습니다.