GN⁺: 브라우저용 로컬 우선 CAD 프로그램 CADmium
(mattferraro.dev)CADmium: 브라우저에서 작동하는 로컬 우선 CAD 프로그램
2024년 5월 21일
우리는 새로운 오픈소스 CAD 프로그램을 개발 중임. 상당히 진척되었지만, 여러분의 도움이 필요함. 이 프로젝트에 참여하고 싶다면, Discord에 가입해 주세요!
무엇이 필요한가?
3D 파라메트릭 CAD 프로그램을 만들기 위해 필요한 것들:
- 2D 제약 해결기
- B-rep 커널
- 히스토리 트래커
- 3D 사용자 인터페이스
- 파일 형식
각 항목에 대해 이야기해 보겠음!
2D 제약 해결기
2D 제약 해결기는 선이 평행하거나 수직으로 유지되도록 하거나, 두 원이 동일한 반지름을 가지도록 하는 등의 역할을 함.
- 일반적인 접근 방식은 모든 미지수를 큰 벡터
x
로 결합하고, 모든 제약 조건을 선형 방정식으로 표현하여 큰 행렬 방정식Mx = b
로 조립하는 것임. - 이론적으로는
M
을 역행렬로 만들면 끝남.x = M^-1 b
- 실제로는 많은 최적화가 필요함. 하지만 이 접근 방식에는 단점이 있음.
-
M
이 정방행렬일 때만 역행렬을 만들 수 있음. - 제약 조건이 너무 많으면
M
이 너무 커져서 접근 방식이 실패함. - 제약 조건이 너무 적으면 가정 삽입으로 해결할 수 있지만, 이는 모델러의 기대와 일치하지 않을 수 있음.
- 많은 미지수가 있을 때 이 행렬 방정식을 푸는 것은 매우 느려짐.
-
대안 접근 방식:
- 문제를 2D 물리 시뮬레이터로 공식화:
- 각 점은 질량
m
과 속도v
를 가짐. - 각 제약 조건은 연결된 점에 힘
F
를 가하는 스프링임. - 마찰력은 속도에 비례함.
- 시뮬레이션을 작은
dt
로 앞으로 진행시켜 수렴할 때까지 반복함.
- 각 점은 질량
- 이 접근 방식은 작은 변화를 많이 만들어 스프링의 잠재 에너지를 0으로 만듦.
- 각 시간 단계에서 런타임은 스프링 수와 미지수 수에 비례하여 선형임.
- 이 접근 방식은 병렬화에 적합하여 실제로 매우 빠를 수 있음.
- 과제 제약 문제는 과제 제약에 대해 불평하지 않음: 일관된 시스템은 정상적으로 해결되고, 일관되지 않은 시스템에서는 스프링이 타협함.
- 과소 제약 문제는 무한대로 날아가지 않음, 가장 가까운 유효한 구성으로 찾음.
- 이 접근 방식은 불평등 제약 조건을 지원할 수 있음.
B-rep 커널
기계 CAD에서는 사용자가 부품의 가장자리와 면과 직접 상호작용해야 함.
- 모든 파라메트릭 CAD 프로그램은 부품의 경계를 데이터 구조로 직접 나타냄.
- 큐브는 6개의 면, 각 면은 4개의 가장자리, 각 가장자리는 2개의 점으로 구성된 솔리드로 표현됨. 이 접근 방식을 경계 표현(B-rep)이라고 함.
- 곡면의 경우, 스플라인의 일반화인 NURBS 표면을 사용하여 자유 형상에 대한 예술적 제어와 원뿔 곡선을 정확하게 표현할 수 있음.
- 이러한 방식으로 형상을 표현하는 것은 어렵고, 합집합, 교차, 차집합과 같은 불린 연산을 구현하려고 하면 더욱 어려워짐.
- 이러한 데이터를 처리하고 불린 연산을 수행하는 라이브러리를 B-rep 커널이라고 하며, 만들기 매우 어려움.
현재의 CAD 시장:
- 주요 CAD 회사들은 각자 자신만의 B-rep 커널을 작성했으며, 수십 년이 걸림.
- 가장 중요한 B-rep 커널은 Parasolid로, 많은 산업 제품을 지원함.
- 오픈소스 CAD 시장에서는 OpenCascade가 유일한 인기 있는 B-rep 커널임.
새로운 오픈소스 B-rep 커널:
- Truck이라는 새로운 오픈소스 B-rep 커널이 개발 중임.
- Rust로 작성되어 있으며, 이는 메모리 안전성 보장, 병렬화 용이성, 웹어셈블리 컴파일 지원 등의 장점이 있음.
- Truck은 작고 가벼우며, .step 파일 읽기/쓰기, 표면 삼각화, NURBS 지원, 솔리드의 교차/합집합/차집합 연산을 지원함.
히스토리 트래커
파라메트릭 CAD 프로그램은 설계의 기능 히스토리를 저장함.
- 스케치, 돌출, 회전 등의 작업을 통해 부품을 완성함.
- "파라메트릭"이란 이전 단계로 되돌아가 변경한 후 기능을 재생하여 약간 다른 부품을 얻을 수 있음을 의미함.
- 변수 주입을 통해 모델을 매개변수화할 수 있음.
파라메트릭 CAD의 취약성을 해결하기 위한 접근 방식:
- 탄력적 모델링 전략(RMS): 부품을 설계하는 규칙 집합.
- 스케치에 기능 히스토리를 추가하는 것: 스케치 기능을 기능 트리에 저장하고 표시하여 RMS 아이디어를 단일 스케치에 적용할 수 있음.
- 모든 사용자 이벤트를 추가 전용 로그에 기록하여 무제한 되돌리기/다시 실행 기능 제공.
3D 사용자 인터페이스
브라우저에서 CAD를 실행하는 아이디어를 좋아함.
- Onshape는 브라우저에서 실행되지만, 실제로는 AWS의 GPU 지원 클라우드 인스턴스에서 실행됨.
- CADmium은 웹어셈블리로 컴파일된 Truck을 사용하여 브라우저에서 모든 작업을 수행할 수 있음. 로컬 우선 앱임.
기술 스택:
- Three.js: 3D 뷰포트
- Svelte: 상태 관리/반응성
- Threlte: Svelte와 Three.js 간의 다리 역할
- UI와 B-rep 커널 간의 메시지 전달
- Electron: 로컬 실행
- 기타 표준 기술: Typescript, TailwindCSS, Vite 등
파일 형식
CADmium은 모든 것을 JSON으로 사용함.
- 작업 로그는 JSON 라인으로 구성됨.
- 설계한 부품을 더 간단한 교환 형식으로 내보내기 지원.
- 예:
{ "steps": [ { "type": "sketch", "id": "Sketch-01", "data": { ... } }, { "type": "extrude", "id": "Extrude-01", "data": { "distance": "10mm", "sketch": "Sketch-01", "faces": [0], "type": "new" } } ] }
- CADmium 명령줄 인터페이스(CLI)를 사용하여 .step 또는 .stl로 변환 가능:
$ CADmium export my_part.cadmium --format stl
결론
여기서 언급한 아이디어 중 어떤 것이 성공할지, 어떤 것이 실패할지 모르지만, 이 공간 어딘가에 소규모 팀이 제조 산업에 큰 영향을 미칠 수 있는 기회가 있음.
필요한 도움:
- Rust 프로그래밍 (일반적인 개선)
- 계산 기하학 (Truck 패치)
- Three.js 도움 (새 카메라 컨트롤러, 더 나은 조명, 후처리)
- 보조금 기회 또는 부유한 후원자 찾기
지금은 다루지 않지만 나중에 다시 방문하고 싶은 것들:
- 벤처 캐피탈
- 툴패스 생성 (CAM)
- 유한 요소 분석 (FEA)
이 아이디어가 흥미롭다면, CADmium 디스코드 서버에 가입하여 대화해 주세요!
GN⁺의 의견
- Rust의 장점: Rust는 메모리 안전성과 병렬화 용이성 덕분에 오픈소스 프로젝트에 매우 적합함. 이는 CADmium의 안정성과 성능을 높이는 데 큰 도움이 될 것임.
- 웹어셈블리의 활용: 웹어셈블리를 사용하여 브라우저에서 직접 CAD 작업을 수행할 수 있는 것은 매우 혁신적임. 이는 인터넷 연결이 불안정한 환경에서도 작업을 계속할 수 있게 함.
- 파일 형식의 단순화: JSON을 사용한 파일 형식은 이해하기 쉽고, 텍스트 편집기에서 직접 수정할 수 있어 매우 유용함. 이는 협업과 버전 관리를 용이하게 함.
- 기능 히스토리의 중요성: 기능 히스토리를 통해 무제한 되돌리기/다시 실행 기능을 제공하는 것은 사용자 경험을 크게 향상시킬 수 있음. 이는 설계 과정에서의 실수를 쉽게 수정할 수 있게 함.
- 오픈소스 커뮤니티의 힘: 오픈소스 프로젝트는 커뮤니티의 참여와 기여를 통해 빠르게 발전할 수 있음. CADmium도 많은 개발자와 사용자의 참여를 통해 더욱 발전할 수 있을 것임.