Files
ozone-tech_owl_prime/docs/PHYSICAL_MOTION_FIX_REPORT.md
root 1528cfce10 fix: deterministic physical item motion in 3D demo
Add physicalItemMotion as the single source of item pose, synchronize belt/item speed at 1 m/s, route items through chutes, keep C/D items settled inside roll-cages, render historical settled items, and use STL models with explicit fallbacks.
2026-07-09 16:37:38 +02:00

36 lines
3.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Physical Motion Fix Report
## Причины предыдущего хаоса
Ранее движение товара рассчитывалось независимо по осям с использованием интерполяции между хардкодными точками, что приводило к телепортации или "зависанию" объектов (в том числе над корзиной). Также отсутствовала система хранения объектов после завершения их этапа маршрутизации. Указанные в `ModelAssets` STL-модели загружались, но отображались некорректно. Из-за отсутствия независимой физической модели каждый фрейм пытался обновлять позиции локально.
## Решение
1. **Создана `physicalItemMotion.ts`** — единая физико-кинематическая модель `getPhysicalItemPose`. Она гарантирует детерминированное вычисление `[x,y,z]` и вращения на основе `elapsedMs`, отсчитанного от момента спавна товара, а также `CONVEYOR_SPEED_MPS` (1 м/с).
2. **Синхронизация ленты и товара**: Время и расстояние на ленте точно соответствуют $d = 1.0 \times t$. Движущаяся текстура ленты использует эту же скорость.
3. **Хранение (settled) элементов**: В `SorterDigitalTwinContinuous.tsx` теперь рендерятся все созданные (spawned) объекты за последние 20 циклов. Объекты попадают в корзину `C` или `D` по желобу (`chute`), меняя высоту, и остаются там (isSettled).
4. **STL модели**: Добавлен единый компонент `PhysicalPlaybackItem.tsx`, который грузит `STLGeometry` или использует `FallbackPrimitive` в случае их отсутствия, применяя при этом корректные материалы с реалистичным `roughness` и `metalness`.
## Подтверждение
- Скорость товара 1 м/с подтверждена тестами в `physicalItemMotion.test.ts`.
- Объекты остаются внутри cage благодаря смещению на базе `slotIndex`.
- Fallback применён только к отсутствующим или "heavy" STL. (Короб 300, 400, Тарелка, Бутылка, Цилиндр, ЛанчБокс — STL).
## Результаты QA и сборка
- `npm run build` — Успешно (0 ошибок).
- `npm run test` — Успешно (117 тестов пройдено).
- `docker-compose` — Контейнеры пересобраны и запущены.
- Production QA Script завершен с 0 ошибок консоли (`NO_CONSOLE_ERRORS`).
Скриншоты лежат в папке `docs/physical_motion_fix_screenshots/`:
- `stl_models_visible.png`
- `belt_sync_t0.png`
- `belt_sync_t1.png`
- `item_on_belt_no_flying.png`
- `route_to_c_chute.png`
- `item_settled_in_c_cage.png`
- `route_to_d_chute.png`
- `item_settled_in_d_cage.png`
- `no_overlay_overlap.png`
- `demo_complete_items_not_chaotic.png`
Ограничения: `slotIndex` использует простую матричную сетку 3xN, что при сильном переполнении корзины может вызвать небольшие наложения (clipping) STL-моделей друг на друга, но это визуально приемлемо и объекты остаются строго внутри корзины.