【3Dソフト不要】AWS TwinMakerで始める、身近なカメラ＆いらすとやで作る3D空間

# この記事について

この記事では、PNG画像でTwinMakerの3D空間を作る方法を紹介します。

**どうやって？**

・PNG画像、パノラマ画像、RICHO THETAの３６０度画像などをTwinMakerに取り込みます

**何が嬉しいの？**

・リアルな3D空間を作ることができます
・「いらすとや」や「Google Material Icon」のような画像が利用できます

## TwinMakerって何？

AWS TwinMakerは、3D空間とIoTのリアルタイムなデータを紐づけることができるサービスです。
3D空間とダッシュボードを組み合わせることで、従来の可視化をより分かりやすい形にすることができます。

![205143289-664e4a63-a421-497b-8265-a9a481a11db5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233180/e682c8a7-1063-de04-b66f-b88cd69ee870.png)

## TwinMakerってあまり聞かないけれども…

呪文のような専門用語、3Dデータの用意のハードルの高さのせいもあって、紹介する記事はサンプルやハンズオンをそのまま実行するだけのものが多く、料金や開発を深く掘り下げた記事はほとんどありません。

## 実際はどうなの？

特別なツールで3Dデータを用意する必要も、呪文のような専門用語を覚える必要もありません。
30分もあればこの感じのものを作ることができます。AWSでは一番遊べるサービスです。

【完成図】
![myl12-dj3aq.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233180/cb8618e9-2083-c374-5f21-d9986781cd93.gif)

## TwinMakerの料金は？

TwinMakerの利用料金は無料です。規模が大きいと、S3のバケットの使用料がわずかにかかります。

# 必要なものと、必要ないもの

### 必要なもの

- AWSアカウント
- ブラウザ（Chrome推奨）

### 全く必要ないもの

- コーディングスキル
- 3Dモデリングのスキル

# ステップ1: TwinMakerをはじめる

まずTwinMakerの導入方法を説明します。

**1.AWSコンソールにログインした後、リージョンを`バージニア北部`に変更します**
　→　東京リージョンにはまだTwinMakerはありません

**2.TwinMaker開いて、`ワークスペースを作成`します**

![create-workspace.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233180/0aa128ac-658e-0a8d-46c7-ad8553e65688.png)

入力項目は以下のように入力します。

- 名前：自由に名前を付けます
- 説明：空欄でもOKですが、必要があれば説明を書きます
- S3バケット：1番上にある、`S3バケットを作成`を選択します
- 実行ロール：1番上にある、`新しいロールを自動生成`を選択します

入力ができたら、「確認をスキップして作成」を選択します
　→　スキップしないとGrafanaのダッシュボードの作成画面が出てくるのですが、作成は不要です

**3.ワークスペースを作成したら、`シーン`を作成します**

![scene.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233180/230f38c5-d358-050b-0e6f-4767694b09e4.png)

入力項目は以下のように入力します。

- シーンID：自由に名前を付けます
- 説明：空欄でもOKですが、必要があれば説明を書きます

**これで準備は完了です**

シーンを開くと、TwinMakerの編集画面が出てきます

![scene-open.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233180/90e43139-ccf0-bc8e-0339-f965d6fc2dba.png)

# ステップ2: PNG画像をTwinMakerに表示する

「いらすとや」の画像をTwinMakerに取り込んで、3D空間に表示する手順を説明します

**1.PNG形式の画像をローカルに保存します**

まずは例として、<a href="https://www.irasutoya.com/">いらすとやのサイト</a>から、この画像をローカルに保存します

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233180/97a7a352-fb90-45d4-600d-59e5edca2037.png" width="120"></img>

**2.保存したPNG画像をGLTF形式に変換します**

こちらにツールを用意しました。内部でThree.jsを使うのでhtml形式になります。

https://github.com/ShotaOki/png2gltf/tree/main

Githubのindex.htmlをローカルに保存してダブルクリックするか、<a href="https://shotaoki.github.io/png2gltf/">GithubPagesで直接開いて</a>利用できます

**変換ツールの使い方**

変換したいPNG画像と、変換する3Dの形（平面なパネル、球体、円筒）を選んで、ダウンロードボタンを押します。

![create-capture.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233180/123f0b2d-897e-aa5b-e7cf-e73cbf1c4b1a.png)

**変換後のいらすとやの画像**

変換後の拡張子はGLTFです。3Dになると上下が反転しますが、このままで大丈夫です。

![3dimage.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233180/c31f537e-c009-9a4a-5310-9288af7920ee.png)

> **余談：TwinMakerで使えるGLTFについて** 
> GLTFは、本来であれば1つのモデルを複数の3Dオブジェクトに分離させる（テクスチャにファイルuriを指定して、GLTFファイルとテクスチャファイルを分離させる）ことができます。ただ、TwinMakerで利用できるGLTFでは制限されているため、この形のGLTFファイルを読み込むことができません。TwinMakerでは必ず画像データを含んだ1つのGLTFにする必要があります。

**3.保存した画像をS3に保存する**

S3を開くと、TwinMakerのワークスペースを作成したときに作られたバケットがあるはずです。

バケットの情報
<pre>バケット名："twinmaker-workspace-${ワークスペース名}-${アカウントID}-iad"</pre>

![bucket.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233180/85837026-6c69-cdac-7bd2-f7bc8b01fb22.png)

このバケットの直下に、先ほどの手順で変換したGLTFファイルを格納します。

**4.TwinMakerのシーンで、画像を配置する**

S3にファイルをアップロードするだけで、TwinMakerのシーンに配置できるようになります

`Add 3D model`を選択して、S3のファイルの一覧から先ほどのファイルを選びます。

![add3dscene.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233180/37c706f9-18be-4ef1-0ac1-2b70af600fb6.png)

ダイアログが閉じたら、配置したい場所をクリックします。
いらすとやの画像が配置されます。

![added.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233180/be88ca2e-a1f1-9b61-e016-b5f517396d8e.png)

画像の向き、大きさ、位置、角度を調整します。
- Yはマイナスに反転させてください（上下がひっくり返ります）。
- Xが小さくなると、画像は横方向に短くなっていきます。

![layout-set.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233180/5de1f225-2fa1-e59f-f7e2-5cc55cbf0e64.png)

調整をかけると、いらすとやのお姉さんがいい感じに表示されます。

![ok-position.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233180/7c8a73cb-1ba2-927a-1b04-c32fc56bc5fd.png)

1人だけだと寂しいので、このステップの作業を繰り返しましょう。
床板の画像を、角度をX方向に-90だけ回転させて配置すると、3D空間に床を作ることができます。

![people.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233180/c7d9e6f0-d2ea-1a44-be06-17c4664a6d66.png)

いらすとやの画像、<a href="https://fonts.google.com/icons">Googleのマテリアルアイコン</a>、Chart.jsのグラフ画像も配置しました。

> **余談：グラフを3D上に配置する**
> S3にファイルを置くと、TwinMakerの3D空間に反映されます
> （※更新は再読み込みのタイミングで行われます）
> Lambdaの定期実行でグラフ画像をGLTFに変換するように実装すれば、TwinMakerの3D空間上でグラフを表示させることができます。

**5.吹き出しをつける**

TwinMakerの`オーバーレイ`や`注釈`機能を使うことで、吹き出しをつけることができます
吹き出しの内容はリアルタイムなIoTデータと連携させることができます

![overlay.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233180/c0ff8424-d3dd-b5c9-2003-3fb0558a69f6.png)

ほかにも、IoTデータと連携させることで、画像の表示非表示を切り替えたり、表示色を切り替えたり、透明度を変えることができます

**6.RICHO Thetaから背景画像を取り込む**

RichoのThetaを使うと、Google Street Viewのような臨場感のある画像を撮影することができます
撮影した画像をTwinMakerに取り込むことで、その場にいるような空間を表現できます

この記事では、`RICOH360 Blog`にあるThetaの生データのサンプルイメージを利用します
https://blog.ricoh360.com/ja/11203

![theta.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233180/29589e22-20ec-65b9-d66a-054fbcb10cf6.png)

いらすとやの時と<a href="https://shotaoki.github.io/png2gltf/">同じツール</a>を使って変換します。
設定を少し変更して、`3Dのフォーマット`を`球体(RICHO THETA)`にします。

**変換したあとの画像**

変換すると、以下のような3Dモデルになります。

![sphere-image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233180/fa4af426-5368-b337-4cc1-953e600e69f1.png)

TwinMakerに取り込むと、このように見えます。

![drawint-twinmaker.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233180/4a1cc18a-4e01-ad9d-982e-12483d1f6666.png)

画面を操作して、ここからズームしていきます
球体の中に入るまでズームすると、このように見えます。

![inside-sphere.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233180/266e68bc-6c9d-fb97-d66c-6b23e8dba57c.png)

> **余談: TwinMakerは重なり順の判定がやや特殊**
> 普通の3Dコンテンツはデプスバッファ法を使います。レンダリングした画像の奥行方向の位置を持っておいて、"今見えている画像よりも手前にあれば描画して更新、奥にあれば無視する"判定をピクセルごとに行います。
> TwinMakerはZソート法のような挙動をします。直感的なピクセルごとの判定ではなく、オブジェクト単位で判定します。オブジェクトの中心が手前にあるのなら描画、奥にあるものは無視するので、球体の中心が他のオブジェクトよりも手前にあると、「ふつうは隠れるはずがないのに隠れてしまう」ような動きをします。
> Thetaから取得した球体はZ方向の位置をやや奥めに配置する必要があります。

**最終的にできあがるものはこちらです**

![myl12-dj3aq.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233180/cb8618e9-2083-c374-5f21-d9986781cd93.gif)

IoTのリアルタイムなデータと紐づけることで、これまでのグラフ（Quicksight）ではできなかった表現ができるようになります。

**※Thetaがない場合**

Richo Thetaが用意できなくても、iPhoneのパノラマ撮影機能を使えば近いことができます。
※パノラマ撮影では球体ではなく円筒に変換します

![panorama-image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233180/c39fbfa6-9ad5-7555-a4a9-167a8c789f95.png)

**※もっとハイクオリティなものを作りたい場合**

TwinMakerのMatterport連携を使うことで、より没入感のあるものを作ることができます。

# 付録

TwinMakerの開発でよく使う情報をまとめておきます

**3Dデータ（objデータ）をTwinMakerに取り込むときは、obj2gltfを利用します**
https://github.com/CesiumGS/obj2gltf

```
# 普通に変換するとき
obj2gltf -i model.obj -o model.gltf
```

```
# 透明な部品のあるモデルを変換するとき
obj2gltf -i model.obj -o model.gltf --checkTransparency
```

**作成したTwinMakerの利用方法**

作成したTwinMakerには、以下のような利用方法があります。

- iot-app-kitを使って、Reactアプリに組み込む
https://github.com/awslabs/iot-app-kit

- Grafanaでグラフの一部として表示する