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.
3.8 KiB
Physical Motion Fix Report
Причины предыдущего хаоса
Ранее движение товара рассчитывалось независимо по осям с использованием интерполяции между хардкодными точками, что приводило к телепортации или "зависанию" объектов (в том числе над корзиной). Также отсутствовала система хранения объектов после завершения их этапа маршрутизации. Указанные в ModelAssets STL-модели загружались, но отображались некорректно. Из-за отсутствия независимой физической модели каждый фрейм пытался обновлять позиции локально.
Решение
- Создана
physicalItemMotion.ts— единая физико-кинематическая модельgetPhysicalItemPose. Она гарантирует детерминированное вычисление[x,y,z]и вращения на основеelapsedMs, отсчитанного от момента спавна товара, а такжеCONVEYOR_SPEED_MPS(1 м/с). - Синхронизация ленты и товара: Время и расстояние на ленте точно соответствуют
d = 1.0 \times t. Движущаяся текстура ленты использует эту же скорость. - Хранение (settled) элементов: В
SorterDigitalTwinContinuous.tsxтеперь рендерятся все созданные (spawned) объекты за последние 20 циклов. Объекты попадают в корзинуCилиDпо желобу (chute), меняя высоту, и остаются там (isSettled). - 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.pngbelt_sync_t0.pngbelt_sync_t1.pngitem_on_belt_no_flying.pngroute_to_c_chute.pngitem_settled_in_c_cage.pngroute_to_d_chute.pngitem_settled_in_d_cage.pngno_overlay_overlap.pngdemo_complete_items_not_chaotic.png
Ограничения: slotIndex использует простую матричную сетку 3xN, что при сильном переполнении корзины может вызвать небольшие наложения (clipping) STL-моделей друг на друга, но это визуально приемлемо и объекты остаются строго внутри корзины.