前回、AIの寸法ミスでスピーカーの板が足りなかった話を書きました。
あの経験から、寸法をAI任せにせず切る前に検証できる仕組みが欲しくなりました。それに加えて、今まではホームセンターにすべて木をカットしてもらっていたのを、自分でも切ってみたくなって丸ノコを買いました。そうなると、サブロク板(3尺×6尺、910×1820mm)が何枚必要か、どう切れば無駄なく材料をまかなえるか、を自分で考える必要が出てきます。
「アプリにしたら便利じゃね?」と思って、Flutterで作り始めました。
最初はAR機能だった
最初に作ったのは、スマホのカメラで板を映すと、切り取り線がその場に重なって表示される機能でした。
4隅をタップして原板の位置を合わせると、「天板・底板 400×400」「側板 400×360」といったパーツの区画が、カメラ越しの板の上にそのまま浮かんで見えます。傾いた角度から見ても線がちゃんと板に貼り付くところまでは動きました。
でも、使わなくなった
サブロク板は910×1820mmあります。4隅をタップして位置合わせをするには、板の両端が画面に収まるところまで自分自身が下がらないといけません。実際の作業スペースでそこまで距離を取るのは現実的ではなく、使いにくいと感じました。結局、紙に木取り図を印刷して現場に持っていくのと変わらない。動かしてみて初めて「これは使わない」と判断できました。
今の形
代わりに今のアプリがやっているのは、原板のサイズとパーツの寸法を入力すると、木取りレイアウト図を画面に描く、というシンプルな形です。
このレイアウト図どおりに、実際の板へ寸法を手で書き写しました。
3Dで組み立てを確認する機能も作った
木取りレイアウト図とは別に、切る前に組み立てた見た目を確認できる機能も作りました。これも「寸法をAI任せにせず、切る前に検証する」ための機能の一つです。
まず正面・上面・側面の2D固定ビューで、パーツをドラッグして配置します。位置がぴったり揃うと赤い線が出ます。
配置が終わると、3Dで組み立てた状態を確認できます。
計算方法はシンプルです。パーツを高さの降順に並べ、既存の列に収まればそこに詰め、収まらなければ新しい列を作る——ファーストフィット・ディクリース法という、ビンパッキング問題でよく使われるアルゴリズムです。のこ刃の厚み(3mm)も差し引いて計算しています。
この3D表示、実は外部パッケージを一切使っていません。CustomPainterとdart:math(Dartの標準ライブラリ)だけで、回転行列と透視投影を自前で計算してポリゴンを描いています。アプリ全体の依存パッケージもshared_preferences(データ保存用)とcupertino_iconsくらいで、3D関連のライブラリは最初から入れていません。
組み立て前に立体的なイメージが持てるのは大きいのですが、正直、操作性にはまだ課題があります。
実際に組んだもの
このレイアウトで切り出したパーツから、midボックスを組みました。
P.S. この記事もAIが書いています
skillでClaude Codeが書いています。
次回
スピーカー作りにハマって気づいたら5台。山になった端材をどうにかしたくて作った「端材アイデア」機能の話。













