1P by neo 2달전 | favorite | 댓글과 토론

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도 많은 개발자와 사용자의 참여를 통해 더욱 발전할 수 있을 것임.