07_3D表示

【07_3D表示】GASによるバーチャルリアリティのトライ〔解説編 Vol.3〕「A-Frame」のタグ詳細とスプレッドシートの連携

(アイキャッチ画像:Photo by Minh Pham on Unsplash

記事概要

この記事は、GASによる以下のバーチャルリアリティ表示トライの解説記事になります。

今回は、A-Frameのタグの詳細と、スプレッドシートとの連携についてご説明します。

記事での説明内容概要

ちょっと長くなったので、概要を先にご紹介。以下のスプレッドシートの値を配列に取り込んで、

以下の画面に反映させるところまでが今回の記事です。(ベースは青く変えてみました)

 

A-Frameのタグでカメラを記述する

以下の解説は、テンプレートに関する記述です。GASのプロジェクトを作成したら、テンプレート(INDEXなどの名称のHTMLファイル)を新規追加し、そこに今回説明の内容を記述します。

今回は、A-Frameを使って、3DをHTMLタグで表現するためのコードをもう少し詳しくご説明します。

HTML文の<HEAD>セクションには、前の記事でご説明した様に、A-Frame のライブラリをで導入してあるものとします。(そうでないとタグが機能しません!)

 

まずカメラの記述です。

3Dの実体は<BODY>セクションに以下の様に、<scene>~</scene>タグで挟んだ中に記載するのですが、

<body>

</a-scene>

☆ここに3Dのタグを記載☆

</a-scene>

</body>

カメラは<カメラ>というタグではなく、<a-entity>タグの中でcameraオプションとして設定します。具体的には以下の様なコードです。

<a-entity
      id=カメラのID名
      camera
      position=左右座標 上下座標 奥行座標“←カメラの視点
      orbit-controls=
                autoRotate: カメラ自動回転 あり/なし;
                autoRotateSpeed:カメラ回転速度;
                target: #カメラを当てる対象のID;
                enableDamping: 慣性:あり/なし;
                dampingFactor: 慣性の大きさ;
                rotateSpeed:ユーザーが回した時の速度;
                minDistance:ユーザーのズームイン限界;
                maxDistance:ユーザーのズームアウト限界;”
       mouse-cursor=“”>←カーソルの設定
 </a-entity>

 

カメラの設置位置は position=左右座標 上下座標 奥行座標“ で表しますが、3次元の各方向の順番がちょっと変わっていますので注意です。(通常、高さ座標は最後に来るような気がします・・・)

orbit-controls というのがバーチャルリアリティで3Dをぐりぐり動かす最に大事なのですが、色々なパラメータが設定できて迷ってしまいます。大体上記の内容を書いておけば良いかと思いますが・・・。パラメータの全体詳細については(英語ですが)こちらを参照してください。

orbit-control のパラメータを記載したサイト

サイト中に、以下の様なパラメータ表があります。

何となく意味はわかります

 

各パラメータの中では、ダンピング(DampingFactor) というのが判りにくい項目ですが、これはオブジェクトをマウスや指フリックで動かすときの惰性、つまり、「きびきび動く」か「のっそり動く」かの度合いを指定するものです。

ここまでお読みいただいた方には判ると思いますが、ユーザーが3Dをマウスなどでオービット機能を使っている(動かしている)時、これは実際はカメラを動かしていたのですね。

参考まで以前の記事 で掲載したA-Frame での表示例を再掲します。

影をみると、物体ではなくカメラが回っているのが判るかと思います。

A-Frameのタグで立方体、平面、天球を記述する

さて、カメラを設定したところで、3Dオブジェくトのタグについてご説明します。今回のトライで使っているオブジェクトは、直方体、平面、天球です。

まずは直方体と平面です。

■直方体

<a-box 
 color=色コード
 width=
 depth=高さ
 height=奥行
 rotation=-90 0 0←この記述によって寝かした状態になる
   position=左右 高さ 奥行 “>
</a-box>
■平面
<a-plane
 id=“ID名”  ←カメラのターゲットにします
 material=color: blue
 height=
 width=奥行
 position=巾  高さ(0) 奥行
 rotation=-90 0 0” >←この記述によって寝かした状態になる
</a-plane>

 

最後に天球です。

<a-sky
 color=色コード
   radius=半径“>
</a-sky>

注意すべきはここでも座標に関する表記です。

 width=
 depth=高さ
 height=奥行
 rotation=-90 0 0
あるいは、
 position=巾  高さ  奥行
 rotation=-90 0 0
という風に記述する数値を入れ込むと、寝かした情報で、意図した形で表現されます。
(rotationとの組み合わせ次第ですが)パラメータの名称から想像する、あるいは順番的に想像するものとは、高さと奥行きが逆なので注意してください。
まだ全体像が良くわからなくて、色々試行錯誤した結果です。depth=高さ“ の様に、パラメータ名と解釈の内容が違っているので注意です。

 

スプレッドシートの値を取得してA-Frameのコードの中に埋め込む

以下の解説は、スクリプトに関する記述です。GASのプロジェクトを作成したら、デフォルトで設定されるスクリプトファイルに、今回説明の内容を記述します。

さて、図形の表現方法が判ったところで、スプレッドシートとの連携について説明します。再掲になりますがスクリプトで行いたいことは、スプレッドシートの値を配列に取り込んで、

以下の様な3D図形に反映させることです。

縁取り部分は青くしました。(再掲)

お気づきかもしれませんが、シートの黄色い部分が地図にする範囲で、「1」と入れた部分が緑の道路に、「2」と入れた部分が赤い建物に、その他はグレイにしています。

概要としては、以下の様に行います。

  1. スクリプトで指定範囲のセルの値を配列に保存する。
  2. テンプレート、およびテンプレート内配列を宣言し、上記配列の値を代入する。
  3. テンプレートの中で、代入した変数に応じて、セルの値が1ならば緑の低い直方体を、2ならば背の高い直方体を描画する様にタグを作る。
  4. タグが完成したテンプレートをWEBサイトとしてホスティングする。

 

以下にコードレベルでご説明します。

まず、①と②と④の部分。すなわちシートの値を配列に保存し、その配列をテンプレートに取り込んで、最後にWEBサイトとしてホスティングする部分は以下の様なコードになります。

var 配列 = シート.getRange(指定範囲);←①
var THML要素 = HtmlService.createTemplateFromFile(‘テンプレートファイル名‘);
 THML要素.テンプレート内配列 = 配列.getValues();←②
THML要素.evaluate();←④
大まかには以上の流れでシートの値が引き渡せます。
以下の過去記事に詳しく記載していますので、併せてご参考にしてください。

ここからは、再びテンプレート内の説明です。

③の部分はテンプレート内で処理します。配列に代入された値は、テンプレート内でインラインコードを使って以下の様に取り出されます。

インラインコードは、タグそのものをスクリプトを使って記述するGASの仕組みです。
<?~?>の中にスクリプトを書き、ループの途中で?>~<?の形で、HTMLタグを記載しておくと、タグそのものをスクリプトの流れに沿って動的に記載できる仕掛けです。

まずは取り込んだ配列からセル値を取り出すまで。行x列の2重ループによって取り出せます。

<? (インラインコードで記載)
        for(配列の行毎に) { ←各行でループ

行成分配列(i行目

          for(行成分の列毎に) { ←ある行内で、列毎にループ

セル値行成分j列目

           }
   }
 ?>(インラインコード終了)
さらに、取り出す毎に、セルの値に応じて高さと色を指定した上で、A-Frame のタグをループの中で記載していきます。
以下の様な具合です。
 <? (インラインコードで記載)
        for(配列の行毎に) {

行成分配列(i行目

          for(行成分の列毎に) {

セル値行成分j列目

セル値に従って、高さや色を設定

      ?><a-box <?=色?> <?=列番号?> <?=高さ?> <?=行番号?> <? 
           }
   }
 ?>(インラインコード終了)

タグは?>タグ<?で挟んでその中に記述されていますが、これがループの数だけ生成されます。さらに、<?=変数?>で挟んだ中に変数を入れておくと、実行時には実数に置き換えられます。

以上、かなり抽象的な流れで概説しました。
以下の過去記事に詳しくこの辺りを記してありますので、宜しければ併せて参照ください。
  1. スプレッドシートのセルの値を取得する方法を説明しています。

  2. スプレッドシートの値をテンプレートに埋め込んで、WEBページとして表示させる方法を説明しています。

 

シートの値による3D地図の例

ちょっとシートの数字を変えた例をご欄に入れましょう。

シートを以下の様にすると、

 

こんな地図になります。

またシートをこんな風にすると

こんなふうになります。

コードの詳細については具体的な記述を見て頂くのが良いかとおもいます。

次回はこのWEBアプリの スプレッドシート、テンプレート、コードをご紹介する予定です。