引越と家具配置計画をデジタルエンジニアリングしてみた

## 1. はじめに
新居に引越しを準備中のころ、「<a href="https://note.com/iwamah1/n/n581a98df29ca">引っ越し作業にiPhone3Dスキャンを活用したら滅茶苦茶捗った話</a>」といったNote記事に出会い、これは試さねばと思いたったのが始まり。
Unityにこだわりがあったので、Unityを活用して引越と家具配置計画をデジタルエンジニアリングしてみた。
想像以上にやってみて楽しかったのと、新居に移る前に数多くの試行のもと家具選定を事前に実施でき、実用上もバッチリだったので、その際のLessons Learnedを記事に残してみます。
引越後の今、やはりこのプロセスは有益であったと実体験から実感中。

## 2. やったこと
① iPad Proで新居を隈なくスキャン
② Unity上で新居を再構築
③ ほしい家具をたくさん配置
④ デジタル空間を探検して仕上がり確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234352/c8d912fc-efd2-ad3d-08ee-c2eeaac60464.png)
<p class="text-center">Fig1. 成果物イメージ（1LD部分のみ表示）</p>

## 3. 準備
<b>・iPad Pro（Lidar搭載）</b>
新居のデジタル化を行うために、iPad Pro（Lidar搭載）で利用可能な<a href="https://apps.apple.com/jp/app/scaniverse-3d-scanner/id1541433223">3D Scanner App</a>を使用しました。これは新居の全体スキャンのために活用。これによりかなり精度良く寸法も記録できます。後述の<a href="https://scaniverse.com/">Scaniverse</a>のLidarなしでのスキャンでもある程度部屋の形状は取得できるものの、やはりLidarありでないと、部屋の角などが崩れてしまうので、部屋自体のスキャンにはLidarありが推奨。

<b>・iPhone（Lidar非搭載）</b>
ラフな家具モデルを生成するために活用です。Lidar搭載のiPhoneがなくとも、<a href="https://scaniverse.com/">Scaniverse</a>を用いることで、NiantecのManyDepth技術によりカメラ画像のみから3Dモデルの構築がなされます。新居モデルではありながらも、形状、寸法は十分なため、ほしい家具、前の家から持っていく予定の家具をクイックにスキャンして、配置するのには十分です。

<b>・Unity</b>
様々な3Dツールがありますが、ここではUnityを活用しました。筆者がよく使うから、という理由が主ですが、ゲームエンジン搭載により、3Dモデルをぐりぐりスムーズに動作可能です。また、各モデルをドラッグドロップで簡単に配置できることもポイント高。一人称視点でのシミュレーションを行なって、デジタル空間上に配置した家の中の探索も可能です。

<b>・3Dモデル</b>
上記のiPad ProやiPhoneから取得したものに加えて、<a href="https://sketchfab.com/feed">Skethfab</a>からダウンロードできる家具や人間モデルを自由に配置することも楽しいです。IKEAの家具やその他架空のものなど、イメージに合うものを自由にダウンロードして楽しみましょう。家電などもいろいろ出てきます。
なお、本記事における人間モデルは<a href="https://sketchfab.com/3d-models/connor-rk900-detroit-become-human-623e3f52b7da4116a4576f38479eaaaf">こちら（connor-rk900-detroit-become-human）</a>からお借りしました。

## 4. 家具配置をデジタルエンジニアリング
### 4.1. 新居をiPad Proでスキャン
新居の内見のタイミングで全部屋をスキャン。約１時間かかった。
新居引越し前に実施できることにやはり意味があり、この際のデータを活用して、様々な家具配置を事前に試すことができた。また、新居の内見時点では当然何も配置されていないので、スキャンする上でも解像度を低めに設定しながら隈なくスキャンしやすいことも利点。
一点反省は、解像度を高めすぎたが故に、データ容量が全部で８００MB近くになってしまい、Unityでも少しもっさりした動きになってしまったのが今度のLessons Learnedである。
iPad Proの返却後も手元のiPhoneでデータを確認できるよう、モデルフォーマットはGLB（ウェブ用のオープン3Dフォーマット）に統一して自宅のMacに保管。iPhoneにはAirDropで移して、<a href="https://apps.apple.com/jp/app/khronos-gltf-viewer/id6470311948">glTF Viewer</a>を活用。

### 4.2. 家具をスキャンして取り込み
データは同じくモデルフォーマットはGLBに統一して出力、これを適宜Unityに取り込んだ。GLBであれば特に変換など必要なく、Unityにドラッグ＆ドロップで配置可能。

![名称未設定 (2).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234352/56f9a173-77bf-07fc-65a3-21b96ea19154.gif)
<p class="text-center">Fig2. スキャンしたモデルと配置</p>

### 4.3. トライアルアンドエラー
データ取得ー＞様々な家具を配置して試すー＞うまくいきそうであればオンラインストアで購入、の流れができることも非常にデジタル感ある新しい時代で楽しい。

### 4.4. 探検
UnityのカメラにこちらのC#コードをアタッチして、シーンを実行。画面上をマウスでぐりぐりしながら、デジタルツイン上を探検可能になります。まだ見ぬ家具配置された新居に一足早く没入できて満足度が非常に高いのです！

![画面収録-2025-02-11-23.57.35 (2) (2) (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234352/2017ad19-7aa5-ece6-ef59-468e2b437bf5.gif)
<p class="text-center">Fig3. デジタルツイン上での探検</p>

```C#:cam.cs
using UnityEngine;

public class CameraController : MonoBehaviour
{
    public float zoomSpeed = 10f; // マウスホイールのズーム速度
    public float rotationSpeed = 100f; // カメラ回転の速度
    public float panSpeed = 10f; // パンの速度
    public float minDistance = 5f; // ズームインの最小距離
    public float maxDistance = 50f; // ズームアウトの最大距離

    private Vector3 currentRotation; // 現在の回転角度

    void Start()
    {
        currentRotation = transform.eulerAngles;
    }

    void Update()
    {
        HandleZoom();
        HandleRotation();
        HandlePan();
    }

    void HandleZoom()
    {
        float scrollInput = Input.GetAxis("Mouse ScrollWheel");
        if (Mathf.Abs(scrollInput) > 0.01f) // スクロール入力がある場合のみ動作
        {
            Vector3 forward = transform.forward;
            transform.position += forward * scrollInput * zoomSpeed * Time.deltaTime;
        }
    }

    void HandleRotation()
    {
        if (Input.GetMouseButton(1)) // 右クリックで回転
        {
            float mouseX = -Input.GetAxis("Mouse X");
            float mouseY = -Input.GetAxis("Mouse Y");

            currentRotation.y += mouseX * rotationSpeed * Time.deltaTime;
            currentRotation.x -= mouseY * rotationSpeed * Time.deltaTime;

            // 回転角度の制限 (例: 上下90度まで)
            currentRotation.x = Mathf.Clamp(currentRotation.x, -90f, 90f);

            Quaternion rotation = Quaternion.Euler(currentRotation);
            transform.rotation = rotation;
        }
    }

    void HandlePan()
    {
        if (Input.GetMouseButton(2)) // マウスホイールクリックでパン
        {
            float mouseX = Input.GetAxis("Mouse X");
            float mouseY = Input.GetAxis("Mouse Y");

            Vector3 right = transform.right;
            Vector3 up = transform.up;

            transform.position -= right * mouseX * panSpeed * Time.deltaTime;
            transform.position -= up * mouseY * panSpeed * Time.deltaTime;
        }
    }
}

```

## 5. その他活用アイデア
まだまだやれそうなこと思い付きます。
・VR化して遠隔で足が悪いおじいちゃんおばあちゃんに我が家に来てもらう。
・UnityシーンをWebGL化してウェブサーバーに落とせば、どこからでもアクセス可能なデジタルツイン環境完成。
・その場所の環境データ（温湿度など？）も一緒に描画すればペットの遠隔管理に使う。

## 6. まとめ
この記事では、引越と家具配置計画でデジタルツイン構築による可能性を示しました。
引越、家具などこの分野はデジタル化がまだまださらに進む予感です。
不動産ホームページなんかにもたまにVRルームが公開されていたりと、一部活用が進んでいるようですが、不動産購入時には3Dデータがついてくるのが一般的な時代が来たら面白いですね。
今回は引越しを対象としましたが、自動車や飛行機、宇宙船などヒューマンインタフェースを対象とした製品へのコンポーネント配置なんかにも十分活用できそうに思います。

皆さんも引越しの際は試してみてください。