Lua를 이용한 스크립터블(Scriptable) CAD입니다.
Lua로 파라메트릭 2D 및 3D 모델을 작성하고, 이를 3MF, STL, OBJ, PLY, OFF, AMF, 또는 SCAD 형식으로 내보내거나 PNG로 직접 렌더링할 수 있습니다.
기존 OpenSCAD 파일도 열 수 있습니다. LuaCAD는 OpenSCAD 설치 과정 없이 .scad 언어 자체를 평가합니다.
플레이그라운드에서 사용해 보기
— 이 엔진은 WebAssembly로 브라우저에서 실행되므로, 설치할 것이 없고 업로드할 것도 없습니다.
LuaCAD는 Lua 5.4를 Rust 엔진에 임베딩하여 CSG 연산(Manifold를 통해)을 직접 평가하거나 외부 렌더링을 위해 OpenSCAD 코드를 생성합니다.
왜 Lua인가?
-
OpenSCAD 언어와 유사한 구문이지만 더 좋습니다:
-
더 강력하고
-
더 일관적이며
-
더 빠릅니다.
-
쉽게 임베딩할 수 있습니다.
-
자연스러운 CSG 구문을 위한 연산자 오버로딩(
a + b,
a - b,
a * b)
— LibreCAD 및 Autodesk Netfabb와 같은 다른 CAD 소프트웨어에서도 이미 사용되었습니다.
예시
LuaCAD:
my_cube = cube { size = { 1, 2, 3 } }
function my_sphere(radius)
return sphere({ r = radius }):translate(5, 0, 0)
...
동등한 OpenSCAD:
module my_cube() {
cube(size=[1,2,3]);
}
...
시작하기
Homebrew는 미리 빌드된 luacad와 luacad-studio 바이너리를 설치하므로 컴파일할 필요가 없습니다:
brew install ad-si/tap/luacad
또는 crates.io에서:
cargo install luacad # LuaCAD 스크립트 실행 및 변환 CLI
cargo install luacad-studio # 실시간 3D 미리보기가 가능한 GUI 데스크톱 앱
또는 소스에서, Rust가 필요합니다:
git clone https://github.com/ad-si/LuaCAD.git
cd LuaCAD
make install
두 크레이트 모두 C/C++ 종속성을 자체적으로 포함하므로 시스템 라이브러리를 설치할 필요는 없지만, Manifold와 Clipper2를 빌드하려면 C++ 컴파일러와 CMake가 사용 가능해야 합니다. Linux의 경우, luacad-studio에는 추가로 윈도우 헤더 파일(Debian/Ubuntu 기준: libx11-dev, libxcb1-dev, libxkbcommon-dev, libxrandr-dev, libwayland-dev)가 필요합니다.
CLI 사용법
luacad convert model.lua output.3mf # 3MF로 변환
luacad convert model.lua output.stl # STL로 변환
luacad convert model.lua output.scad # OpenSCAD로 내보내기
...
convert와 watch는 출력 확장자에서 형식을 추론하며, --format <fmt>가 이를 덮어씁니다. 또한, luacad --via-openscad를 사용하면 Manifold로 메시를 생성하는 대신 설치된 OpenSCAD 바이너리에 내보내기를 맡깁니다.
모든 하위 명령어는 .lua 파일을 받는 곳에서 .scad 파일을 받습니다. 자세한 내용은 아래 'OpenSCAD 파일 열기' 섹션을 참조하세요.
Studio
luacad-studio는 코드 에디터와 3D 뷰포트를 갖춘 데스크톱 앱입니다. 오른쪽에서 스크립트를 편집하고, 왼쪽에서 모델이 업데이트되는 것을 지켜볼 수 있습니다. 이 뷰포트는 WebCSG를 사용하여 wgpu로 CSG 트리를 직접 그리기 때문에, 메시가 생성될 때까지 기다릴 필요 없이 부울 연산(boolean)을 실행 즉시 확인할 수 있습니다. 다른 프로그램에 의해 파일이 변경되면 자동으로 가져와지며, Raytrace 버튼은 현재 뷰포트가 보여주는 내용을 경로 추적(path-traces)합니다.
LuaCAD Studio previewing the MuSHR racecar model, a 43-part assembly
of 490,802 triangles, beside the Lua script that builds it
렌더링 (Rendering)
luacad render는 모델을 PNG로 래스터화하며, 평면 음영 처리를 하여 테셀레이션이 보이도록 유지합니다(--smooth를 사용하면 이 기능이 꺼집니다). --raytrace는 동일한 장면을 경로 추적기(path tracer)에 맡겨 부드러운 그림자와 주변 폐색(ambient occlusion) 효과를 몇 초당 이미지 단위로 제공합니다:
luacad render --raytrace model.lua model.png
luacad render --raytrace --samples 512 model.lua # 노이즈 감소, 렌더 시간 증가
luacad render --camera 45,20 model.lua # 방위각(azimuth), 고도(elevation)를 도 단위로 지정
표면은 material()에 반응하며, 경로 추적기는 이를 반사, 굴절 및 빛 방출에 사용합니다:
sphere({ r = 10 }):material(
one does,
on the command line and in Studio. LuaCAD는 OpenSCAD 언어 자체를 구문 분석하고 평가하므로 별도의 설치가 필요하지 않고 `--via-openscad`
이 관여하지 않습니다:
luacad convert bracket.scad bracket.3mf
luacad render bracket.scad bracket.png
luacad-studio bracket.scad
두 언어 모두 동일한 내부 트리를 생성하므로, 열린 `.scad` 파일은 모든 내보내기 형식, 렌더러, 패스 트레이서 및 Studio의 라이브 미리보기에서 변경되지 않고 도달하며,
`luacad convert model.scad out.scad`
을 통해 모듈이 인라인 처리되고 `$fn` /`$fa` /`$fs`가 면(facet) 개수로 해결되는 라운드 트립을 수행합니다. 체스 예제는 이런 방식으로 작성되었습니다.
## BOSL2
LuaCAD는 Belfry OpenSCAD Library v2에 대한 전체 지원 기능을 갖추고 있으며, 이는 LuaCAD 자체에 재구현되었기 때문에 OpenSCAD나 BOSL2가 설치되어 있지 않아도 메시로 렌더링하고 미리보기 및 내보내기가 가능합니다:
bosl.cuboid { {40, 40, 40}, rounding = 2 }
bosl.regular_prism { 5, r = 10, h = 25 }
bosl.spur_gear { circ_pitch = 5, teeth = 20, thickness = 5 }
`.scad`로 내보낼 때도 BOSL2 호출 자체를 작성하여, 내보낸 파일이 생성한 스크립트만큼 짧게 유지됩니다.
## 텍스트 및 임포트
`text()`는 시스템 글꼴을 스케치로 윤곽화하고,
`text3d()`는 이를 한 단계에서 돌출시켜 텍스트가 SCAD 출력물 대신 실제 기하학적 형태로 변환됩니다:
`render(text("LuaCAD", { size = 12, halign = "center" }):linear_extrude(2))`
`import()`는 LuaCAD가 작성하는 모든 메시 형식을 읽어 어떤 프리미티브와 마찬가지로 변형하고 결합할 수 있는 솔리드를 반환합니다. SVG와 DXF는 대신 돌출 준비가 된 2D 스케치를 반환합니다.
## 지원되는 내보내기 형식
**SCAD** - OpenSCAD 형식
**3MF** - 3D 제조 형식
**STL** - 3D 프린팅용 표준 삼각형 언어
**OBJ** - Wavefront 3D 객체 형식
**PLY** - 폴리곤 파일 형식
**OFF** - 객체 파일 형식
**AMF** - 적층 제조 파일 형식
스크립트가 반환하는 모든 값은 자체 3MF 객체가 되므로, 슬라이서에서 개별적으로 이동 가능한 부품으로 로드됩니다. `:name(…)`로 레이블을 지정하세요.
객체 목록에 어떻게 나타날지 제어합니다.
다른 형식들은 개별 객체를 표현할 수 없기 때문에 모든 것을 단일 메시로 평탄화(flatten)합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27