Cloudwiki

Web sandbox 프로젝트/문서/독립 오브젝트 개선 및 추가 후보

격자 파티클과 분리된 **독립 오브젝트 레이어**(고무공·드럼통 3종·다이너마이트)의 **상호작용 개선안**과 **신규 오브젝트 후보**를 정리한 구상 문서다.

## 현황

오브젝트는 `Grid.objects` 배열에 살며 CA 스캔이 끝난 뒤 `stepObjects`가 독립 패스로 적분한다. 형상은 **중심선 선분 + 캡 반지름**(캡슐) 하나로 통일돼 있고, 공은 선분 길이 0인 축약형이다.


| 오브젝트 | 형상 | 특징 |
| --- | --- | --- |
| Rubber Ball | 원 (무회전) | 밀도 1.2, 반발 0.82 — 물에 뜸. 고온/폭발에 부산물 없이 소멸 |
| Empty / Crude Oil / Acid Drum | 캡슐 (1축 회전) | 밀도 1.6, 반발 0.26, 마찰로 구름. 파괴 시 금속 가루 + `fill`별 내용물 유출 |
| Dynamite | 캡슐 (1축 회전) | 도화선이 실제 Fire 셀을 방출, 랜덤 타이머, 2단 폭발 |

### 이미 있는 상호작용 표면


| 상호작용 | 방향 | 경로 |
| --- | --- | --- |
| 고체 충돌·반발·마찰·구르기 | 그리드 → 오브젝트 | `isSolidCell` / 선분-셀 최근접점 |
| 부력·유체 항력 | 그리드 → 오브젝트 | 발자국 액체 밀도 합산(아르키메데스) |
| 가루 침투·입상 드래그 | 그리드 → 오브젝트 | 소성 지지력 + 강한 드래그 |
| 열 노출 (용융·연소) | 그리드 → 오브젝트 | 발자국 최고 온도 + 자체 `temp` 열저장고 |
| 폭발 넉백·직격 파괴 | 그리드 → 오브젝트 | Blast 셀 스캔 |
| Woofer 충격파 | 그리드 → 오브젝트 | `SimContext.wooferPulseX/Y` 틱당 이벤트 큐 |
| Fan 바람 | 그리드 → 오브젝트 | `Grid.wind` 필드 읽기 |
| 반물질·Nuclear Ray·Void 소멸 | 그리드 → 오브젝트 | 발자국 위험물 스캔 |
| 오브젝트끼리 충돌·토크 | 오브젝트 ↔ 오브젝트 | 선분-선분 최근접점 + 임펄스 |
| 브러시(가열·냉각·섞기·지우개·드래그) | UI → 오브젝트 | 브러시 툴 |
| 수면 진입 스플래시 · 파괴 부산물 유출 | 오브젝트 → 그리드 | **유일한 그리드 쓰기 2곳** |

위험: 한 줄 진단
오브젝트는 그리드를 **거의 읽기만 한다.** 힘은 전부 그리드→오브젝트 단방향이고, 반대 방향은 "터질 때 흘리는 것"과 "빠질 때 튀기는 것" 두 개의 이산 이벤트뿐이다. 그래서 **드럼통이 모래 더미를 뚫고 지나가고, 컨베이어 위에서 안 움직이고, 산 웅덩이에 담가도 멀쩡하고, 화약 위에 떨어뜨려도 안 터진다.** 아래 개선안은 대부분 이 한 문장을 고치는 것이다.


---

## 상호작용 개선안

### 매우 권장

 오브젝트를 파티클이 인식하게 하기 (양방향 커플링)
**무엇** — 매 틱 오브젝트 발자국을 **가상 고체 마스크**(셀당 1비트/1바이트 버퍼)로 스탬프하고, CA의 이동 판정(`SimContext.tryMove`)이 그 마스크를 고체처럼 취급하게 한다. 마스크는 렌더처럼 매 틱 새로 그려지므로 세이브 포맷도, 물질 id도 건드리지 않는다.

**근거** — ①**지금 가장 크게 어긋나는 지점이다.** 파티클은 오브젝트를 아예 못 본다. 물을 부으면 드럼통을 그냥 통과해 흐르고, 모래는 공 위에 쌓이지 않고 관통하며, 용암은 드럼통을 지나쳐 흘러내린다. 오브젝트는 "위에 떠 있는 그림"처럼 보인다. ②이 마스크 하나로 **연쇄적으로 열리는 것이 많다** — 드럼통이 물을 막아 댐이 되고, 공 위에 모래가 쌓여 산이 되고, 오브젝트로 유로를 막았다 치우는 놀이가 생기고, 아래의 컨베이어 이송·충격 기폭도 같은 판정을 재사용한다. ③방향은 이미 정해져 있다 — 오브젝트는 **부력·충돌에서 이미 발자국을 매 틱 계산**하고 있으므로, 그 결과를 한 번 더 버퍼에 찍는 것이 추가 비용의 대부분이다.

**주의** — 완전한 양방향(오브젝트가 가루를 밀어 옆으로 흘려보내기)은 질량 보존·스캔 순서 문제가 붙으므로 2단계로 나눈다: **1단계 = 막기(마스크)**, **2단계 = 밀기**(접촉 셀의 느슨한 물질만 인접 빈칸으로 얕게 변위, 실패하면 그대로 통과). 1단계만으로도 체감의 대부분이 해결된다.


 부식·화학 노출 (산이 오브젝트를 녹인다)
**무엇** — 발자국 스캔에 **Acid / Acid Vapor / Acid Slime** 접촉 카운트를 추가해, 누적 노출이 임계를 넘으면 오브젝트를 파괴한다(드럼통은 평소 파괴와 동일하게 금속 가루 + 내용물 유출).

**근거** — ①**"산 드럼통이 산에 안 녹는다"는 지금 명백한 구멍**이다. 열(1200°·24틱)로 녹는 경로는 이미 있는데 화학 경로만 빠져 있다. ②구현이 거의 공짜다 — `scanBodyExposure`가 이미 매 틱 발자국 셀을 훑으며 최고 온도와 위험물(Blast·Antimatter·Nuclear Ray·Void)을 세고 있으므로, **거기에 id 3개와 카운터 하나를 더하는 것**이 전부다. 드럼통의 `heatTicks` 누적 파괴 패턴을 그대로 복제하면 된다. ③창발이 좋다 — 압사한 산 드럼통이 흘린 산이 다른 드럼통을 녹여 연쇄하고, 산 웅덩이 위에 띄운 오브젝트에 제한 시간이 생긴다. Nichrome·Conveyor·Laser가 쓰는 `acidResistant` 개념을 오브젝트에도 두면 "산에 강한 드럼통" 같은 파생도 자연스럽다.


 컨베이어·펌프 이송 (공장 놀이)
**무엇** — 발자국 아래에 Conveyor 셀이 있으면 벨트 방향으로 **속도 바닥값**을 걸어 오브젝트를 실어 나른다(Fan 바람 넉백 `applyWindPush`와 완전히 같은 구조 — 누적이 아니라 바닥값).

**근거** — ①**Conveyor는 이미 "표면 위 최대 10칸 스택"을 나르는데 오브젝트만 빠져 있다.** 벨트 위에 드럼통을 올려도 제자리다. 파티클과 오브젝트가 같은 벨트에서 다르게 행동하는 건 명백한 비일관성이다. ②구현 비용이 이 문서에서 가장 낮은 축이다 — 바람 넉백 함수가 그리드 필드를 읽어 속도 바닥값을 거는 코드 그대로이고, 읽는 대상만 `Grid.wind` → Conveyor 셀 + `aux` 방향이 된다. ③**공장 놀이가 열린다.** 벨트로 드럼통을 실어 나르다 용광로에 떨어뜨리기, 컨베이어 라인 끝에서 다이너마이트가 굴러 떨어지기 — 지금 있는 부품만으로 시퀀스를 짜는 재미가 생긴다.


 충격 기폭 · 전기 접촉
**무엇** — ①충돌 임팩트(상대 속도 × 질량)가 임계를 넘으면, 접촉 셀의 폭발물을 기폭시킨다. ②발자국에 Spark가 닿으면 금속 오브젝트는 줄열로 `temp`가 오르고, 다이너마이트는 도화선에 불이 붙는다.

**근거** — ①**무거운 것을 떨어뜨려도 아무 일이 없다.** 드럼통을 화약 더미에 낙하시키거나 다이너마이트를 던져 맞혀도 반응이 없어서, 오브젝트가 "던지는 물건"으로 쓰이질 못한다. 낙하 충격이 기폭이 되면 오브젝트가 처음으로 **무기이자 도구**가 된다. ②구현할 훅이 이미 있다 — 전원 3종이 비도체 이웃을 넘기는 공용 `reactToPulse`(spark.ts)가 "펄스를 받은 폭약을 기폭"하는 로직을 이미 갖고 있고, 충격 기폭은 그 트리거를 충돌 임팩트로 갈아 끼운 것이다. ③위 물질 문서의 **기폭약(Primary Explosive)** 후보와 정확히 맞물린다 — 충격에 예민한 폭약이 있으면 "떨어뜨려 터뜨리기"가 하나의 놀이 방식이 된다.


### 권장


| 개선안 | 한 줄 근거 |
| --- | --- |
| **불붙는 오브젝트** | 나무 상자·다이너마이트 외에는 오브젝트가 타지 않는다 — 발자국에 Fire를 방출하며 서서히 소실되는 연소 상태를 두면 "불타는 통을 굴려 보내기"가 된다. |
| **충돌 시각 피드백** | 강한 충돌·착지 순간 접촉점에서 먼지/불꽃 파편을 소량 튀긴다 — 수면 스플래시가 이미 쓰는 `launchDebris` 그대로. 저비용 폴리시인데 무게감이 크게 는다. |
| **오브젝트 ↔ 전자석·펌프** | 위 물질 문서의 전자석이 들어오면 금속 오브젝트(드럼통)를 끌어당기는 것이 자연스럽다 — 바람 넉백의 부호 반대판. |
| **로프 / 조인트** | 두 오브젝트를 잇는 제약 — 진자·크레인·연쇄 폭파가 가능해지지만, 제약 솔버가 새로 필요해 비용이 이 문서에서 가장 높다. |
| **기울기 기반 내용물 유출** | 드럼통이 옆으로 넘어져 뚜껑이 아래를 향하면 파괴 없이도 내용물이 천천히 새어 나온다 — 회전각을 이미 갖고 있어 판정 자체는 각도 하나. |
| **오브젝트 온도 렌더** | 열저장고 `temp`가 이미 열지도 오버레이에 표시되므로, 일반 렌더에서도 벌겋게 달아오르는 글로우를 주면 "곧 녹는다"가 눈에 보인다. |
| **내구도(HP) 표면화** | 지금 파괴는 임계 도달 시 즉사다 — 누적 손상을 스프라이트의 찌그러짐/균열로 표현하면 위험이 예고된다. |
| **다각형/상자 형상** | 캡슐 하나로 통일한 덕에 코드가 단순한데, 그래서 "네모난 상자"를 제대로 표현할 수 없다 — SAT 솔버가 필요해 비용 중간. 당분간은 캡슐 근사로 버티는 편이 낫다. |

---

## 신규 오브젝트 후보

### 매우 권장

 나무 상자 (Wooden Crate)
**근거** — ①**"부수는 재미"의 가장 기본형이 없다.** 지금 파괴 가능한 오브젝트는 전부 금속 드럼통(같은 물리·같은 부산물)이거나 폭약이다. 상자는 **불에 탄다**는 완전히 다른 종료 경로를 갖고, 부서지면 Sawdust/Wood 파편을 남긴다 — 이미 있는 재료다. ②**드럼통의 `fill` 시스템을 그대로 물려받는다.** 물리는 `fill`을 절대 읽지 않도록 이미 분리돼 있어(질량·관성·반발은 기하로만 계산), 내용물만 바꾼 파생을 만드는 비용이 사실상 스프라이트 하나다. 모래 상자·화약 상자·씨앗 상자를 터뜨리면 내용물이 쏟아진다. ③흰개미(Termite)가 나무를 먹는다는 기존 상호작용과 곧바로 얽힌다.


 화염병 (Molotov)
**근거** — ①**드럼통 `fill` 유출 시스템의 완성형**이다. 파괴 시 액체를 쏟는 경로가 이미 검증돼 있으니, 여기에 "쏟은 즉시 점화" 한 줄만 더하면 된다 — 유리병이 깨지며 알코올/휘발유가 퍼지고 동시에 불이 붙는다. ②**던지는 재미가 처음으로 성립한다.** 지금 오브젝트를 집어 던지는 조작(보기 모드 드래그앤드롭)은 구현돼 있는데, **던져서 의미가 생기는 오브젝트가 다이너마이트뿐**이다. 화염병은 조작과 결과가 즉시 이어지는 가장 직관적인 물건이다. ③가볍고 약해서(낮은 질량·낮은 내구) 위 "충격 파괴" 판정의 가장 좋은 첫 소비자이기도 하다.


 압축가스 실린더 (Gas Cylinder)
**근거** — ①**파괴 결말에 "추진"이라는 새 축을 준다.** 지금 드럼통은 파괴되면 그 자리에 내용물을 흘리고 끝인데, 실린더는 **기체를 폭발적으로 분출하면서 그 반작용으로 로켓처럼 튀어 나간다.** 오브젝트가 스스로 격렬하게 움직이는 첫 사례이고, 화재 현장의 가스통이라는 그림이 즉시 읽힌다. ②구현은 기존 부품 조합이다 — 유출(`spawnFillSpill`)의 대상을 액체 대신 기체로 바꾸고, 파괴 순간 속도에 임펄스를 한 번 더한다. ③LPG(가연성)·산소(조연성)·수소(폭발성)·질소(불활성) 4종 `fill`로 성격이 확 갈려, 하나의 물리에서 완전히 다른 결과가 나온다 — 산소통은 근처 불을 초고온으로 키우고, 수소통은 산소와 만나 폭발한다.


 강철 구 (Steel Ball / Boulder)
**근거** — ①**고무공의 정반대 극이 없다.** 지금 원형 오브젝트는 밀도 1.2·반발 0.82의 고무공 하나뿐이라 "가볍고 잘 튀는" 성격만 존재한다. 밀도 8·반발 0.1의 무거운 구는 튀지 않고 **깊게 박히고 굴러 내려간다** — 가루 침투 깊이가 낙하 속도에 비례하는 기존 물리가 이때 비로소 눈에 띈다. ②위 "양방향 커플링" 개선안의 **가장 좋은 시연 대상**이다. 무거운 구가 모래를 파고들며 밀어내고 지형을 뭉개는 그림은, 마스크 하나 넣은 효과를 즉시 보여준다. ③파생이 자연스럽다 — 물에 가라앉는(밀도>3) 최초의 오브젝트라 수중 놀이도 다르게 굴러간다.


### 권장


| 후보 | 한 줄 근거 |
| --- | --- |
| **풍선 / 비치볼 (Balloon)** | 밀도 1 미만으로 **공중에 뜨는** 첫 오브젝트 — 부력 계산을 기체까지 확장하면 되고, Fan 바람·Woofer 충격파의 가장 좋은 장난감이 된다. |
| **얼음 블록 (Ice Block)** | 열 노출로 녹아 물을 쏟고 사라진다 — 드럼통의 용융 경로를 그대로 쓰되 결과가 Molten Iron 대신 Water. 가장 싼 신규 오브젝트. |
| **화약통 (Powder Keg)** | 드럼통 파생 + 파괴 시 대폭발 — 다이너마이트의 대형·둔감판(불에는 타다가 터지고, 충격에는 안 터짐). |
| **소화기 (Fire Extinguisher)** | 파괴 시 CO₂/Soda를 분사하며 추진 — 실린더의 소화 버전. 던져서 불을 끄는 도구. |
| **금속 파이프 (Pipe)** | 캡슐형 도체 — 발자국이 전기를 중계하면 **오브젝트가 회로 부품이 된다**(굴러가서 회로를 잇거나 끊는 스위치). |
| **낙하산 상자 (Supply Crate)** | 항력이 극단적으로 큰 상자 — 천천히 떨어져 착지 지점을 조준할 수 있다. |
| **자석 (Magnet Object)** | 위 전자석의 전원 없는 상시판 — 굴러다니며 금속 가루를 달고 다닌다. |
| **바퀴·수레 (Cart)** | 조인트가 들어온 뒤의 후속 — 지금은 비용 대비 이르다. |

---

## 관련 문서

[[Web sandbox 프로젝트/구상]] · [[Web sandbox 프로젝트/구상/물질 추가 후보]] · [[Web sandbox 프로젝트/구상/산업 공정 및 화학 반응 후보]] · [[Web sandbox 프로젝트/가이드/물리]]