トラックの荷台に荷物を最適に配置するための3Dシミュレーションシステムです。
- 荷台3D表示: OBJファイルを使用した荷台の3Dモデル表示
- AI寸法抽出: さくらのAI Engine (Qwen3-VL) を使用して画像から荷物の寸法を自動抽出
- 荷物配置計算: 外部APIと連携した最適配置計算
- 積み込み順序可視化: スライダーで積み込み順序をシミュレーション
Frontend (Next.js + React Three Fiber)
│
▼
Backend (Hono + PostgreSQL + Prisma)
│
├─▶ さくらのAI Engine (画像→寸法抽出)
│
└─▶ 外部配置計算API (配置最適化)
| レイヤー | 技術 |
|---|---|
| Frontend | Next.js 16, React Three Fiber, TailwindCSS |
| Backend | Hono, Prisma, PostgreSQL |
| 3D | Three.js, OBJLoader |
| AI | さくらのAI Engine (Qwen3-VL-30B-A3B-Instruct) |
| パッケージ管理 | pnpm (monorepo) |
pnpm installDATABASE_URL="postgresql://postgres:password@localhost:5432/hannals"
SAKURA_API_KEY="your-sakura-api-key"
EXTERNAL_API_URL="http://localhost:5000"
PORT=8080NEXT_PUBLIC_API_URL="http://localhost:8080"# PostgreSQLを起動(Docker使用時)
docker-compose up -d
# マイグレーション実行
cd packages/backend
npx prisma migrate dev# ルートディレクトリで実行(frontend + backend 同時起動)
pnpm dev- Frontend: http://localhost:3000
- Backend: http://localhost:8080
- 「荷台を選択」→「新しい荷台を登録」
- 写真から作成: 荷台の写真をアップロード → AIで寸法抽出 → OBJ自動生成
- OBJファイル: 3DモデルのOBJ/MTLファイルを直接アップロード
- 「画像から荷物追加」ボタンをクリック
- 荷物の写真をアップロード
- 「AIで寸法を抽出」ボタンで自動抽出
- 必要に応じて寸法を手動で編集
- 「この荷物リストを使用」で確定
- 荷台を選択
- 荷物を追加
- 「荷物を配置」ボタンで配置計算実行
- スライダーで積み込み順序を確認
hannals/
├── docker-compose.yml
├── pnpm-workspace.yaml
├── docs/
│ └── SPECIFICATION.md # 詳細仕様書
└── packages/
├── backend/
│ ├── src/
│ │ ├── index.ts
│ │ ├── routes/
│ │ │ ├── trucks.ts # 荷台API
│ │ │ ├── placements.ts # 配置API
│ │ │ └── dimensions.ts # AI寸法抽出API
│ │ └── lib/
│ │ ├── prisma.ts
│ │ ├── objGenerator.ts
│ │ └── mockItemGenerator.ts
│ ├── prisma/
│ │ └── schema.prisma
│ └── uploads/
└── frontend/
└── src/
├── app/
│ └── page.tsx
├── components/
│ ├── CargoViewer.tsx
│ ├── TruckSelector.tsx
│ ├── TruckUploader.tsx
│ ├── ImageDimensionExtractor.tsx
│ ├── OrderSlider.tsx
│ └── ItemsSidebar.tsx
└── types/
└── index.ts
| Method | Endpoint | 説明 |
|---|---|---|
| GET | /api/trucks |
荷台一覧取得 |
| POST | /api/trucks |
荷台登録 |
| DELETE | /api/trucks/:id |
荷台削除 |
| Method | Endpoint | 説明 |
|---|---|---|
| POST | /api/placements |
配置計算実行 |
| GET | /api/placements/:id |
配置結果取得 |
| POST | /api/placements/mock/generate |
モックデータ生成 |
| POST | /api/placements/mock/calculate |
モックデータで配置計算 |
| Method | Endpoint | 説明 |
|---|---|---|
| POST | /api/dimensions/extract |
画像から寸法抽出 |
| POST | /api/dimensions/generate-obj |
寸法からOBJ生成 |
{
"items": [
{
"id": "A001",
"x_mm": 600,
"y_mm": 400,
"z_mm": 300,
"order": 1,
"weight_kg": 12.5,
"fragile": false,
"rot_xy": true
}
]
}| フィールド | 型 | 説明 |
|---|---|---|
| id | string | 荷物ID |
| x_mm | number | 幅(mm) |
| y_mm | number | 奥行き(mm) |
| z_mm | number | 高さ(mm) |
| order | number | 積み込み順 |
| weight_kg | number | 重量(kg) |
| fragile | boolean | 壊れ物フラグ |
| rot_xy | boolean | 水平回転可能 |
- X: 幅
- Y: 奥行き
- Z: 高さ
- X: 幅
- Y: 高さ
- Z: 奥行き
※ CargoViewerで自動変換(X軸で-90度回転)
テスト用のサンプルデータを公開しています:
- 荷台の3Dモデル(OBJファイル)
- 荷物の写真サンプル
- テスト用寸法データ
MIT