# [ADR-0001] 제품 비전: 기계설비 경량 디지털 트윈 시뮬레이터

작성: 2026-05-06
상태: ✅ 확정 (사용자 결정 — GPT 기획안 기반)

## 결정

factory00은 **풀스펙 CAD 도구가 아니라**, 외부에서 제작된 3D 모델을 들여와 속성과 구속을 부여해 동작을 검증하는 **기계설비 경량 디지털 트윈 시뮬레이터**다.

비유: SimCity의 디지털 트윈 버전 — 비코딩 사용자가 설비를 배치·연결·재생.

## 4대 정체성 원칙 (변경 불가)

| # | 원칙 | 의미 |
|---|---|---|
| 1 | 임포트 전용 | CAD 모델링 기능 없음. STEP/glTF/FBX/Blend 외부 파일을 들여올 뿐. |
| 2 | 물리엔진 최소 | 시뮬 동작은 수학 transform으로만 처리. **충돌 감지에만** Unity Physics 사용. 토크·부하 계산은 **시뮬 종료 후 후처리** 또는 **정적 계산기**로 제공 (시뮬 안정성과 분리, 사양 산정 가이드로 명시). 상세: ADR-0002 |
| 3 | 비코딩 UX | 속성 패널 + 드래그앤드롭 + 구속 시각화로 모든 조작. 스크립팅 노출 금지. |
| 4 | 이벤트 기반 확장 | PLC/IO 연동을 day-1부터 대비. 모터→구속 그래프 전파는 메서드 직호출 금지, 이벤트 버스. |

### "커스텀 가능"의 정의 (2026-05-07 사용자 확정)

= **임포트 후 시뮬레이터 내부에서 메시 단위 조작**.

- 부품 단위 메시 교체·재배치·삭제 가능
- 임포트 파라미터 노출은 최소 (사용자는 Blender·CAD 도구 모름 가정)
- 변환 워크플로우는 자동, 결과 메시를 Unity 안에서 손볼 수 있어야 함

### STEP 임포트 전략 (R1·R2 해결)

직접 임포트 ❌ → **factory00-converter가 Blender headless로 자동 변환**.
사용자에겐 Blender 보이지 않음. STEP 파일 드래그 → glTF 자동 생성 → 메인 앱 임포트.
상세: `wiki/topics/cad-pipeline/0001-step-import-strategy.md`

## 시스템 구성 (GPT 스펙 정리본)

### Object 모델

각 Part는: 고유 ID + 이름 + 계층(parent-child) + 속성 + 구속

```
Part {
  id, name, parent
  type: motor | conveyor | sensor | structure | ...
  movable: bool
  transform: { position, rotation }
  movement: { type: none|linear|rotation, axis: x|y|z, speed }
}
```

### Constraint 종류

| 종류 | 동작 |
|---|---|
| Fixed | 완전 고정 — 부모와 함께 이동 |
| Parent-Child | 부모 transform을 자식이 따라감 |
| Hinge | 특정 축 기준 회전 (자유도 1) |
| Slider | 특정 축 기준 직선 이동 (자유도 1) |

### 구동 그래프

Motor → Shaft → Roller → Conveyor 식의 그래프. 모터 이벤트 발생 시 연결된 노드로 transform 전파.

### 충돌

- 1차: AABB/OBB
- 옵션: MeshCollider (성능 비용 높음 — 어셈블리 단위 토글)
- 충돌 시: 경고 표시 또는 이동 제한

### 시뮬레이션 루프

```
매 프레임:
  1. 입력 이벤트 처리
  2. 구속 기반 transform 계산
  3. movement 적용
  4. 충돌 검사
  5. 결과 반영
```

## MVP 범위 (확정)

- [ ] glTF 임포트
- [ ] Part 단위 분리·선택
- [ ] 속성 부여 UI (UI Toolkit Inspector 스타일)
- [ ] Constraint: Parent / Hinge / Slider
- [ ] 단순 회전·이동 시뮬레이션
- [ ] 충돌 감지 (AABB/OBB)

**MVP 제외**: STEP 직접 임포트, MeshCollider, PLC 연동, 시간/일정 시뮬레이션, 멀티유저

## 기술 리스크 (사용자 검토 필요)

GPT 스펙은 아래 항목을 가볍게 다뤘으나 실제 구현 시 이 4가지가 진짜 어렵다:

### R1. STEP 임포트 — 단일 최대 리스크 [✅ 2026-05-07 결정]

- 직접 임포트 옵션 모두 기각 (CADLink Editor 전용, Asset Transformer 비싸고 솔로 부담, UnitySTEPImporter 폴리곤 폭증)
- **결정**: factory00-converter가 Blender headless로 STEP→glTF 자동 변환. 사용자에겐 Blender 안 보임.
- 상세 ADR: `wiki/topics/cad-pipeline/0001-step-import-strategy.md`

### R2. 어셈블리 계층 보존

"Part 단위 분리" 요건은 임포트한 파일이 **이미 계층 구조를 보존하고 있어야** 성립.

- STEP → glTF 변환 시 어셈블리 트리가 평탄화될 가능성 있음
- FBX는 보존 가능하지만 변환 도구별 차이 큼
- Blend → glTF: Blender Outliner 트리 그대로 보존됨 (가장 안전)
- **검증 의무**: 임포트 파이프라인별로 "5단계 어셈블리가 동일하게 보존되는가" 테스트 케이스 필요

### R3. MeshCollider 실시간 충돌

- 산업 어셈블리는 어셈블리당 100k+ 트라이앵글 흔함
- Unity MeshCollider mesh-mesh 실시간은 수 ms 단위로 프레임 깨짐
- **필수**: AABB/OBB만 1차 채택. MeshCollider는 "정적 검증" 모드에서만 (재생 정지 후 검사)

### R4. 비코딩 UI 스코프

GPT 스펙의 "노드 그래프 + 속성 편집기 + 드래그앤드롭"은 단순 외관과 달리 산업용 UI 한 세트. UI Toolkit으로도 4~6주 단위 작업.

- 우선순위: 속성 인스펙터 → 구속 추가 다이얼로그 → 노드 그래프(나중)
- 노드 그래프는 MVP 제외 권장 — 리스트 + 검색으로 1차 출시

## 참고 입력

사용자 제공 GPT 기획안 (2026-05-06):
- 디지털 트윈 경량 시뮬레이터 개발 프롬프트
- "심시티 스타일 디지털 트윈 툴"
- MVP: glTF / Part 분리 / Parent·Hinge·Slider / 회전·이동 / 충돌
