@hatiolab/figure-model 0.1.92 → 0.1.94
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -12
- package/README.md +25 -25
- package/dist/{v3-asset-types.d.ts → asset-types.d.ts} +73 -67
- package/dist/asset-types.d.ts.map +1 -0
- package/dist/asset-types.js +2 -0
- package/dist/asset-types.js.map +1 -0
- package/dist/asset.d.ts +20 -0
- package/dist/asset.d.ts.map +1 -0
- package/dist/{v3-asset.js → asset.js} +49 -28
- package/dist/asset.js.map +1 -0
- package/dist/{v3-authoring-actions.d.ts → authoring-actions.d.ts} +77 -66
- package/dist/authoring-actions.d.ts.map +1 -0
- package/dist/{v3-authoring-actions.js → authoring-actions.js} +129 -104
- package/dist/authoring-actions.js.map +1 -0
- package/dist/{v3-authoring-session.d.ts → authoring-session.d.ts} +23 -21
- package/dist/authoring-session.d.ts.map +1 -0
- package/dist/{v3-authoring-session.js → authoring-session.js} +4 -4
- package/dist/authoring-session.js.map +1 -0
- package/dist/capabilities.d.ts +3 -0
- package/dist/capabilities.d.ts.map +1 -0
- package/dist/{v3-capabilities.js → capabilities.js} +8 -8
- package/dist/capabilities.js.map +1 -0
- package/dist/clip-keeping.d.ts +30 -0
- package/dist/clip-keeping.d.ts.map +1 -0
- package/dist/clip-keeping.js +77 -0
- package/dist/clip-keeping.js.map +1 -0
- package/dist/command-preview.d.ts +125 -0
- package/dist/command-preview.d.ts.map +1 -0
- package/dist/command-preview.js +246 -0
- package/dist/command-preview.js.map +1 -0
- package/dist/contract.d.ts +7 -0
- package/dist/contract.d.ts.map +1 -0
- package/dist/contract.js +12 -0
- package/dist/contract.js.map +1 -0
- package/dist/{v3-cost.d.ts → cost.d.ts} +5 -5
- package/dist/cost.d.ts.map +1 -0
- package/dist/{v3-cost.js → cost.js} +11 -11
- package/dist/cost.js.map +1 -0
- package/dist/{v3-create.d.ts → create.d.ts} +8 -8
- package/dist/{v3-create.d.ts.map → create.d.ts.map} +1 -1
- package/dist/{v3-create.js → create.js} +26 -26
- package/dist/create.js.map +1 -0
- package/dist/document.d.ts +5 -0
- package/dist/document.d.ts.map +1 -0
- package/dist/document.js +31 -0
- package/dist/document.js.map +1 -0
- package/dist/{v3-driver.d.ts → driver.d.ts} +10 -10
- package/dist/driver.d.ts.map +1 -0
- package/dist/{v3-driver.js → driver.js} +10 -10
- package/dist/driver.js.map +1 -0
- package/dist/{v3-editor-workspace.d.ts → editor-workspace.d.ts} +99 -73
- package/dist/editor-workspace.d.ts.map +1 -0
- package/dist/{v3-editor-workspace.js → editor-workspace.js} +48 -32
- package/dist/editor-workspace.js.map +1 -0
- package/dist/{v3-examples.d.ts → examples.d.ts} +5 -5
- package/dist/examples.d.ts.map +1 -0
- package/dist/{v3-examples.js → examples.js} +11 -11
- package/dist/examples.js.map +1 -0
- package/dist/{v3-follow.d.ts → follow.d.ts} +5 -5
- package/dist/follow.d.ts.map +1 -0
- package/dist/{v3-follow.js → follow.js} +2 -2
- package/dist/follow.js.map +1 -0
- package/dist/{v3-gate.d.ts → gate.d.ts} +36 -28
- package/dist/gate.d.ts.map +1 -0
- package/dist/{v3-gate.js → gate.js} +54 -48
- package/dist/gate.js.map +1 -0
- package/dist/{v3-graph-types.d.ts → graph-types.d.ts} +33 -33
- package/dist/graph-types.d.ts.map +1 -0
- package/dist/graph-types.js +2 -0
- package/dist/graph-types.js.map +1 -0
- package/dist/{v3-graph.d.ts → graph.d.ts} +14 -14
- package/dist/graph.d.ts.map +1 -0
- package/dist/{v3-graph.js → graph.js} +16 -16
- package/dist/graph.js.map +1 -0
- package/dist/index.d.ts +39 -33
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +39 -33
- package/dist/index.js.map +1 -1
- package/dist/{v3-instance-size.d.ts → instance-size.d.ts} +14 -14
- package/dist/instance-size.d.ts.map +1 -0
- package/dist/{v3-instance-size.js → instance-size.js} +13 -13
- package/dist/instance-size.js.map +1 -0
- package/dist/json.d.ts +12 -0
- package/dist/json.d.ts.map +1 -0
- package/dist/{v3-json.js → json.js} +13 -13
- package/dist/json.js.map +1 -0
- package/dist/kernel-version.d.ts +8 -0
- package/dist/kernel-version.d.ts.map +1 -0
- package/dist/{v3-kernel-version.js → kernel-version.js} +4 -4
- package/dist/kernel-version.js.map +1 -0
- package/dist/{v3-part-edit.d.ts → part-edit.d.ts} +12 -11
- package/dist/part-edit.d.ts.map +1 -0
- package/dist/{v3-part-edit.js → part-edit.js} +84 -68
- package/dist/part-edit.js.map +1 -0
- package/dist/proposal.d.ts +55 -0
- package/dist/proposal.d.ts.map +1 -0
- package/dist/{v3-proposal.js → proposal.js} +29 -21
- package/dist/proposal.js.map +1 -0
- package/dist/{v3-public-inputs.d.ts → public-inputs.d.ts} +4 -4
- package/dist/public-inputs.d.ts.map +1 -0
- package/dist/{v3-public-inputs.js → public-inputs.js} +3 -3
- package/dist/public-inputs.js.map +1 -0
- package/dist/recipe-build.d.ts +27 -0
- package/dist/recipe-build.d.ts.map +1 -0
- package/dist/{v3-recipe-build.js → recipe-build.js} +9 -9
- package/dist/recipe-build.js.map +1 -0
- package/dist/recipe-from-parts.d.ts +8 -0
- package/dist/recipe-from-parts.d.ts.map +1 -0
- package/dist/{v3-recipe-from-parts.js → recipe-from-parts.js} +9 -9
- package/dist/recipe-from-parts.js.map +1 -0
- package/dist/{v3-recipe.d.ts → recipe.d.ts} +25 -25
- package/dist/recipe.d.ts.map +1 -0
- package/dist/{v3-recipe.js → recipe.js} +30 -30
- package/dist/recipe.js.map +1 -0
- package/dist/release-contract.d.ts +19 -0
- package/dist/release-contract.d.ts.map +1 -0
- package/dist/{v3-release-contract.js → release-contract.js} +8 -7
- package/dist/release-contract.js.map +1 -0
- package/dist/{v3-render-batches.d.ts → render-batches.d.ts} +8 -8
- package/dist/render-batches.d.ts.map +1 -0
- package/dist/{v3-render-batches.js → render-batches.js} +4 -4
- package/dist/render-batches.js.map +1 -0
- package/dist/resize-plan.d.ts +61 -0
- package/dist/resize-plan.d.ts.map +1 -0
- package/dist/resize-plan.js +189 -0
- package/dist/resize-plan.js.map +1 -0
- package/dist/room.d.ts +53 -0
- package/dist/room.d.ts.map +1 -0
- package/dist/room.js +90 -0
- package/dist/room.js.map +1 -0
- package/dist/{v3-score.d.ts → score.d.ts} +19 -19
- package/dist/score.d.ts.map +1 -0
- package/dist/{v3-score.js → score.js} +32 -32
- package/dist/score.js.map +1 -0
- package/dist/shape-provider.d.ts +37 -0
- package/dist/shape-provider.d.ts.map +1 -0
- package/dist/shape-provider.js +69 -0
- package/dist/shape-provider.js.map +1 -0
- package/dist/{v3-shape-sampling.d.ts → shape-sampling.d.ts} +4 -4
- package/dist/shape-sampling.d.ts.map +1 -0
- package/dist/{v3-shape-sampling.js → shape-sampling.js} +3 -3
- package/dist/shape-sampling.js.map +1 -0
- package/dist/size-edit.d.ts +38 -0
- package/dist/size-edit.d.ts.map +1 -0
- package/dist/size-edit.js +178 -0
- package/dist/size-edit.js.map +1 -0
- package/dist/{v3-surface.d.ts → surface.d.ts} +5 -5
- package/dist/surface.d.ts.map +1 -0
- package/dist/{v3-surface.js → surface.js} +7 -7
- package/dist/surface.js.map +1 -0
- package/dist/{v3-words.d.ts → words.d.ts} +3 -3
- package/dist/words.d.ts.map +1 -0
- package/dist/{v3-words.js → words.js} +3 -3
- package/dist/words.js.map +1 -0
- package/docs/{assembly-constraints-v3.md → assembly-constraints.md} +1 -1
- package/docs/{v3-asset-persistence.md → asset-persistence.md} +8 -8
- package/docs/{v3-authoring-transactions.md → authoring-transactions.md} +2 -2
- package/docs/{v3-capability-bindings.md → capability-bindings.md} +8 -8
- package/docs/{v3-common-kernel-experiment.md → common-kernel-experiment.md} +4 -4
- package/docs/{v3-core-semantics.md → core-semantics.md} +5 -5
- package/docs/{v3-cutover.md → cutover.md} +4 -4
- package/docs/{v3-design.md → design.md} +11 -11
- package/docs/{v3-document-contract.md → document-contract.md} +9 -9
- package/docs/{v3-dryroom-profile-validation.md → dryroom-profile-validation.md} +4 -4
- package/docs/{v3-editor-integration.md → editor-integration.md} +6 -6
- package/docs/{v3-full-conveyor-validation.md → full-conveyor-validation.md} +4 -4
- package/docs/{v3-full-dryroom-validation.md → full-dryroom-validation.md} +4 -4
- package/docs/{v3-full-forklift-validation.md → full-forklift-validation.md} +5 -5
- package/docs/{v3-full-robot-validation.md → full-robot-validation.md} +4 -4
- package/docs/{v3-layout-system.md → layout-system.md} +4 -4
- package/docs/{v3-legacy-risk-audit-2026-09-23.md → legacy-risk-audit-2026-09-23.md} +5 -5
- package/docs/{v3-minimal-model.md → minimal-model.md} +6 -6
- package/docs/{v3-motion-contract.md → motion-contract.md} +3 -3
- package/docs/{v3-openusd-review.md → openusd-review.md} +8 -8
- package/docs/{v3-operator-contracts.md → operator-contracts.md} +6 -6
- package/docs/{v3-payload-collision-validation.md → payload-collision-validation.md} +4 -4
- package/docs/{v3-payload-contact-validation.md → payload-contact-validation.md} +5 -5
- package/docs/prototypes/README.md +10 -10
- package/docs/prototypes/{v3-asset-samples.mjs → asset-samples.mjs} +6 -6
- package/docs/prototypes/{v3-asset-store.mjs → asset-store.mjs} +3 -3
- package/docs/prototypes/{v3-asset-store.test.mjs → asset-store.test.mjs} +6 -6
- package/docs/prototypes/asset.mjs +1 -0
- package/docs/prototypes/{v3-asset.schema.json → asset.schema.json} +2 -2
- package/docs/prototypes/{v3-asset.test.mjs → asset.test.mjs} +10 -10
- package/docs/prototypes/authoring-session.mjs +1 -0
- package/docs/prototypes/{v3-authoring-session.test.mjs → authoring-session.test.mjs} +6 -6
- package/docs/prototypes/capability-plan.mjs +1 -0
- package/docs/prototypes/{v3-capability-plan.test.mjs → capability-plan.test.mjs} +5 -5
- package/docs/prototypes/{v3-capability-samples.mjs → capability-samples.mjs} +2 -2
- package/docs/prototypes/document.mjs +2 -0
- package/docs/prototypes/{v3-document.schema.json → document.schema.json} +1 -1
- package/docs/prototypes/{v3-document.test.mjs → document.test.mjs} +7 -7
- package/docs/prototypes/{v3-dryroom-mesh.mjs → dryroom-mesh.mjs} +1 -1
- package/docs/prototypes/{v3-dryroom-mesh.test.mjs → dryroom-mesh.test.mjs} +1 -1
- package/docs/prototypes/{v3-editor-browser.mjs → editor-browser.mjs} +13 -13
- package/docs/prototypes/editor-workspace.mjs +1 -0
- package/docs/prototypes/{v3-editor-workspace.test.mjs → editor-workspace.test.mjs} +3 -3
- package/docs/prototypes/{v3-feature-pattern.test.mjs → feature-pattern.test.mjs} +1 -1
- package/docs/prototypes/{v3-full-conveyor.mjs → full-conveyor.mjs} +2 -2
- package/docs/prototypes/{v3-full-conveyor.test.mjs → full-conveyor.test.mjs} +3 -3
- package/docs/prototypes/{v3-full-dryroom.mjs → full-dryroom.mjs} +2 -2
- package/docs/prototypes/{v3-full-dryroom.test.mjs → full-dryroom.test.mjs} +3 -3
- package/docs/prototypes/{v3-full-forklift.mjs → full-forklift.mjs} +2 -2
- package/docs/prototypes/{v3-full-forklift.test.mjs → full-forklift.test.mjs} +3 -3
- package/docs/prototypes/{v3-full-robot.mjs → full-robot.mjs} +2 -2
- package/docs/prototypes/{v3-full-robot.test.mjs → full-robot.test.mjs} +4 -4
- package/docs/prototypes/{v3-kernel.test.mjs → kernel.test.mjs} +1 -1
- package/docs/prototypes/{v3-layout.test.mjs → layout.test.mjs} +1 -1
- package/docs/prototypes/{v3-more-samples.test.mjs → more-samples.test.mjs} +2 -2
- package/docs/prototypes/{v3-payload-collision.mjs → payload-collision.mjs} +2 -2
- package/docs/prototypes/{v3-payload-collision.test.mjs → payload-collision.test.mjs} +3 -3
- package/docs/prototypes/{v3-payload-fit.mjs → payload-fit.mjs} +2 -2
- package/docs/prototypes/{v3-payload-fit.test.mjs → payload-fit.test.mjs} +4 -4
- package/docs/prototypes/render-full-dryroom.mjs +12 -12
- package/docs/prototypes/{v3-repeated-binding.mjs → repeated-binding.mjs} +1 -1
- package/docs/prototypes/{v3-repeated-binding.test.mjs → repeated-binding.test.mjs} +6 -6
- package/docs/prototypes/{v3-runtime-browser.mjs → runtime-browser.mjs} +26 -26
- package/docs/prototypes/{v3-samples.test.mjs → samples.test.mjs} +1 -1
- package/docs/prototypes/{v3-spatial-plan.test.mjs → spatial-plan.test.mjs} +1 -1
- package/docs/prototypes/typed-plan.mjs +3 -0
- package/docs/prototypes/{v3-typed-plan.test.mjs → typed-plan.test.mjs} +1 -1
- package/docs/prototypes/{v3-typed-repeat.test.mjs → typed-repeat.test.mjs} +2 -2
- package/docs/{v3-repeated-binding-validation.md → repeated-binding-validation.md} +4 -4
- package/docs/{v3-research-review.md → research-review.md} +2 -2
- package/docs/{v3-review-2026-09-22.md → review-2026-09-22.md} +10 -10
- package/docs/{v3-runtime-extraction.md → runtime-extraction.md} +16 -16
- package/docs/{v3-sample-validation-expanded.md → sample-validation-expanded.md} +5 -5
- package/docs/{v3-sample-validation.md → sample-validation.md} +3 -3
- package/docs/{v3-shape-dimension-contract.md → shape-dimension-contract.md} +12 -12
- package/docs/{v3-shapeassembly-reproduction.md → shapeassembly-reproduction.md} +4 -4
- package/docs/{v3-spatial-contracts.md → spatial-contracts.md} +5 -5
- package/docs/status.md +12 -0
- package/docs/{v3-storage-integration.md → storage-integration.md} +5 -5
- package/docs/{v3-typed-repeat-contracts.md → typed-repeat-contracts.md} +3 -3
- package/package.json +3 -3
- package/dist/v3-asset-types.d.ts.map +0 -1
- package/dist/v3-asset-types.js +0 -2
- package/dist/v3-asset-types.js.map +0 -1
- package/dist/v3-asset.d.ts +0 -8
- package/dist/v3-asset.d.ts.map +0 -1
- package/dist/v3-asset.js.map +0 -1
- package/dist/v3-authoring-actions.d.ts.map +0 -1
- package/dist/v3-authoring-actions.js.map +0 -1
- package/dist/v3-authoring-session.d.ts.map +0 -1
- package/dist/v3-authoring-session.js.map +0 -1
- package/dist/v3-capabilities.d.ts +0 -3
- package/dist/v3-capabilities.d.ts.map +0 -1
- package/dist/v3-capabilities.js.map +0 -1
- package/dist/v3-contract.d.ts +0 -7
- package/dist/v3-contract.d.ts.map +0 -1
- package/dist/v3-contract.js +0 -12
- package/dist/v3-contract.js.map +0 -1
- package/dist/v3-cost.d.ts.map +0 -1
- package/dist/v3-cost.js.map +0 -1
- package/dist/v3-create.js.map +0 -1
- package/dist/v3-document.d.ts +0 -5
- package/dist/v3-document.d.ts.map +0 -1
- package/dist/v3-document.js +0 -31
- package/dist/v3-document.js.map +0 -1
- package/dist/v3-driver.d.ts.map +0 -1
- package/dist/v3-driver.js.map +0 -1
- package/dist/v3-editor-workspace.d.ts.map +0 -1
- package/dist/v3-editor-workspace.js.map +0 -1
- package/dist/v3-examples.d.ts.map +0 -1
- package/dist/v3-examples.js.map +0 -1
- package/dist/v3-follow.d.ts.map +0 -1
- package/dist/v3-follow.js.map +0 -1
- package/dist/v3-gate.d.ts.map +0 -1
- package/dist/v3-gate.js.map +0 -1
- package/dist/v3-graph-types.d.ts.map +0 -1
- package/dist/v3-graph-types.js +0 -2
- package/dist/v3-graph-types.js.map +0 -1
- package/dist/v3-graph.d.ts.map +0 -1
- package/dist/v3-graph.js.map +0 -1
- package/dist/v3-instance-size.d.ts.map +0 -1
- package/dist/v3-instance-size.js.map +0 -1
- package/dist/v3-json.d.ts +0 -12
- package/dist/v3-json.d.ts.map +0 -1
- package/dist/v3-json.js.map +0 -1
- package/dist/v3-kernel-version.d.ts +0 -8
- package/dist/v3-kernel-version.d.ts.map +0 -1
- package/dist/v3-kernel-version.js.map +0 -1
- package/dist/v3-part-edit.d.ts.map +0 -1
- package/dist/v3-part-edit.js.map +0 -1
- package/dist/v3-proposal.d.ts +0 -42
- package/dist/v3-proposal.d.ts.map +0 -1
- package/dist/v3-proposal.js.map +0 -1
- package/dist/v3-public-inputs.d.ts.map +0 -1
- package/dist/v3-public-inputs.js.map +0 -1
- package/dist/v3-recipe-build.d.ts +0 -27
- package/dist/v3-recipe-build.d.ts.map +0 -1
- package/dist/v3-recipe-build.js.map +0 -1
- package/dist/v3-recipe-from-parts.d.ts +0 -8
- package/dist/v3-recipe-from-parts.d.ts.map +0 -1
- package/dist/v3-recipe-from-parts.js.map +0 -1
- package/dist/v3-recipe.d.ts.map +0 -1
- package/dist/v3-recipe.js.map +0 -1
- package/dist/v3-release-contract.d.ts +0 -19
- package/dist/v3-release-contract.d.ts.map +0 -1
- package/dist/v3-release-contract.js.map +0 -1
- package/dist/v3-render-batches.d.ts.map +0 -1
- package/dist/v3-render-batches.js.map +0 -1
- package/dist/v3-score.d.ts.map +0 -1
- package/dist/v3-score.js.map +0 -1
- package/dist/v3-shape-sampling.d.ts.map +0 -1
- package/dist/v3-shape-sampling.js.map +0 -1
- package/dist/v3-surface.d.ts.map +0 -1
- package/dist/v3-surface.js.map +0 -1
- package/dist/v3-words.d.ts.map +0 -1
- package/dist/v3-words.js.map +0 -1
- package/docs/prototypes/v3-asset.mjs +0 -1
- package/docs/prototypes/v3-authoring-session.mjs +0 -1
- package/docs/prototypes/v3-capability-plan.mjs +0 -1
- package/docs/prototypes/v3-document.mjs +0 -2
- package/docs/prototypes/v3-editor-workspace.mjs +0 -1
- package/docs/prototypes/v3-typed-plan.mjs +0 -3
- package/docs/v3-status.md +0 -50
- /package/docs/prototypes/{v3-kernel.mjs → kernel.mjs} +0 -0
- /package/docs/prototypes/{v3-linear-comparison.py → linear-comparison.py} +0 -0
- /package/docs/prototypes/{v3-semantics.test.mjs → semantics.test.mjs} +0 -0
|
@@ -1,22 +1,22 @@
|
|
|
1
|
-
# Figure
|
|
1
|
+
# Figure — 3차원 레이아웃의 수학적 계약
|
|
2
2
|
|
|
3
|
-
> 현재 구현·검증·제품 연결 상태는 [
|
|
3
|
+
> 현재 구현·검증·제품 연결 상태는 [구현·검증 현황](status.md)을 따른다. 본문의 단계별 연구/검증 기록은 제품 전체 완료 선언이 아니다.
|
|
4
4
|
|
|
5
|
-
> 이 문서는 r1의 수학적 논거를 보존한다. [최소 실행 모델 r2](
|
|
5
|
+
> 이 문서는 r1의 수학적 논거를 보존한다. [최소 실행 모델 r2](minimal-model.md)가
|
|
6
6
|
> 현재 설계 후보이며, 이 문서의 독립적인 layout/motion parent 및 상위 Flex/Grid 계약은
|
|
7
7
|
> 확정 요구사항이 아니다. 두 안을 혼합해 구현하지 않는다.
|
|
8
8
|
|
|
9
9
|
상태: 설계 중인 실행 계약. 구현·렌더링·실자산 검증 완료가 아니다.
|
|
10
|
-
2026-09-20. `assembly-constraints
|
|
10
|
+
2026-09-20. `assembly-constraints.md`의 초기안을 대체한다.
|
|
11
11
|
|
|
12
|
-
상위 배치 계약: [3차원 컨테이너·Flex·Grid](
|
|
12
|
+
상위 배치 계약: [3차원 컨테이너·Flex·Grid](layout-system.md).
|
|
13
13
|
이 문서는 좌표·부착·운동의 하위 계약이다. Flex/Grid의 크기 배분과 중첩은 상위 계약을 따른다.
|
|
14
|
-
검증 예제: `node --test docs/prototypes/
|
|
14
|
+
검증 예제: `node --test docs/prototypes/layout.test.mjs`.
|
|
15
15
|
|
|
16
16
|
## 1. 목적과 범위
|
|
17
17
|
|
|
18
18
|
Figure는 저폴리 형상을 쉽게 저작하고 많은 인스턴스를 효율적으로 배치하는 제품이다.
|
|
19
|
-
|
|
19
|
+
이 모델의 핵심은 **치수에 따라 달라지는 3차원 배치 함수**다. 문틀·문짝·표시등은 이 함수의
|
|
20
20
|
입력 예이며 별도의 예외 알고리즘이 아니다.
|
|
21
21
|
|
|
22
22
|
부품 맞춤 UI와 AI는 공통 레이아웃 언어로 편집한다. 모델·검사·2D·3D가 같은 평가 결과를
|
|
@@ -27,7 +27,7 @@ v3의 핵심은 **치수에 따라 달라지는 3차원 배치 함수**다. 문
|
|
|
27
27
|
|
|
28
28
|
## 2. 설계의 근거
|
|
29
29
|
|
|
30
|
-
|
|
30
|
+
이 설계의 근거는 일반적인 조립 의도와 일관된 배치 계산의 필요성이다. 배치는 기준 상자의 축만이
|
|
31
31
|
아니라 부품의 개구부·부착 좌표계를 직접 참조해야 한다. 검사는 상자의 연결 개수가 아니라 실제
|
|
32
32
|
접촉·맞춤을, 몇 가지 배율이 아니라 선언한 치수 범위·축소·운동 상태를 다뤄야 한다. 관계를
|
|
33
33
|
추가한다고 성능 이득이 보장되지는 않는다.
|
|
@@ -298,7 +298,7 @@ lamp는 portal feature 기준점에 고정 크기로 정렬하고, readout은 fe
|
|
|
298
298
|
## 13. 실행 모델과 성능
|
|
299
299
|
|
|
300
300
|
```ts
|
|
301
|
-
|
|
301
|
+
compileFigure(source): PreparedFigure | Diagnostics
|
|
302
302
|
resolveLayout(prepared, dimensions): ResolvedLayout | Diagnostics
|
|
303
303
|
evaluatePose(layout, state): ResolvedFigure | Diagnostics
|
|
304
304
|
inspectResolved(prepared, resolved, profile): Inspection
|
|
@@ -361,9 +361,9 @@ AI와 자동 수정은 typed edit API를 사용한다. 후보에 baseRevision/so
|
|
|
361
361
|
## 16. 식별자와 구현 단계
|
|
362
362
|
|
|
363
363
|
id는 불변, label은 표시 이름이다. 기존 name 기반 외부 참조는 자산 재작성 시 갱신한다.
|
|
364
|
-
초안 저장과 발행 조건을 분리한다. 미지원 consumer에
|
|
364
|
+
초안 저장과 발행 조건을 분리한다. 미지원 consumer에 부분 해석한 자산을 보내지 않는다.
|
|
365
365
|
|
|
366
|
-
세부 구현 순서와 출하 조건은 [상위 레이아웃 계약 §12](
|
|
366
|
+
세부 구현 순서와 출하 조건은 [상위 레이아웃 계약 §12](layout-system.md#12-출하-전-단계와-완료-기준)를 따른다.
|
|
367
367
|
fixture는 단독 box, 두짝문, 회전 portal, 원형 roller, 선반+lamp repeat, slot/port,
|
|
368
368
|
의도적 분리, 서로 다른 개도의 portal 두 개를 포함한다.
|
|
369
369
|
실제 드라이룸 revision fixture 취득은 남아 있다.
|
|
@@ -1,26 +1,26 @@
|
|
|
1
1
|
# V3 그래프·capability 직렬화 계약 — 실험판
|
|
2
2
|
|
|
3
|
-
> 현재 구현·검증·제품 연결 상태는 [
|
|
3
|
+
> 현재 구현·검증·제품 연결 상태는 [구현·검증 현황](status.md)을 따른다. 본문의 단계별 연구/검증 기록은 제품 전체 완료 선언이 아니다.
|
|
4
4
|
|
|
5
5
|
## 범위와 상태
|
|
6
6
|
|
|
7
7
|
실험 그래프와 capability 선언을 저장하고 재로드해 의미 검증하는 계약을 구현했다. **전체 Figure V3 제품 파일 포맷 확정이 아니다.** 현재 전체 모델 예제의 재질·분할 수·외부 capability 메타데이터 일부는 어댑터가 공급한다. 그 데이터까지 이 포맷이 저장한다고 주장하지 않는다. 제품 DB·서버·UI는 변경하지 않았다.
|
|
8
8
|
|
|
9
|
-
후속 [자산 저장 envelope](
|
|
9
|
+
후속 [자산 저장 envelope](asset-persistence.md)는 이 document를 감싸 설계 입력·동작 기본값·재질·팔레트·분할 품질을 함께 저장한다. document 단독 포맷과 자산 envelope의 지원 범위를 혼동하지 않는다.
|
|
10
10
|
|
|
11
|
-
- [JSON Schema draft-07](prototypes/
|
|
12
|
-
- [저장·읽기·의미 검증](prototypes/
|
|
13
|
-
- [표면 출처 및 round-trip 테스트](prototypes/
|
|
11
|
+
- [JSON Schema draft-07](prototypes/document.schema.json)
|
|
12
|
+
- [저장·읽기·의미 검증](prototypes/document.mjs)
|
|
13
|
+
- [표면 출처 및 round-trip 테스트](prototypes/document.test.mjs)
|
|
14
14
|
|
|
15
15
|
```
|
|
16
16
|
{
|
|
17
|
-
version: "figure-
|
|
17
|
+
version: "figure-prototype-1",
|
|
18
18
|
model: { version: "r3-spatial-1", inputs, constants, nodes },
|
|
19
19
|
capabilities: { version: "r3-capability-3", assetFrame, bindings }
|
|
20
20
|
}
|
|
21
21
|
```
|
|
22
22
|
|
|
23
|
-
위 코드는 구조 설명이며 생략된 값을 포함한 유효 JSON 예제는 아니다. 재현 가능한 실제 선언은 `
|
|
23
|
+
위 코드는 구조 설명이며 생략된 값을 포함한 유효 JSON 예제는 아니다. 재현 가능한 실제 선언은 `capability-samples.mjs`의 model/declaration을 사용한다.
|
|
24
24
|
|
|
25
25
|
## 두 단계 검증
|
|
26
26
|
|
|
@@ -36,7 +36,7 @@ JSON Schema는 필드 구조·자료형·기본 enum·버전을 검사한다. op
|
|
|
36
36
|
- JSON 키 중복은 마지막 값으로 덮지 않고 거부한다. Unicode escape로 같은 키가 표현된 경우도 포함한다.
|
|
37
37
|
- 잘린 JSON, 비유한 수, undefined, 함수, Date, 순환, sparse array, accessor·숨겨진 속성 등 JSON으로 손실되는 입력을 거부한다.
|
|
38
38
|
- 실험 자원 제한: 1MiB UTF-8, 객체 깊이64, 그래프 node512. 제품 용량 정책으로 확정된 값이 아니다.
|
|
39
|
-
- 선언 공간(occupancy)의 경계는 `affine-bounds@1` 한 노드의 출력 여섯이다. 압축 인자 모양(`layout` = `L` + 여섯 묶음 + 후보별 항 수)은 [연산 계약 §4](
|
|
39
|
+
- 선언 공간(occupancy)의 경계는 `affine-bounds@1` 한 노드의 출력 여섯이다. 압축 인자 모양(`layout` = `L` + 여섯 묶음 + 후보별 항 수)은 [연산 계약 §4](operator-contracts.md#4-연산-catalog)에 적었다 — AI 저작·내보내기는 거기서 풀어 읽는다.
|
|
40
40
|
- round-trip은 의미·수치·선언 동일성을 대상으로 한다. 원본 JSON의 공백·키 표기·서식은 보존하지 않는다.
|
|
41
41
|
- 함수는 파일/DB에 직접 쓰지 않는다. 저장 API의 원자성, 권한, 버전 충돌, 마이그레이션은 제품 통합 시 별도로 구현해야 한다.
|
|
42
42
|
|
|
@@ -53,4 +53,4 @@ capability contacts는 `placement`와 `feature` 출력 ID로 명시한다. 실
|
|
|
53
53
|
3. 로봇 상완을 -90/0/90°로 회전하면 실제 surface normal도 같은 회전을 따른다.
|
|
54
54
|
4. 잘린 문서, 중복 키, 구버전, 크기 제한과 손실되는 JavaScript 값을 거부한다.
|
|
55
55
|
|
|
56
|
-
후속 단계에서 반복 표면 참조, 제한된 payload 접촉/충돌 검사, 전체 asset 직렬화와 공통 편집 workspace를 구현했다. 현황은 [통합 현황](
|
|
56
|
+
후속 단계에서 반복 표면 참조, 제한된 payload 접촉/충돌 검사, 전체 asset 직렬화와 공통 편집 workspace를 구현했다. 현황은 [통합 현황](status.md)을 따른다. 제품 편집기·DB 통합과 일반적인 공간·안전성 보장은 아직 미완료다.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# 드라이룸: 비대칭 단면 → typed feature → 실제 메시 검증
|
|
2
2
|
|
|
3
|
-
> 현재 구현·검증·제품 연결 상태는 [
|
|
3
|
+
> 현재 구현·검증·제품 연결 상태는 [구현·검증 현황](status.md)을 따른다. 본문의 단계별 연구/검증 기록은 제품 전체 완료 선언이 아니다.
|
|
4
4
|
|
|
5
5
|
> **2026-09-26:** `portal-profile@1`(좌표 여덟)은 `portal-profile@2`로 바뀌었다. 입력은 폭 · 높이 · 깊이 · 기둥 두께 · 인방 두께의 다섯이고, 좌우로 가운데, 바닥에 서며, 좌표 여덟은 이 값에서 나온다. 앞 셋이 상자와 같아 크기를 따를 수 있다. 아래는 @1 때의 기록이다.
|
|
6
6
|
|
|
@@ -73,12 +73,12 @@ ray 검사: 개구부 중앙은 관통, 상부/다리는 충돌, y=−30의 다
|
|
|
73
73
|
최종 이미지는 world 기준선과 픽셀별 depth 비교를 사용한다.
|
|
74
74
|
|
|
75
75
|
```sh
|
|
76
|
-
node --test docs/prototypes/
|
|
76
|
+
node --test docs/prototypes/dryroom-mesh.test.mjs
|
|
77
77
|
# Pillow + NumPy가 있는 Python 환경 사용. 실제 생성 메시 JSON을 입력한다.
|
|
78
|
-
node docs/prototypes/
|
|
78
|
+
node docs/prototypes/dryroom-mesh.mjs | python3 docs/prototypes/render-dryroom.py /tmp/figure-dryroom-before-after.png
|
|
79
79
|
```
|
|
80
80
|
|
|
81
|
-
현재 이미지: `/private/tmp/figure-
|
|
81
|
+
현재 이미지: `/private/tmp/figure-dryroom-before-after.png` (임시 생성물, 위 명령으로 재생성).
|
|
82
82
|
2개 mesh 검사 통과. 기존 검사와 함께 재실행한다.
|
|
83
83
|
|
|
84
84
|
## 5. 설계에 대한 결론
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
# V3 편집 화면 연결 검증 — 실험판
|
|
2
2
|
|
|
3
|
-
> 현재 구현·검증·제품 연결 상태는 [
|
|
3
|
+
> 현재 구현·검증·제품 연결 상태는 [구현·검증 현황](status.md)을 따른다. 본문의 단계별 연구/검증 기록은 제품 전체 완료 선언이 아니다.
|
|
4
4
|
|
|
5
5
|
## 완료 범위
|
|
6
6
|
|
|
7
7
|
저장된 V3 자산을 공통 편집 세션으로 열고, 입력 변경을 평가된 3D 장면으로 전달하는 연결 계층을 구현했다. **제품 모델러·서버·DB에는 아직 연결하지 않았다.**
|
|
8
8
|
|
|
9
|
-
- 연결 계층: [
|
|
10
|
-
- 계약 검증: [
|
|
11
|
-
- 격리 브라우저 검증: [
|
|
9
|
+
- 연결 계층: [editor-workspace.ts](../src/editor-workspace.ts) — 실험 mjs는 re-export만 유지
|
|
10
|
+
- 계약 검증: [editor-workspace.test.mjs](prototypes/editor-workspace.test.mjs)
|
|
11
|
+
- 격리 브라우저 검증: [editor-browser.mjs](prototypes/editor-browser.mjs)
|
|
12
12
|
|
|
13
13
|
원본은 관계 그래프와 저작 입력이다. 메시를 직접 수정한 뒤 그래프로 역추정하지 않는다. 속성창과 AI는 같은 단위·역할·revision 검사 및 편집 트랜잭션을 사용한다.
|
|
14
14
|
|
|
@@ -41,11 +41,11 @@
|
|
|
41
41
|
6. 저장본을 다시 열어 1275mm 복원 확인.
|
|
42
42
|
7. 빈 화면으로 전환해 메시 0개·입력 0개 확인.
|
|
43
43
|
|
|
44
|
-
위 기록은 최초 메모리 저장 검증이다. 이후 저장 버튼을 HTTP 기반 임시 파일 저장으로 연결했고 별도 프로세스 복원·저장 충돌 검증을 추가했다. 최신 범위는 [저장 연결 검증](
|
|
44
|
+
위 기록은 최초 메모리 저장 검증이다. 이후 저장 버튼을 HTTP 기반 임시 파일 저장으로 연결했고 별도 프로세스 복원·저장 충돌 검증을 추가했다. 최신 범위는 [저장 연결 검증](storage-integration.md)을 따른다. 브라우저 page error는 0개이며 `/private/tmp/figure-editor.png`와 `/private/tmp/figure-editor-empty.png`의 캔버스도 직접 확인했다. 제품 UI 연결을 뜻하지 않는다.
|
|
45
45
|
|
|
46
46
|
## 제품 연결 시 주의점
|
|
47
47
|
|
|
48
|
-
현재 figure-ui의 `client/modeller/figure-source.ts`는 장면 파트를 저장용 이전 형식 source로 변환한다. `figure-inspector.ts`와 `figure-modeller-page.ts`의 update-part/update-draft 경로도 이전 형식의 draft/parts 중심이다.
|
|
48
|
+
현재 figure-ui의 `client/modeller/figure-source.ts`는 장면 파트를 저장용 이전 형식 source로 변환한다. `figure-inspector.ts`와 `figure-modeller-page.ts`의 update-part/update-draft 경로도 이전 형식의 draft/parts 중심이다. graph를 이 경로의 `parts`로 가장해 전달하면 원본이 이중화된다.
|
|
49
49
|
|
|
50
50
|
제품 모델러·저장·AI·렌더러를 V3 단일 경로로 전환한다. 기존 자산은 V3로 재작성한다. 호환 분기는 만들지 않는다. 제품에서는 src에서 빌드한 공용 API를 사용한다.
|
|
51
51
|
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
# V3 전체 컨베이어 검증 — 2026-09-21
|
|
2
2
|
|
|
3
|
-
> 현재 구현·검증·제품 연결 상태는 [
|
|
3
|
+
> 현재 구현·검증·제품 연결 상태는 [구현·검증 현황](status.md)을 따른다. 본문의 단계별 연구/검증 기록은 제품 전체 완료 선언이 아니다.
|
|
4
4
|
|
|
5
5
|
## 판정과 범위
|
|
6
6
|
|
|
7
7
|
저장소 CONVEYOR seed의 **17개 파트 유형 전체**를 실험 V3 그래프로 작성했다. 기본 형상과 재질을 재현하면서 기존 반복 배치의 겹침을 의도적으로 제거했다. 제품 모델러 통합·애니메이션 재생·AI 저작 검증은 아직 아니다.
|
|
8
8
|
|
|
9
|
-
- 선언 및 메시 어댑터: [
|
|
10
|
-
- 회귀 검사: [
|
|
9
|
+
- 선언 및 메시 어댑터: [full-conveyor.mjs](prototypes/full-conveyor.mjs)
|
|
10
|
+
- 회귀 검사: [full-conveyor.test.mjs](prototypes/full-conveyor.test.mjs)
|
|
11
11
|
- 브라우저: `node docs/prototypes/render-full-dryroom.mjs --conveyor`
|
|
12
12
|
- 전체 테스트: `node --test docs/prototypes/v3-*.test.mjs`
|
|
13
13
|
|
|
@@ -55,7 +55,7 @@ Chrome WebGL에서 직접 이미지를 확인했다. 환경 반사광을 포함
|
|
|
55
55
|
| V3 회전 37° | 30 | 1,516 |
|
|
56
56
|
| V3 길이3000·폭900·높이700·회전37° | 34 | 1,708 |
|
|
57
57
|
|
|
58
|
-
원본과 V3 기본 상태의 해당 시점 RGBA 채널 차이는 0이었다. **메시가 같다는 뜻은 아니다.** 원본의 불필요한 두 롤러가 완전히 가려져 영상에는 나타나지 않기 때문이다. 영상만으로 내부 중첩을 판정할 수 없다는 사례다. 브라우저 pageerror는 없었다. 임시 이미지: `/private/tmp/figure-
|
|
58
|
+
원본과 V3 기본 상태의 해당 시점 RGBA 채널 차이는 0이었다. **메시가 같다는 뜻은 아니다.** 원본의 불필요한 두 롤러가 완전히 가려져 영상에는 나타나지 않기 때문이다. 영상만으로 내부 중첩을 판정할 수 없다는 사례다. 브라우저 pageerror는 없었다. 임시 이미지: `/private/tmp/figure-full-conveyor.png`.
|
|
59
59
|
|
|
60
60
|
## 남은 한계
|
|
61
61
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# V3 전체 DRY_ROOM 검증 — 2026-09-21
|
|
2
2
|
|
|
3
|
-
> 현재 구현·검증·제품 연결 상태는 [
|
|
3
|
+
> 현재 구현·검증·제품 연결 상태는 [구현·검증 현황](status.md)을 따른다. 본문의 단계별 연구/검증 기록은 제품 전체 완료 선언이 아니다.
|
|
4
4
|
|
|
5
5
|
## 판정
|
|
6
6
|
|
|
@@ -9,8 +9,8 @@
|
|
|
9
9
|
## 범위와 재현 방법
|
|
10
10
|
|
|
11
11
|
- 원본: `operato-application/packages/operato-figure/server/seed/figure-samples.json`의 DRY_ROOM.
|
|
12
|
-
- 전체 선언: [
|
|
13
|
-
- 테스트: [
|
|
12
|
+
- 전체 선언: [full-dryroom.mjs](prototypes/full-dryroom.mjs).
|
|
13
|
+
- 테스트: [full-dryroom.test.mjs](prototypes/full-dryroom.test.mjs).
|
|
14
14
|
- 브라우저 실험: [render-full-dryroom.mjs](prototypes/render-full-dryroom.mjs).
|
|
15
15
|
- 실행: `node --test docs/prototypes/v3-*.test.mjs`, `node docs/prototypes/render-full-dryroom.mjs`.
|
|
16
16
|
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
- 전체 프로토타입 회귀 테스트 **80/80 통과**.
|
|
35
35
|
- Chrome WebGL 동일 카메라 기준 원본 재구현과 V3 기본 상태의 RGBA 채널 차이 **0**.
|
|
36
36
|
- 원본·V3 기본·하단 제거·크기 및 램프 위치 변경의 네 상태 모두 **6 draw calls / 336 triangles**. 브라우저 pageerror 없음.
|
|
37
|
-
- 생성 이미지: `/private/tmp/figure-
|
|
37
|
+
- 생성 이미지: `/private/tmp/figure-full-dryroom.png` (임시 산출물).
|
|
38
38
|
|
|
39
39
|
동일 영상은 해당 카메라에서만 비교했다. 보이지 않는 후면은 정점·관계 검사로 확인했으며, 후면 영상 비교나 실제 제품 전체 렌더링 검증을 대체하지 않는다.
|
|
40
40
|
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
# V3 전체 포크리프트 검증 — 2026-09-21
|
|
2
2
|
|
|
3
|
-
> 현재 구현·검증·제품 연결 상태는 [
|
|
3
|
+
> 현재 구현·검증·제품 연결 상태는 [구현·검증 현황](status.md)을 따른다. 본문의 단계별 연구/검증 기록은 제품 전체 완료 선언이 아니다.
|
|
4
4
|
|
|
5
5
|
## 판정
|
|
6
6
|
|
|
7
7
|
저장소 FORKLIFT seed의 **20개 파트 전체**와 lift/reach/drive를 실험 V3 그래프로 작성했다. 기본 형상 재현과 동시 상태 갱신 검증을 통과했다. 실제 제품 모델러·시간 재생기·적재 기능·충돌/안전성까지 완료한 것은 아니다.
|
|
8
8
|
|
|
9
|
-
- [전체 선언](prototypes/
|
|
10
|
-
- [테스트](prototypes/
|
|
9
|
+
- [전체 선언](prototypes/full-forklift.mjs)
|
|
10
|
+
- [테스트](prototypes/full-forklift.test.mjs)
|
|
11
11
|
- 실행: `node --test docs/prototypes/v3-*.test.mjs`
|
|
12
12
|
- 브라우저: `node docs/prototypes/render-full-dryroom.mjs --forklift`
|
|
13
13
|
|
|
@@ -28,7 +28,7 @@ forkLength는 설계 입력이며 포크 뒤쪽 z=360mm를 유지하고 앞쪽
|
|
|
28
28
|
- 포크 뒤쪽 장착 좌표, 상하 포크 간격400mm, carriage와 포크 상대 높이218mm 유지.
|
|
29
29
|
- 주 휠 축 방향·반지름에 따른 바닥 높이 유지, 잘못된 입력 거부, 오류 후 복구, 노드 순서 독립성 확인.
|
|
30
30
|
|
|
31
|
-
Chrome에서 원본·V3 기본·상승1000/내밈200·상승2000/내밈400/포크1275mm 이미지를 직접 확인했다. 각 상태 **20 draw calls / 1,032 triangles**, pageerror 없음. 원본 재구현과 V3 기본의 동일 카메라 픽셀 채널 차이는 0이었다. 이미지: `/private/tmp/figure-
|
|
31
|
+
Chrome에서 원본·V3 기본·상승1000/내밈200·상승2000/내밈400/포크1275mm 이미지를 직접 확인했다. 각 상태 **20 draw calls / 1,032 triangles**, pageerror 없음. 원본 재구현과 V3 기본의 동일 카메라 픽셀 채널 차이는 0이었다. 이미지: `/private/tmp/figure-full-forklift.png`.
|
|
32
32
|
|
|
33
33
|
## 한계
|
|
34
34
|
|
|
@@ -36,6 +36,6 @@ Chrome에서 원본·V3 기본·상승1000/내밈200·상승2000/내밈400/포
|
|
|
36
36
|
|
|
37
37
|
닫힌 개별 메시와 올바른 pose는 전체 조립의 무충돌을 증명하지 않는다. 원본 mast와 stage는 실선체 상자로 표현되어 정지 상태부터 내부가 겹친다. 텔레스코픽 기구의 실제 중공 단면을 재현한 것이 아니다. 경고등/라이다 등의 원본 배치도 미적·물리적 품질 검증을 별도로 받아야 한다.
|
|
38
38
|
|
|
39
|
-
적재 binding은 원본에 없으며 추가 구현한 것으로 계산하지 않는다. [capability binding 계약](
|
|
39
|
+
적재 binding은 원본에 없으며 추가 구현한 것으로 계산하지 않는다. [capability binding 계약](capability-bindings.md)은 물리 형상과 적재/파지 위치를 분리할 설계 초안이다.
|
|
40
40
|
|
|
41
41
|
이로써 드라이룸·컨베이어·로봇암·포크리프트 네 대표 모델의 전체 파트 실험은 존재한다. **제품 가치 검증 완료**를 의미하지 않는다. 발견한 원본 품질 문제, capability 구현, V3 직렬화/런타임, 실제 UI와 AI 편집 검증이 남아 있다.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# V3 전체 로봇암 검증 — 2026-09-21
|
|
2
2
|
|
|
3
|
-
> 현재 구현·검증·제품 연결 상태는 [
|
|
3
|
+
> 현재 구현·검증·제품 연결 상태는 [구현·검증 현황](status.md)을 따른다. 본문의 단계별 연구/검증 기록은 제품 전체 완료 선언이 아니다.
|
|
4
4
|
|
|
5
5
|
## 판정
|
|
6
6
|
|
|
@@ -8,8 +8,8 @@
|
|
|
8
8
|
|
|
9
9
|
## 구현과 재현
|
|
10
10
|
|
|
11
|
-
- [전체 선언 및 어댑터](prototypes/
|
|
12
|
-
- [검증 테스트](prototypes/
|
|
11
|
+
- [전체 선언 및 어댑터](prototypes/full-robot.mjs)
|
|
12
|
+
- [검증 테스트](prototypes/full-robot.test.mjs)
|
|
13
13
|
- `node --test docs/prototypes/v3-*.test.mjs`
|
|
14
14
|
- `node docs/prototypes/render-full-dryroom.mjs --robot`
|
|
15
15
|
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
- 관절 범위 초과와 잘못된 링크 길이 거부, 오류 이후 복구, 노드 선언 순서 독립성 검사 통과.
|
|
38
38
|
- 전체 프로토타입 회귀 테스트 **88/88 통과**. 이 숫자에는 아래 알려진 결함을 탐지하는 테스트도 포함하므로 제품 합격률이 아니다.
|
|
39
39
|
|
|
40
|
-
Chrome WebGL에서 기본 상태·6축과 그리퍼 동시 변경·링크 길이 변경 이미지를 직접 확인했다. 네 패널 모두 **10 draw calls / 220 triangles**, pageerror 없음. 원본 재구현과 V3 기본 상태의 해당 카메라 RGBA 채널 차이는 0이다. 임시 이미지: `/private/tmp/figure-
|
|
40
|
+
Chrome WebGL에서 기본 상태·6축과 그리퍼 동시 변경·링크 길이 변경 이미지를 직접 확인했다. 네 패널 모두 **10 draw calls / 220 triangles**, pageerror 없음. 원본 재구현과 V3 기본 상태의 해당 카메라 RGBA 채널 차이는 0이다. 임시 이미지: `/private/tmp/figure-full-robot.png`.
|
|
41
41
|
|
|
42
42
|
원본 렌더러를 직접 구동한 것이 아니라 형상 생성 경로를 재구현했다. 독립 FK도 같은 직렬 체인이라는 전제를 공유한다. 이미지 한 시점의 일치는 전체 동작·충돌·물리적 타당성 보장이 아니다.
|
|
43
43
|
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
# Figure v3: 계층형 3차원 레이아웃 시스템
|
|
2
2
|
|
|
3
|
-
> 현재 구현·검증·제품 연결 상태는 [
|
|
3
|
+
> 현재 구현·검증·제품 연결 상태는 [구현·검증 현황](status.md)을 따른다. 본문의 단계별 연구/검증 기록은 제품 전체 완료 선언이 아니다.
|
|
4
4
|
|
|
5
5
|
> 상태 변경: Flex/Grid 도입을 전제한 **r1 비교안**으로 보존한다. 구현 기준으로 확정하지 않는다.
|
|
6
6
|
> 자동 크기 측정과 Grid 다중 span 배분에 확인된 반례가 있다.
|
|
7
|
-
> 현재 검토 방향은 [최소 실행 모델 r2](
|
|
7
|
+
> 현재 검토 방향은 [최소 실행 모델 r2](minimal-model.md)이며, Flex/Grid는 필수 요구가 아니다.
|
|
8
8
|
|
|
9
9
|
2026-09-20 · 설계 기준안 r1. **제품에 구현/배포된 기능이 아니다.**
|
|
10
|
-
좌표·부착·운동의 하위 수학 계약은 [
|
|
10
|
+
좌표·부착·운동의 하위 수학 계약은 [design.md](design.md).
|
|
11
11
|
이 문서가 컨테이너, 크기 배분, 순환 의존, overflow, 증명 범위를 우선 정의한다.
|
|
12
12
|
CSS 호환 구현을 목표로 하지 않는다. Flex/Grid의 공간 배분 개념을 Figure에 적용한다.
|
|
13
13
|
|
|
@@ -311,7 +311,7 @@ geometry별 feature catalog, 전체 JSON schema, 보수적 수치 증명기, ren
|
|
|
311
311
|
|
|
312
312
|
### 현재 검증 기록
|
|
313
313
|
|
|
314
|
-
실행: `node --test docs/prototypes/
|
|
314
|
+
실행: `node --test docs/prototypes/layout.test.mjs` — 18개 테스트 통과.
|
|
315
315
|
100개 문 폭의 간격/끝점, 800개 seed 고정 제한 배분 조합, fr/auto span,
|
|
316
316
|
회전 정렬/contain, branch 전환, 참조 순서/순환/중복 writer를 검증했다.
|
|
317
317
|
두짝문 travel=W/2라는 이전 예제의 오류를 발견해 (W-gap)/2로 수정했다.
|
|
@@ -9,11 +9,11 @@
|
|
|
9
9
|
| 우선순위 | 근거 | 위험 | 조치/완료 기준 |
|
|
10
10
|
| --- | --- | --- | --- |
|
|
11
11
|
| P1 | things-factory `figure-service/server/service/figure/figure-source.ts`, `figure-mutation.ts` | V3 저장은 별도 경로지만 기존 생성·수정·복원은 V2 parseSource를 사용한다. V3 데이터 전환 뒤 제품 경로가 깨질 수 있다. | 전환 전 저장·발행·복원·AI·썸네일 전체 V3 경로 시험. 이번 점검에서 운영 경로 전환하지 않음. |
|
|
12
|
-
| P1 | things-scene `src/figure/
|
|
13
|
-
| P2 | `src/
|
|
14
|
-
| P2 | `src/
|
|
15
|
-
| P2 | things-scene `src/figure/
|
|
16
|
-
| P2 | `src/index.ts`, `
|
|
12
|
+
| P1 | things-scene `src/figure/figure-rig.ts`의 clipOf | driver ID의 `/` 앞부분을 재생 그룹으로 해석한다. V3 타입은 ID 문자열 형식을 요구하지 않는다. 이름 변경이 동작을 바꿀 수 있다. | 명시적 재생 그룹 계약을 설계하고 소비처와 변환기를 함께 수정. ID는 불투명 식별자. 런타임에서 V2 이름을 추측하는 fallback은 최종 제거. |
|
|
13
|
+
| P2 | `src/asset-types.ts`, `asset.ts`, scene rig | legacyCapability가 V3 정본·평가·렌더러에 남아 있다. 검증된 binding과 혼동되고 유지 비용이 생긴다. | binding으로 재저작하거나 변환 보고서에 보존. 정본에서 제거할 때 fixture·소비처 동시 수정. 단순 삭제로 의미 손실을 숨기지 않음. |
|
|
14
|
+
| P2 | `src/gate.ts` → `mesh-compare.ts` | 제품 검사기가 V2 비교용 코드를 의존한다. 비교용 변경이 제품 판정에 전파된다. | 이번 변경에서 V3 형상 유틸리티를 `shape-sampling.ts`로 분리. migration이 유틸리티를 사용하고 역방향 의존을 금지하는 테스트 추가. |
|
|
15
|
+
| P2 | things-scene `src/figure/figure-real-object.ts` effectiveDepth | depth 생략 시 평면 크기 배율의 기하평균으로 높이를 결정하는 V2 정책이 V3 소비처에 남아 있다. | V3 설계 입력과 씬 크기 매핑 정책을 명시. 자동 기하평균은 V3 보편 규칙으로 취급하지 말 것. 정책 변경 시 기존 배치의 변화 검증. |
|
|
16
|
+
| P2 | `src/index.ts`, `capabilities.ts`, `asset.ts` | 공개 진입점에 V2 변환·비교 API가 섞이고 capability/placement 목록을 V2 types에서 가져온다. | 제품 공통 어휘와 구버전 전용 계약을 분리하고 V3 전용 진입점과 migration 진입점을 설계. 이번 점검에서는 package.json/exports를 변경하지 않음. |
|
|
17
17
|
|
|
18
18
|
## 유지할 것과 격리할 것
|
|
19
19
|
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
# Figure v3 최소 실행 모델 — r2 설계 후보
|
|
2
2
|
|
|
3
|
-
> 현재 구현·검증·제품 연결 상태는 [
|
|
3
|
+
> 현재 구현·검증·제품 연결 상태는 [구현·검증 현황](status.md)을 따른다. 본문의 단계별 연구/검증 기록은 제품 전체 완료 선언이 아니다.
|
|
4
4
|
|
|
5
|
-
> 설계 방향은 [r3 핵심 의미론 기준안](
|
|
5
|
+
> 설계 방향은 [r3 핵심 의미론 기준안](core-semantics.md)으로 대체한다.
|
|
6
6
|
> 이 문서는 과거 가설과 실험 근거로 보존하며 현재 명세와 혼용하지 않는다.
|
|
7
7
|
|
|
8
|
-
> 채택 보류: [선행 연구 검토](
|
|
8
|
+
> 채택 보류: [선행 연구 검토](research-review.md)를 먼저 따른다.
|
|
9
9
|
> 아핀 DAG만 허용하거나 배치/운동 부모를 일치시키는 선택도 비교 검증 전의 가설이다.
|
|
10
|
-
> [실제 샘플 대입 검증](
|
|
10
|
+
> [실제 샘플 대입 검증](sample-validation.md): 컨베이어의 가변 반복을 후속 범위로
|
|
11
11
|
> 미루면 기존 기능을 보존하지 못한다. 실제 단면 feature와 복합 운동 migration도 미완이다.
|
|
12
|
-
> [16종 확대 검증](
|
|
12
|
+
> [16종 확대 검증](sample-validation-expanded.md): 상태 기반 형상 변화(G(d,q)),
|
|
13
13
|
> 원형과 바닥 접촉의 분리, 고정 개수/고정 pitch 반복의 구분도 필수 보완사항이다.
|
|
14
14
|
> 현재의 아핀 치수 + 강체 운동만으로 기존 샘플 전부를 표현한다는 주장은 성립하지 않는다.
|
|
15
|
-
> [공통 커널 실험](
|
|
15
|
+
> [공통 커널 실험](common-kernel-experiment.md): 213개 크기·상태 조합을 실행했다.
|
|
16
16
|
> 반복 배치와 개별 형상 회전 순서, 상태 기반 geometry가 추가 계약으로 드러났다.
|
|
17
17
|
> 부분 모델/proxy 실험이며 최종 명세가 아니다.
|
|
18
18
|
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
#
|
|
1
|
+
# motion contract — joints, parameters, animations
|
|
2
2
|
|
|
3
3
|
Status: **contract, fixed 2026-09-22; revised the same day after the chief architect's review; implemented the
|
|
4
|
-
same day** (ADR-0087 decision 2, ruling 4). Implementation: `src/
|
|
5
|
-
`src/
|
|
4
|
+
same day** (ADR-0087 decision 2, ruling 4). Implementation: `src/graph.ts` (`axis-turn@1`, `axis-slide@1`),
|
|
5
|
+
`src/driver.ts` (`driverValue`, `driverStates`, `validateFigureDrivers`), tests in `src/motion.test.ts`. Every
|
|
6
6
|
consumer uses this contract; none of them defines motion on its own. The review changed three things: the direction of every transform is written down, continuous
|
|
7
7
|
rotation is split into an accumulated amount and a phase, and drivers carry an explicit time convention.
|
|
8
8
|
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
상태: **문헌·소스 검토.** 구현이나 변환 실험은 하지 않았다. 2026-09-25 작성.
|
|
4
4
|
범위: OpenUSD 를 Figure V3 의 개념 기반·이름 정렬 대상·교환 형식으로 쓸 수 있는지. 기준 문서는
|
|
5
|
-
[r3 핵심 의미론](
|
|
6
|
-
`operato-application/adr/ADR-0093.md`, 그리고 이미 들어간 레코드 `src/
|
|
5
|
+
[r3 핵심 의미론](core-semantics.md), [선행 연구 검토](research-review.md)(URDF·USD 는 다루지 않았다),
|
|
6
|
+
`operato-application/adr/ADR-0093.md`, 그리고 이미 들어간 레코드 `src/authoring-actions.ts:52` `FigureJoint`(커밋 `d15c0ba`, 미발행).
|
|
7
7
|
|
|
8
8
|
근거 표기: 본문의 `[S#]` 는 맨 아래 출처 표의 번호다. **모든 URL 의 접근일은 2026-09-25 다.** 출처 표의 「근거」 열은
|
|
9
9
|
원문(파일 원문을 직접 읽음) · 페이지 요약(웹 페이지를 요약 도구로 읽음) · 검색 요약(검색 결과 문단만 봄)으로 나눈다.
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
## 결론
|
|
13
13
|
|
|
14
14
|
1. **(a) 개념 기반으로 삼지 않는다.** USD 는 평가가 끝난 값(숫자·time sample)을 합성한다. V3 정본의 중심인 「설계 입력의 식으로 정해지는 치수·pivot·반복 개수」, feature 기준 부착, occupancy, capability 를 담는 구조가 없다. 식을 계산하는 OpenExec 는 25.08 preview 이고 계산은 C++ 로 schema 에 등록해야 하며 장면 파일에 식을 적을 수 없다. 26.08 의 rig 기능도 "not yet ready for production use" 다 [S15][S20]. variable expression 은 asset path·variant 선택에만 쓰이고 산술이 없다 [S21].
|
|
15
|
-
2. **(b) 이름·모양은 비용이 작은 곳에서 맞춘다.**
|
|
15
|
+
2. **(b) 이름·모양은 비용이 작은 곳에서 맞춘다.** joint 레코드는 이미 UsdPhysics 의 양쪽 frame 구조와 같다(부모 feature+origin ↔ `body0`+`localPos0/localRot0`, 자식 feature ↔ `body1`+`localPos1/localRot1`). limit 필드 이름·각도 단위·축 토큰·mimic 부호 규약을 발행 전에 정한다(아래 ADR-0093 권고 R1–R7).
|
|
16
16
|
3. **(c) USD 는 교환 형식으로 쓴다. export 먼저, import 는 URDF 뒤에.** export 는 설계 입력을 평가한 스냅샷을 `usda` 로 쓴다(UsdGeom + UsdPhysics + UsdPreviewSurface, `metersPerUnit = 0.001`, `upAxis = "Y"`). import 한 자산은 모든 치수가 상수인 V3 자산이 된다.
|
|
17
17
|
4. **USD 가 담지 못하는 V3 의 것:** 설계 입력 식, 식을 따르는 joint pivot·travel, 길이를 채우는 반복의 개수 계산, 이름 있는 feature, occupancy, capability, 관계 검사(assertion). **V3 에 없고 USD 에 있는 것:** layer 합성과 비파괴 override, variantSet, payload, 교환 가능한 instancing(scenegraph instancing·PointInstancer), 질량·충돌·drive·articulation root, time sample, 표준 재질(UsdPreviewSurface·MaterialX), Omniverse·Isaac Sim·Siemens 등의 도구 생태계 [S1][S6].
|
|
18
18
|
5. **표준 상태:** AOUSD Core Spec 1.0.1(2025-12-12)은 데이터 모델·합성·`usda/usdc/usdz` 만 규정하고 Geometry·Materials·Physics 는 별도 규격으로 작성 중이다 [S2][S3]. UsdPhysics 이름은 OpenUSD 코드(21.08 부터)가 기준이다. mimic 은 UsdPhysics 에 없고 PhysX·Newton 확장에 부호가 다른 식으로 있다 [S14][S16][S19].
|
|
@@ -50,9 +50,9 @@
|
|
|
50
50
|
|
|
51
51
|
## 2. ADR-0093 joint 레코드 · UsdPhysics · URDF 필드 대조
|
|
52
52
|
|
|
53
|
-
V3 열은 ADR-0093 본문과 구현된 `
|
|
53
|
+
V3 열은 ADR-0093 본문과 구현된 `FigureJoint`(`src/authoring-actions.ts:52-76`)를 함께 적었다.
|
|
54
54
|
|
|
55
|
-
| 뜻 |
|
|
55
|
+
| 뜻 | (ADR-0093 / `FigureJoint`) | UsdPhysics [S14] | URDF [S18] | 판정 |
|
|
56
56
|
|---|---|---|---|---|
|
|
57
57
|
| 이름 | `id: string` | prim 이름(경로) | `joint@name` | USD 이름 규칙 때문에 매핑 필요 (R6) |
|
|
58
58
|
| 종류 | `fixed·revolute·continuous·prismatic` | `PhysicsFixedJoint`, `PhysicsRevoluteJoint`, `PhysicsPrismaticJoint` (+ Spherical, Distance, D6=`PhysicsJoint`) | `fixed·revolute·continuous·prismatic` (+ floating, planar) | 그대로. continuous → Revolute, limit ±inf |
|
|
@@ -71,7 +71,7 @@ V3 열은 ADR-0093 본문과 구현된 `V3Joint`(`src/v3-authoring-actions.ts:52
|
|
|
71
71
|
### ADR-0093 발행 전 권고
|
|
72
72
|
|
|
73
73
|
- **R1. `limit: {min, max}` → `limit: {lower, upper}`.** URDF `lower/upper` 와 UsdPhysics `lowerLimit/upperLimit` 가 같은 낱말을 쓴다. 미발행이라 이름 변경 비용이 지금 가장 작다.
|
|
74
|
-
- **R2. 각도 단위를 ADR 에 명시하고 r3 와 맞춘다.** r3 §4 는 저장 단위를 rad 로 정했고 "실험 커널의 deg 숫자는 이 계약을 구현한 것이 아니다"라고 적었다. ADR-0093 과 `
|
|
74
|
+
- **R2. 각도 단위를 ADR 에 명시하고 r3 와 맞춘다.** r3 §4 는 저장 단위를 rad 로 정했고 "실험 커널의 deg 숫자는 이 계약을 구현한 것이 아니다"라고 적었다. ADR-0093 과 `FigureJoint` 는 `limit`·`origin.turn`·continuous 위상(−180..180)에 deg 를 쓴다. UsdPhysics 는 deg [S13], URDF 는 rad [S18]. 어느 쪽이든 export 는 곱셈 하나다. 권고는 r3 를 따라 rad 로 저장하는 것이다. deg 를 유지하려면 r3 §4 를 먼저 고친다.
|
|
75
75
|
- **R3. 축은 부호 없는 `X|Y|Z` 로 유지하고, 방향 반전은 `origin.turn` 으로 표현한다고 ADR 에 적는다.** UsdPhysics `physics:axis` 가 같은 토큰 셋이다. URDF export 는 `(1,0,0)` 같은 단위벡터로 쓴다.
|
|
76
76
|
- **R4. URDF/USD import 의 임의 회전을 어떻게 받을지 발행 전에 정한다.** `origin.turn` 은 quarter-turn 만 받는다. URDF `origin rpy` 와 `axis xyz` 는 임의 값이고 USD `localRot0/1` 도 임의 quaternion 이다. 둘 중 하나: (가) origin 에 일반 회전(각도 식 또는 quaternion)을 추가, (나) 축 정렬되지 않은 joint 는 이유를 밝히고 import 를 거절. ADR §5 가 URDF import 를 약속하므로 레코드 모양에 영향이 있다.
|
|
77
77
|
- **R5. mimic 은 `{joint, multiplier, offset}` 그대로 두고 세 가지를 ADR 에 적는다.** ① `offset` 단위는 따르는 joint 의 단위다(NewtonMimicAPI 와 같음 [S19]). ② 리더와 따르는 joint 는 같은 운동 종류여야 한다(Newton 은 같은 joint type 을 요구 [S19]; revolute·continuous 는 USD 에서 둘 다 Revolute). ③ PhysX export 는 `gearing = −multiplier`, `offset = −offset` 로 부호를 바꾸고, PhysX 는 mimic 에 쓰이는 joint 에 유한 limit 을 요구한다 [S16][S29].
|
|
@@ -117,7 +117,7 @@ V3 열은 ADR-0093 본문과 구현된 `V3Joint`(`src/v3-authoring-actions.ts:52
|
|
|
117
117
|
- UsdPhysics 는 21.08 에 처음 들어갔다 [S15]. schema 원문 기준 이름은 §2 표와 같다 [S14]. joint 속성은 `rel physics:body0/body1`, `point3f physics:localPos0/localPos1`, `quatf physics:localRot0/localRot1`, `bool physics:jointEnabled`(true), `bool physics:collisionEnabled`(false), `uniform bool physics:excludeFromArticulation`, `float physics:breakForce/breakTorque`(inf).
|
|
118
118
|
- Revolute·Prismatic: `uniform token physics:axis`(`"X"|"Y"|"Z"`, 기본 `"X"`), `float physics:lowerLimit/upperLimit` (revolute 는 deg, prismatic 은 distance). Spherical: `physics:axis`, `physics:coneAngle0Limit`, `physics:coneAngle1Limit`. Distance: `physics:minDistance`, `physics:maxDistance`. 기본 `PhysicsJoint` 는 6 자유도 모두 풀린 D6 이다 [S14].
|
|
119
119
|
- `PhysicsLimitAPI:<dof>`(`physics:low`, `physics:high`)와 `PhysicsDriveAPI:<dof>`(`physics:type` = force|acceleration, `maxForce`, `targetPosition`, `targetVelocity`, `damping`, `stiffness`)는 multiple-apply 이고 dof 이름은 `transX, transY, transZ, rotX, rotY, rotZ, distance` [S14].
|
|
120
|
-
- frame: joint frame 은 두 body 각각에 대해 정의되며 world 에서 꼭 일치할 필요는 없다(시뮬레이터가 오차를 허용) [S13]. body 의 위치는 body prim 자신의 xformOp 가 정한다. Newton 문서는 URDF joint origin 을 「자식 link 의 xformOp」와 「joint 의 `localPos0/localRot0`」 두 곳에 쓰라고 한다 [S18]. **UsdPhysics joint 는 두 body 사이의 제약을 표현하고, 배치는 body 의 xform 이 정한다.**
|
|
120
|
+
- frame: joint frame 은 두 body 각각에 대해 정의되며 world 에서 꼭 일치할 필요는 없다(시뮬레이터가 오차를 허용) [S13]. body 의 위치는 body prim 자신의 xformOp 가 정한다. Newton 문서는 URDF joint origin 을 「자식 link 의 xformOp」와 「joint 의 `localPos0/localRot0`」 두 곳에 쓰라고 한다 [S18]. **UsdPhysics joint 는 두 body 사이의 제약을 표현하고, 배치는 body 의 xform 이 정한다.** export 는 평가한 자세로 body xform 을 쓰고, joint frame 을 그 자세와 일치하게 쓴다.
|
|
121
121
|
- articulation: `PhysicsArticulationRootAPI` 를 fixed base 는 world 와 잇는 fixed joint(또는 조상)에, floating base 는 루트 link 에 둔다. link 마다 들어오는 joint 는 하나, tree 여야 하며 폐루프는 한 joint 에 `excludeFromArticulation` 을 켠다 [S16]. 중첩 강체(body 안의 body)는 25.11 에 표준으로 들어왔다 [S15].
|
|
122
122
|
- **mimic:** UsdPhysics 에 없다 [S13][S18]. PhysX: `PhysxMimicJointAPI:<axis>` 의 `rel physxMimicJoint:<axis>:referenceJoint`, `physxMimicJoint:<axis>:referenceJointAxis`, `gearing`, `offset`, `naturalFrequency`, `dampingRatio`, 식 `q + gearing·q_ref + offset = 0`, articulation 안의 joint 에만 [S16][S17]. Newton(`newton-usd-schemas` v0.4.1, 2026-07-30): `NewtonMimicAPI` 의 `bool newton:mimicEnabled`, `rel newton:mimicJoint`, `float newton:mimicCoef0`(offset), `float newton:mimicCoef1`(배율), 식 `joint0 = coef0 + coef1·joint1`, 같은 joint type 끼리만 [S19]. Newton 변환기 문서는 관계 이름을 `newton:target` 으로 적었으나 schema 원문은 `newton:mimicJoint` 다 [S18][S19].
|
|
123
123
|
|
|
@@ -138,7 +138,7 @@ V3 열은 ADR-0093 본문과 구현된 `V3Joint`(`src/v3-authoring-actions.ts:52
|
|
|
138
138
|
|
|
139
139
|
- `UsdPreviewSurface` 규격 2.6. 입력: `diffuseColor`(0.18 회색), `emissiveColor`, `useSpecularWorkflow`, `specularColor`, `metallic`(0), `roughness`(0.5), `clearcoat`, `clearcoatRoughness`, `opacity`(1), `opacityMode`, `opacityThreshold`, `ior`(1.5), `normal`, `displacement`, `occlusion`. 목적은 플랫폼 간 교환용 기본 재질이다. geometry 와는 `material:binding` 관계로 묶는다 [S22].
|
|
140
140
|
- MaterialX 는 `UsdMtlx` 로 USD 에서 읽는다. USD 25.05 부터 MaterialX 1.39.3 이 기본이며 OpenPBR 을 쓸 수 있다 [S23, 검색 요약].
|
|
141
|
-
- 팔레트 대응:
|
|
141
|
+
- 팔레트 대응: `palette: Record<token, color>`(`src/asset-types.ts:182`) → 쓰인 토큰마다 `/Looks/<token>` 의 `Material` + `UsdPreviewSurface`, `diffuseColor` 에 색, 나머지는 기본값. part 마다 `material:binding`. 토큰 이름도 PrimName 규칙을 따라야 한다(R6 과 같은 매핑).
|
|
142
142
|
|
|
143
143
|
### 3.8 브라우저에서 USD 읽고 쓰기
|
|
144
144
|
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
# V3 연산·형상 계약 — 첫 실행 가능한 subset
|
|
2
2
|
|
|
3
|
-
> 현재 구현·검증·제품 연결 상태는 [
|
|
3
|
+
> 현재 구현·검증·제품 연결 상태는 [구현·검증 현황](status.md)을 따른다. 본문의 단계별 연구/검증 기록은 제품 전체 완료 선언이 아니다.
|
|
4
4
|
|
|
5
|
-
후속: [좌표계 타입과 공간 의존 그래프 통합](
|
|
5
|
+
후속: [좌표계 타입과 공간 의존 그래프 통합](spatial-contracts.md).
|
|
6
6
|
아래는 최초 scalar 단계의 기록이며, 현재 확장 범위는 후속 문서를 따른다.
|
|
7
7
|
|
|
8
|
-
[r3 핵심 의미론](
|
|
8
|
+
[r3 핵심 의미론](core-semantics.md)을 구현하는 첫 단계다.
|
|
9
9
|
상태: scalar 컴파일러 실험. 정식 V3 전체 schema나 제품 runtime이 아니다.
|
|
10
10
|
시스템 설계 절차에 따라 정적 오류, 입력 의존 오류, 미지원 기능을 구분했다.
|
|
11
11
|
|
|
12
12
|
## 1. 실행 구조
|
|
13
13
|
|
|
14
|
-
`docs/prototypes/
|
|
15
|
-
기존 무단위 `
|
|
14
|
+
`docs/prototypes/typed-plan.mjs`는 `compile(source)`와 그 결과의 `evaluate(inputs)`를 제공한다.
|
|
15
|
+
기존 무단위 `kernel.mjs`와 독립이다. 아직 두 엔진을 연결하지 않았다.
|
|
16
16
|
|
|
17
17
|
```text
|
|
18
18
|
저작 선언 → 구조/단위/출력 소유권/참조/cycle 검사 → 불변 snapshot 실행 계획
|
|
@@ -152,7 +152,7 @@ UI에서는 연산 id를 부품/의도 이름으로 연결하고 수정할 입
|
|
|
152
152
|
## 7. 실행 증거
|
|
153
153
|
|
|
154
154
|
```sh
|
|
155
|
-
node --test docs/prototypes/
|
|
155
|
+
node --test docs/prototypes/typed-plan.test.mjs
|
|
156
156
|
```
|
|
157
157
|
|
|
158
158
|
9개 검사 통과:
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
# 적재물 대 모델 전체 부품 충돌 검사 — 실험 v1
|
|
2
2
|
|
|
3
|
-
> 현재 구현·검증·제품 연결 상태는 [
|
|
3
|
+
> 현재 구현·검증·제품 연결 상태는 [구현·검증 현황](status.md)을 따른다. 본문의 단계별 연구/검증 기록은 제품 전체 완료 선언이 아니다.
|
|
4
4
|
|
|
5
5
|
## 범위
|
|
6
6
|
|
|
7
|
-
[실행 코드](prototypes/
|
|
7
|
+
[실행 코드](prototypes/payload-collision.mjs)는 공간/접촉 검사 결과에 별도 collision 판정을 더한다. **현재 상태의 payload 대 모든 모델 부품**을 검사한다. 모델 부품 상호 간 충돌, 다른 외부 자산, 움직이는 경로 전체의 연속 충돌, 물리 안정성은 범위 밖이다. 따라서 '전역 충돌 완성'이라고 부르지 않는다.
|
|
8
8
|
|
|
9
9
|
접촉 대상으로 선언된 포크도 충돌 검사에서 제외하지 않는다. 면 접촉과 내부 관통을 구분한다. 기존 geometry·capability 선언·제품 서버는 바꾸지 않는다.
|
|
10
10
|
|
|
@@ -26,7 +26,7 @@ OBB(회전 상자) 간 정적 분리축 검사(SAT)를 사용한다. 양쪽 상
|
|
|
26
26
|
|
|
27
27
|
## 검증
|
|
28
28
|
|
|
29
|
-
[테스트](prototypes/
|
|
29
|
+
[테스트](prototypes/payload-collision.test.mjs):
|
|
30
30
|
|
|
31
31
|
- 분리/접촉/관통/완전 포함, 허용 오차 경계, AABB가 겹치지만 OBB는 분리된 경우.
|
|
32
32
|
- 일반적인 3D 회전의 결정적 난수 **1,000쌍**을 기존 Three.js OBB 구현과 대조: 교차174·분리826, 전부 일치. 두 구현은 같은 SAT 원리를 사용하므로 수학적 전 범위 증명이 아니다.
|
|
@@ -35,7 +35,7 @@ OBB(회전 상자) 간 정적 분리축 검사(SAT)를 사용한다. 양쪽 상
|
|
|
35
35
|
- 둥근 본체의 경계 내부에 들어가는 작은 payload는 자동 통과하지 않고 미검증.
|
|
36
36
|
- 잘못된 OBB·정규직교 위반과 거의 평행한 축의 수치 불확실성을 검증.
|
|
37
37
|
|
|
38
|
-
Chrome에서 `--collision` 실험 화면으로 정상 배치·상단 포크 관통·공중 부유·둥근 본체 내부 배치를 직접 확인했다. 접촉과 충돌 결과를 따로 표시하며 관통한 box 부품을 붉게 표시한다. 작은 적재물이 불투명 본체 안에 가려지는 사례도 있으므로 스크린샷만으로 비충돌을 판정하지 않는다. 임시 이미지: `/private/tmp/figure-
|
|
38
|
+
Chrome에서 `--collision` 실험 화면으로 정상 배치·상단 포크 관통·공중 부유·둥근 본체 내부 배치를 직접 확인했다. 접촉과 충돌 결과를 따로 표시하며 관통한 box 부품을 붉게 표시한다. 작은 적재물이 불투명 본체 안에 가려지는 사례도 있으므로 스크린샷만으로 비충돌을 판정하지 않는다. 임시 이미지: `/private/tmp/figure-full-collision.png`.
|
|
39
39
|
|
|
40
40
|
## 남은 구현
|
|
41
41
|
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
# 적재물 공간·평면 접촉 검사 — 실험 v1
|
|
2
2
|
|
|
3
|
-
> 현재 구현·검증·제품 연결 상태는 [
|
|
3
|
+
> 현재 구현·검증·제품 연결 상태는 [구현·검증 현황](status.md)을 따른다. 본문의 단계별 연구/검증 기록은 제품 전체 완료 선언이 아니다.
|
|
4
4
|
|
|
5
5
|
## 구현 범위
|
|
6
6
|
|
|
7
|
-
[검사 코드](prototypes/
|
|
7
|
+
[검사 코드](prototypes/payload-fit.mjs)는 기존 capability compiler를 내부에서 실행한다. 외부에서 조작한 표면 결과를 받아 인증하지 않는다. 이번 단계에서 지원하는 것은 **상자 적재물 바닥과 box 부품의 top 평면**이다. 전체 물리·충돌·안전성 solver는 아니다.
|
|
8
8
|
|
|
9
9
|
입력은 binding ID, 물체 종류와 점유 snapshot, 양의 상자 치수(mm), binding 좌표계 기준 중심(mm), Y축 회전각(deg)이다. 기울어진 적재물, 임의 메시, 곡면 받침, 파지 접촉은 이 검사 범위 밖이다. 모든 추가 필드와 잘못된 값은 거부한다.
|
|
10
10
|
|
|
@@ -37,7 +37,7 @@ binding의 centered-box region이 있을 때만 검사한다. 회전된 payload
|
|
|
37
37
|
|
|
38
38
|
## 검증 결과
|
|
39
39
|
|
|
40
|
-
[테스트](prototypes/
|
|
40
|
+
[테스트](prototypes/payload-fit.test.mjs):
|
|
41
41
|
|
|
42
42
|
- 포크 길이3 × 상승3 × 내밈3 × 적재물 yaw3 = **81개 상태**의 양쪽 포크 접촉.
|
|
43
43
|
- 회전0에서는 포크 하나당 교차 면적 `90 × forkLength`mm²와 일치.
|
|
@@ -47,10 +47,10 @@ binding의 centered-box region이 있을 때만 검사한다. 회전된 payload
|
|
|
47
47
|
- 충돌 가능성이 있는 높은 물체에서도 충돌/안전성은 미검증을 유지.
|
|
48
48
|
- 입력 오류·모델 불변성·오류 후 재평가 검사.
|
|
49
49
|
|
|
50
|
-
`node docs/prototypes/render-full-dryroom.mjs --payload`로 네 상태(정상 접촉·150mm 부유·20mm 관통·포크 사이)를 Chrome에서 렌더링하고 직접 확인했다. 임시 이미지: `/private/tmp/figure-
|
|
50
|
+
`node docs/prototypes/render-full-dryroom.mjs --payload`로 네 상태(정상 접촉·150mm 부유·20mm 관통·포크 사이)를 Chrome에서 렌더링하고 직접 확인했다. 임시 이미지: `/private/tmp/figure-full-payload.png`. 제품 서버/DB의 실제 자산을 편집하지 않았다.
|
|
51
51
|
|
|
52
52
|
## 다음 게이트
|
|
53
53
|
|
|
54
54
|
이 접촉 검사기는 사각 평면과 상자만 대상으로 한다. 반복 요소의 표면 참조는 별도 모듈에서 구현했다. 곡면·rounded profile·임의 메시 및 부분 접촉 정책, 일반적인 전역 충돌·안정성, 제품 UI·AI·저장 통합은 남아 있다. 이 검사 결과만으로 '적재 가능'이나 '안전'으로 표시하면 안 된다.
|
|
55
55
|
|
|
56
|
-
후속 단계로 [payload 대 모든 부품의 충돌 검사](
|
|
56
|
+
후속 단계로 [payload 대 모든 부품의 충돌 검사](payload-collision-validation.md)를 별도 추가했다. 상자 쌍은 정밀 OBB 검사, 곡면은 보수적 경계 검사 후 미검증으로 분리한다. 기존 접촉 검사기만 호출하면 충돌은 여전히 미검증이다.
|