# 브라우저용 로컬 우선 CAD 프로그램 CADmium

> Clean Markdown view of GeekNews topic #14933. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=14933](https://news.hada.io/topic?id=14933)
- GeekNews Markdown: [https://news.hada.io/topic/14933.md](https://news.hada.io/topic/14933.md)
- Type: GN+
- Author: [neo](https://news.hada.io/@neo)
- Published: 2024-05-22T09:46:52+09:00
- Updated: 2024-05-22T09:46:52+09:00
- Original source: [mattferraro.dev](https://mattferraro.dev/posts/cadmium)
- Points: 1
- Comments: 0

## Topic Body

### 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`

#### 결론

여기서 언급한 아이디어 중 어떤 것이 성공할지, 어떤 것이 실패할지 모르지만, 이 공간 어딘가에 소규모 팀이 제조 산업에 큰 영향을 미칠 수 있는 기회가 있음.

필요한 도움:
1. Rust 프로그래밍 (일반적인 개선)
2. 계산 기하학 (Truck 패치)
3. Three.js 도움 (새 카메라 컨트롤러, 더 나은 조명, 후처리)
4. 보조금 기회 또는 부유한 후원자 찾기

지금은 다루지 않지만 나중에 다시 방문하고 싶은 것들:
1. 벤처 캐피탈
2. 툴패스 생성 (CAM)
3. 유한 요소 분석 (FEA)

이 아이디어가 흥미롭다면, CADmium 디스코드 서버에 가입하여 대화해 주세요!

### GN⁺의 의견

1. **Rust의 장점**: Rust는 메모리 안전성과 병렬화 용이성 덕분에 오픈소스 프로젝트에 매우 적합함. 이는 CADmium의 안정성과 성능을 높이는 데 큰 도움이 될 것임.
2. **웹어셈블리의 활용**: 웹어셈블리를 사용하여 브라우저에서 직접 CAD 작업을 수행할 수 있는 것은 매우 혁신적임. 이는 인터넷 연결이 불안정한 환경에서도 작업을 계속할 수 있게 함.
3. **파일 형식의 단순화**: JSON을 사용한 파일 형식은 이해하기 쉽고, 텍스트 편집기에서 직접 수정할 수 있어 매우 유용함. 이는 협업과 버전 관리를 용이하게 함.
4. **기능 히스토리의 중요성**: 기능 히스토리를 통해 무제한 되돌리기/다시 실행 기능을 제공하는 것은 사용자 경험을 크게 향상시킬 수 있음. 이는 설계 과정에서의 실수를 쉽게 수정할 수 있게 함.
5. **오픈소스 커뮤니티의 힘**: 오픈소스 프로젝트는 커뮤니티의 참여와 기여를 통해 빠르게 발전할 수 있음. CADmium도 많은 개발자와 사용자의 참여를 통해 더욱 발전할 수 있을 것임.

## Comments



_No public comments on this page._
