A-Frameで街歩き

しばらくぶりの投稿です。
またまたA-Frameネタです。

今回は、PLATEAUのデータを活用して、A-Frameで街歩きを作って見たいと思います。
VR空間に、建物を表示して、移動できるようにする。


A-Frameについて
A-Frameは、ウェブ上でVR（仮想現実）およびAR（拡張現実）コンテンツを作成するためのウェブフレームワークです。
Three.jsベースではありますが、HTML+Javascriptの知識さえあれば作れて
なにより、１ソースでクロスプラットフォーム動作するところがお気に入りです。
- 主要なVRデバイス（HTC Vive、Oculus Rift、Windows Mixed Realityなど）
- モバイルデバイス（スマートフォンやタブレット）でVRコンテンツを表示することができます。
もちろん、ジャイロセンサーや、VRデバイスのコントローラにも対応しています。
類似に、Babylon.jsがあります。


デモサイト
スマートフォン等でテストしやすい様に、glichというオンラインで、HTML書いて即プレビューできるサイトを使ってます。
https://glitch.com/edit/#!/a-frame-mierune-meetingroom?path=index.html%3A19%3A0

街の建物データ取得先としてPLATEAUを選択しました。
G空間情報センターにて
色々な形式のデータが配布されていますが
A-Frameで表示できる種類は、
- obj(gltfを使うことを推奨している）
- gltf(glb)
- dae
- fbx


今回は、fbxダウンロードして、Blenderでｇｌｔｆへ加工し、VR空間へ建物を表示したいと思います。


### glbファイルの作成（FBX→glTFへ変換）

手順は

https://www.mlit.go.jp/plateau/learning/tpc12-1/

を参考にしています。

G空間情報センターから東京タワー付近(53393599)のFBXをダウンロード

[https://www.notion.so/mierune/A-Frame-6af105272b384143852e7b0a23260330?pvs=4](https://www.notion.so/A-Frame-6af105272b384143852e7b0a23260330?pvs=21)

Blenderで、FBXをインポートする際に、スケール、オフセット位置を調整します。

**［前方］を［Yが前方］、［上］を［Zが上］、［スケール］を「100」に指定する。**


![スクリーンショット 2023-06-12 18.23.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580547/d7c0fef1-0238-2602-b29c-6100b6c9fd68.png)

読み込めましたが、実はこの建物群は原点から離れたところにプロットされています。
なぜなら

平面直角座標９系の原点が、このデータの原点になっているからです。
VRで使うには、この建物群を原点付近へ移動しなくてはいけません。

移動量を調べます。

平面直座標9系の原点から、指定メッシュ中心のズレを計算

このサイトで平面直角座標系原点からのオフセット量を調べられます。
（事前に、53393599メッシュの中心緯度経度も調べておきます。）
http://www.gis-tool.com/areamesh/meshcodetocoordinates_s.php?meshcode=53393599
で四隅の緯度経度から中心緯度経度が算出できます。

https://vldb.gsi.go.jp/sokuchi/surveycalc/surveycalc/bl2xyf.html

平面直角座標９系原点と、53393599メッシュ中心とのXY距離を求める。

![スクリーンショット 2023-06-18 23.07.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580547/9442476d-1066-6482-3f5c-2801ee8d863e.png)

X:37440.1670 ｍ
Y:8110.6289 ｍ
移動すべき量がわかりました。


BlenderでXYオフセット処理すると、原点付近に移動します

建物をドラッグしてすべて選択し［編集モード］にして［N］キーを押し
［アイテム］タブのトランスフォームで移動量を指定できます。
![スクリーンショット 2023-06-12 18.24.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580547/f6ebdd48-ed99-eac1-de78-b0d9d04d1f1d.png)


Z方向について、PLATEAUのデータをそのままBlenderへインポートしても、少し浮いてしまいます。

PLATEAUのデータは、実態に則した３Dモデルなので、標高地も含まれているからです。
Blenderの世界は、（現状）地面が平坦なので、建物を地面に付ける必要があります。

Blenderに「Drop_it」というアドオンをインストールして、

Drop_itで参考にさせてもらったサイト
https://www.tomog-storage.com/entry/Blender-Addon-IntroductionDropIt

仮の地面を作り（地面を作るのは、追加ーメッシュー平面）、

そこに建物を全てDrop_itさせて、着地後、仮地面を削除しました。

glbへエクスポートして,glbファイルを作成しました。



### 53393599メッシュのglbをA-Frameへ配置

地形だけでは味気ないので、

フリー素材のベンツをスタート地点に配置しています。（回転や位置を変えて、スケールは合っていないかもしれない。）

```json
<html>
  <head>
    <meta charset="UTF-8" />
    <link rel="shortcut icon" href="./vr/images/icons/favicon.ico" />
    <script src="https://aframe.io/releases/1.4.0/aframe.min.js"></script>
    <script src="https://unpkg.com/aframe-environment-component/dist/aframe-environment-component.min.js"></script>
    <script src="https://unpkg.com/three@0.131.3/examples/js/loaders/TDSLoader.js"></script>

  </head>
  <body>
    <a-scene stats loading-screen="dotsColor: gray; backgroundColor: lightgray">
      <!-- Sky, Emvironment -->
      <a-sky color="#ECECEC"></a-sky>
      <a-entity environment="preset: default; dressingAmount: 0"></a-entity>

      <!-- Assets -->
      <a-assets timeout="30000">

        <a-asset-item
          id="benzgls_gltf"
          src="https://cdn.glitch.global/843975dd-520d-4cb9-bacb-e3ce2239c588/BenzGLS.glb?v=1686733547364"
        ></a-asset-item>
        <a-asset-item
          id="tokyo_gltf"
          src="https://cdn.glitch.global/843975dd-520d-4cb9-bacb-e3ce2239c588/53393599_dorpit.glb?v=1686733558171"
        ></a-asset-item>
      </a-assets>

      <!-- GLTF, Obj -->
      <a-gltf-model
        src="#benzgls_gltf"
        position="1.8 0 -10"
        rotation="0 180 0"
      ></a-gltf-model>
      <a-gltf-model
        src="#tokyo_gltf"
        position="0 0 0"
        rotation="0 0 0"
      ></a-gltf-model>
    </a-scene>
  </body>
</html>
```

![スクリーンショット 2023-06-14 18.26.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580547/b680ae5b-b6b6-08be-20c3-b6e67f64b4d7.png)

この状態で、PCブラウザだとマウスドラックで視点移動、カーソルキーで自位置移動ができます。


このパフォーマンスメータは、A-Frameで予め用意されていたもの（stats）

Three.jsに負荷かけすぎているか

![スクリーンショット 2023-06-14 18.18.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580547/84038959-818b-6a59-c6fc-9eac70ea44cb.png)

負荷がかかっている。Trianglesが赤状態。

PCでこの状態なので、スペックの劣るVRゴーグルではすぐ、
フレームレートが落ちてしまう＝VR酔いするだろう。（まだ実際に試しては居ない）

一応PCブラウザでは、普通に動いている・・・。

後日、会社の有識者に聞くと、Triangles（三角形）を間引いて軽量化して使うのが普通、だそうです。


### まとめ

A-Frameで、PLATEAUの都市モデルを表示することはできたが、まだまだ課題はある。

今後の課題
- Triangles（三角形）を間引いて軽量化
- テクスチャの付いている建物データ
- 地面を実際の地図or衛星写真