3D Scene オンラインエディタ - Spoke - Architecture Kit編

[Hubs Advent Calendar 2020](https://qiita.com/advent-calendar/2020/hubs)の14日目の記事です。🎄

そういえば、Advent Calenderに参加するのは今年が初めてです。今回で2回目の投稿です。
1週間前にSpokeの基本編の記事書きました。

本当は前回の記事に全部書く予定でしたが、長くなってしまったので何編かに分けることにしました。
[Spoke](https://hubs.mozilla.com/spoke)とはなんぞやの説明や基本操作に関しての説明は、前に結構書いたので飛ばします。

気になる方は、以下の記事をご確認ください。
「[3D Scene オンラインエディタ - Spoke - 基本操作編](https://qiita.com/kamimi01/private/a9904391f094150e0cac)」

でも多分、BlenderとかUnityとかバリバリな方は、いきなりこっちから入っても全然大丈夫だと思います。操作似てますし、Blenderとかよりも比較的操作が簡単だと思います。

この記事書いた目的は、
前とあんまり変わりませんので割愛して、

内容は、
SpokeのHello Worldよりはちょっと難易度上がるかな?くらいの内容です。
次に説明するArchitecture Kitというのを使って、Spokeで一から建物作ります。
Architecture Kitの基本編ですかね。

# Architecture Kitって?

[Architecture Kit](https://hubs.mozilla.com/docs/spoke-architecture-kit.html)とは、**カスタムした建築物をSpokeで容易に組み立てるためのオブジェクトが詰まったKit**です。
Spoke内のAssetsの中に用意されてます。外部ツール導入不要です。←Mozilla HubsやSpokeの説明では、必ずこの言葉入ってますね

なんでも400種類以上のピースが用意されているとか。まだまだ知らないピースがたくさんありそう。。
![architecturekit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401966/dd554e5b-98e7-5d1e-a5c7-8d9dd9404e83.png)

例として、こんな感じ↓のルームができるそうです。入ってみてください。
なかなかのクリエイティビティが発揮されてて、そういうのゼロな私にはレベル高めに見えます。センスある人っていいな。。
[Examples of rooms built with the architecture kit](https://hubs.mozilla.com/docs/spoke-architecture-kit.html#examples-of-rooms-built-with-the-architecture-kit)

作る人のセンスによって3Dの建物がSpokeだけで作れるのが、Architecutre Kitの魅力かなと思います。センスある人っていいなあ。。（二度目）

# この記事を読んで完成するもの

今回はArchitecture Kitを使って、流石に上記のリンクで公開されているルームほど凝ってないけど
それなりに建物として認められるくらいのものを作ります。

このKitを使って建物を作る時はいくつか押さえなければいけないポイントみたいなのがあるので、それが中心になります。
大体ポイントがわかったら、あとは作る人のセンスで如何様にもアレンジしたら良いと思います。

作るのはこんな感じのものです。
家かな。うん。現実だと雨が降ったら終わるので住めないですが、VRなら関係ないですね。
オープンな感じが好きです。 :grinning:

![smallhouse](https://user-images.githubusercontent.com/47489629/102019407-c8f87380-3db6-11eb-8699-8bbe2777d3f2.gif)

「[Building with the Architecture Kit in Spoke](https://vimeo.com/371970652)」の動画で作成されている建物をちょっと簡易化した感じです。

この動画かなり長いんですが、あと英語かつVimeoなので字幕がないのですが（付けられないのかな..?）、**これ見る力と時間（2時間弱）さえあれば、この記事見る意味はほぼないです**。
動画で言ってる話を要約したのが、この記事って感じです。

それにしてもこの動画、[Spoke Documentation](https://hubs.mozilla.com/docs/spoke-creating-projects.html)にもなかったし、検索結果の下の方でやっと見つけたんですよね。
こんなにわかりやすいのに、なぜ公式に載せないのか謎です。（実はあるのかなあ）

# ルームを作成してみる - Architecture Kit編 -

前回の記事では、操作方法ごとに目次分けしましたが、今回は作成する家の部位ごとに分けます。
あと基本操作は、以下だけで済むことが多いので、細かい操作は前回のをご覧ください。Architecture Kitで新しくやる操作をメインで書きます。

* 複製（Command + D）
* 位置調整（「Position」）
* 向き調整（「Rotation」）

## 1. プロジェクトを作成する

1. 「**New Project**」を選択する
![createNewProject.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401966/72463e11-a524-63fb-a814-a86c3f5b9eb5.png)


1. 「**New Empty Project**」を選択する
すると、山々に囲まれたシーンができます。多分これ以外のシーンに変えることもできますが、今回は割愛。。
![yamayama](https://user-images.githubusercontent.com/47489629/102016112-8d53ae80-3da2-11eb-95ab-8b3313d1549b.png)

## 2. 床を作成する

1. 「**Floor**」を選択し、床を配置する  
4 × 4の大きさのFloorを1枚配置したら、あとは複製しましょう。  
今回は家の奥行き?（といえば良いのかな）は、**Floor2枚分**  
間口?（奥行きの反対語はこれらしい。初めて知った。）は、**Floor3枚分**  
で作ってます。つまり**6枚複製**してください。
![floorgif](https://user-images.githubusercontent.com/47489629/102016155-d3a90d80-3da2-11eb-9b1d-757586861d67.gif)

## 3. 壁を作成する

1. 「**Wall**」を選択し、壁を配置する  
一旦複製はしないで、1枚だけ配置してください。  
今更ですが、このArchitecture Kitで出てくるピースの名前に入ってる数字は、**メートル(m)**です。スクショあるので省略していましたが、今回作ってる家の高さは4.5mなので、Wallのピースの名前に4.5が入ってるのを選んでくださいね。 
![wall](https://user-images.githubusercontent.com/47489629/102016172-f2a79f80-3da2-11eb-91b5-cf168e0040cd.png)

1. 「**Wall**」を複製して、180度回転させる
視点変えて見てみると気づくと思うんですが、1枚だけだと外から見た時は問題ないんですけど、内側から見ると透けちゃうんですよね。なので、Wallをもう1枚内側の同じ位置に180度回転して配置する必要があります。  
ドキュメントにも書いてますね。→「[Making kit pieces double sided](https://hubs.mozilla.com/docs/spoke-architecture-kit.html#making-kit-pieces-double-sided)」
![walltomei](https://user-images.githubusercontent.com/47489629/102016198-1539b880-3da3-11eb-965f-aa5bc6a1f65d.png)
忘れると、ルーム公開して実際に他の人が入った時に、壁が透けてあんまり家って感じがしない家と思われちゃいます。それは悲しい。。  
作ってる側からすると、外側から見ることが多いと思うので忘れがちですが、
外側と内側のWallをセットで複製すれば、忘れないはずなのでそうしましょう。  
複製する数ですが、この後窓付きの壁(大きさはここで配置する壁と全く同じ)を配置するので、窓なしでいいやってところにだけ壁を複製して配置してください。全部窓付きの壁にするんだって場合はそれでもいいと思います。
![wallrotation](https://user-images.githubusercontent.com/47489629/102016212-25ea2e80-3da3-11eb-9fbe-dd797dbabd6c.gif)

1. 「**Wall_xx_Win**」を選択して、窓付きの壁を配置する
前回と同じく、内側から見ると透けた状態になってるので、もう1枚複製して同じ位置に180度回転して配置を忘れずに。
![wallwithwindow](https://user-images.githubusercontent.com/47489629/102016341-ccceca80-3da3-11eb-966b-48a1db1aa3e3.png)

1. 「**Win_Glass**」を選択して、 窓ガラスを配置する
お好みですが、ちゃんと大きさぴったりのガラスがあるので、配置しましょう。1 × 1.5のやつ選んでください。  
これはWallみたいにDouble sidedは必要ないです。3つ複製して位置調整しましょう。
なんか知らないんですが、私はガラス配置はシーン内での位置調整だけだとうまくいかなかったので、Propertiesで細々調整しました。ちょっとのズレでも意外と中入ってみると、隙間開いてね?ってなります。開いた風にしたいなら良いかもですが。
![glass](https://user-images.githubusercontent.com/47489629/102016343-cf312480-3da3-11eb-9b39-b43a80ba6695.png)

1. 「**Win_Insert**」を選択して、 格子を配置する
これも好みですけど、格子を配置します。
同じく1 × 1.5のやつ。同じくDouble sidedは不要。3つ複製して位置調整します。
![koshi](https://user-images.githubusercontent.com/47489629/102016347-d0625180-3da3-11eb-8feb-0256b05b68c1.png)
（途中経過）床と壁ができたでしょうか。足りないところあれば複製してね。
![tochu1](https://user-images.githubusercontent.com/47489629/102016366-ea9c2f80-3da3-11eb-88fe-494e54cd337a.png)

## 4. Materialを設定する
なんとなく形はできてきましたが、全部グレーな感じでちょっと家感が薄いですよね。
ということで、なんとかします。

1. 「Floor」のPropertiesから「**Top/Sides Material**」を設定する  
ちょっと家らしくなった気がします。他のピースも同じく、PropertiesでMaterialを設定できますので、色々試して自分好みにしましょう。この後、天井をつけるので、内側のMaterialは今のうちに設定した方が良いかも。
![material](https://user-images.githubusercontent.com/47489629/102016405-233c0900-3da4-11eb-9088-10546903a6e9.png)

## 5. 階段を作成する
まあ階段はお好みなんですが、こんな物も作れるよってことで紹介します。

1. 「**Stairs**」を選択して、 階段を配置する
2 × 2 × 1.5というのを選んでください。
![stairs](https://user-images.githubusercontent.com/47489629/102016429-51214d80-3da4-11eb-8930-290d839d56c3.png)

1. 「**Floor**」を選択して、 踊り場を配置する
床のFloorと大きさ違うので注意!
![floor2](https://user-images.githubusercontent.com/47489629/102016442-5d0d0f80-3da4-11eb-9384-f8cec311f38e.png)
これが配置できたら、さっきの**StairsとこのFloorをセットで3つ複製**します。90度ずつ回転して高さ変えてくっつけてください。この階段は家の屋上に行くために設置するんですが、家は4.5mでしたよね。なので3つです。  
（途中経過）階段できましたね。わかりやすいように、家の外で作ってたんですが、ちゃんと中に移動させてあげてください。
![tochu2](https://user-images.githubusercontent.com/47489629/102016445-672f0e00-3da4-11eb-95e9-96cb7a5886c5.png)

## 6. 天井を作成する
天井作ります。なくても開放感あっていいと思いますが、私はある方が好きですー。

1. 「**Toggle Grid Visibility**」の値を「4.5」に設定する  
これは必須手順では全然なくてTipsにあたるのですが、Spokeでデフォルトで白いマス目のGrid出てると思うのですが、こいつは高さを変えることができます。例えば、こんな感じ↓で4.5に設定すると、すっと上に上昇してくれます。
![tenjo](https://user-images.githubusercontent.com/47489629/102016458-7ca43800-3da4-11eb-9d16-fbb6b32ea0b6.gif)
まああくまで目安線なので、お好みで。多分知っていると役に立つ気がする。

1. 地面の「Floor」や踊り場の「Floor」を複製して、天井を配置する
Floorを複製しまくって、Materialも一緒に設定してしまいましょう。ちなみに画像のグレーの部分だけは2 × 2のFloorを使ってます。それ以外は4 × 4を使ってます。
![tenjo2](https://user-images.githubusercontent.com/47489629/102016470-8d54ae00-3da4-11eb-9e8f-8a2f2ab9f890.png)

## 7. 微妙な隙間を埋める
これで完成！と言いたいところなのですが、ぐるぐると見回してるとまだ直したいところがあります。いくつか隙間があるのです。それをなんとかしましょう。

1. 「**Trim_Corner**」を選択して、隙間を埋める  
これ内側から見ると隙間ないのですが、外側からだと思いっきり空いてるのが見えます。
![sukima1](https://user-images.githubusercontent.com/47489629/102016491-aa897c80-3da4-11eb-8d8f-d5f5368fa69b.png)
4つ角どこも隙間が空いてるので、4つ複製して位置調整&向き調整してください。ピタッとハマってなんか気持ちよくなれます。（私はなれました笑）
![kado](https://user-images.githubusercontent.com/47489629/102016494-ad846d00-3da4-11eb-842b-2a0c105d720d.png)
ちょっと省略するのですが、実は天井と壁の間も隙間が空いてるので、そこもTrimから探して配置してくださいね。（ごめんなさい。力尽きてきた。。）

1. 「**Trim_Cap_Corner_Out**」を選択して、隙間を埋める
だいぶ埋めましたが、まだ隙間あります。これはだいぶ細かいなと思いましたが、でもせっかくピースがあるので使います。本当に角っこが少しだけ空いています。ここを埋めましょう。4つ複製して、位置調整&向き調整します。
![trimcap](https://user-images.githubusercontent.com/47489629/102016535-d278e000-3da4-11eb-9071-1c3ec9135503.png)
上から見てみたところ。これでやっと隙間埋まりました。
![cap](https://user-images.githubusercontent.com/47489629/102016538-d4db3a00-3da4-11eb-80c6-ff6a2f57643d.png)

## 8. 歩行範囲、衝突物をちゃんと決める
最後です。下記に記載の通りやるべきかは私には未だ謎ですが、やるに越したことはないように思うのでやります。
これが終わったら、Save&Publishしましょう!

1. 「**Floor Plan**」のPropertiesから「Regenerate」を選択する  
歩行範囲や衝突判定するオブジェクトをちゃんと再認識させるためにFloorPlanの設定をいじるみたい。絶対やるべきなのかどうかはわからんかったです。私は別にこれしなくても問題なかったんですよね。
ドキュメントのここ（「[Navigation Mesh Generation](https://hubs.mozilla.com/docs/physics-and-navigation.html#navigation-mesh-generation)」）に書いてるらしいことはわかるけど、正直よく理解できんかったです。。
![navi](https://user-images.githubusercontent.com/47489629/102016539-d9075780-3da4-11eb-9427-81316b997829.png)
仕組みはよくわからなかったけど、やった方が良さそうって思ったのは、例えばこんな場面です。（チュートリアルの動画でやってました。）

* 屋根を設置してみた（今回はしてませんが、Roofというピースがあるので配置できます）
* デフォルトでは屋根のピースは、Walkableがオンになっている。つまり歩ける。（Propertiesから設定できます）
* けど、屋根を歩くことなんて普通できないというかしないだろ!と思ったりする。
* なので、Walkableをオフにした。

みたいな時は、Regenerateしないといけないみたいです。行うと、Roofが何色か忘れましたがとにかく青ではなくなっていることがわかります。（つまり歩けなくなっている）

中途半端な感じの終わり方ですが、Architecture Kit編以上!!あとはお好きなタイミングでSave&Publishください。

# ルームを作成してみる - 番外編 -
ここまででもうArchitecutre Kitの紹介自体終わりですが、他にもいろんなオブジェクトだったり便利機能があるんだよ、というのを紹介します。Architecture Kitまで使って作る人であればよく使うんではと勝手に思ってます。

## 1. 便利オブジェクトを配置する

1. 「**Hubs Sound Pack**」から「Music」を選択し、音楽を配置する  
Spokeが予め用意してくれてる音楽が結構あります。  
位置調整とかしてる時はやらなくていいのですが、それが終わったらPropertiesで「**Visible**」をオフにしましょう。でないとスピーカーのマークが見えたままになります。
![music](https://user-images.githubusercontent.com/47489629/102016566-f6d4bc80-3da4-11eb-945c-7c3dd90cecf9.png)
すごく余談ですが、私はVR空間を作る時は音楽は配置した方が良いなと思ってます。あったほうが色々和むので。  
現実だと必ず誰かしら喋ってるからそれがBGMの代わりになってると思うんですが、リモートだと誰か喋らないと完全に無音じゃないですか。話しづらいと思うんですよね。というか私はそうです。オンライン会議ツールとかでもBGM設定できたら面白いのに。

1. 「**Way Point**」を配置する
こいつが配置されているところにワープできます。頭らへんに矢印が出てますが、これが移動後のアバターの正面になりますので、椅子とかに配置するときはちゃんとぽい向きに調整しとく方が良いです。
![waypoint](https://user-images.githubusercontent.com/47489629/102016576-f9cfad00-3da4-11eb-8fdb-9607074fac05.png)

1. 「**Sketchfab**」から3D Modelを配置する
他の人が作って公開してくれた3D Modelを自由に検索して配置できます。Spoke内だけで作れない複雑な構造の物はBlenderとかのツールで作ってそれをこっちのシーンに取り込むみたいな感じですね。モデリングもできるようになりたいけど、根気が。。作って無料配置してくださってる方々には本当に感謝です。  
本当に美しいModelが多いのですが、そういうのは大抵ポリゴン数が多いみたいで、配置しすぎると「Performance Check」にほぼ間違いなく引っかかります。ので注意。。そういう意味でも、自分でローポリゴンのModel作れるようになったらきっともうちょっと色々できるんだろうなと思ってはいる。。
![chair](https://user-images.githubusercontent.com/47489629/102016586-fc320700-3da4-11eb-8666-6818bc3efd4c.png)

1. 「**My Assets**」に配置したいオブジェクトをアップロードして、配置する
あんまりModelが配置できないよ。モデリングもできるスキルないんですけど（→つまり私）って、人でも朗報です。  
3D Modelが配置できるくらいだから当たり前?なのかもしれませんが、ローカルで持ってるファイルもSpokeにアップロードして配置可能です。
私がよく配置していたのは、動画/GIF画像/PNGの画像です。あとMy Assetsと関係ないですが、Elementsの中にあるLinkもよく配置してました。3D Modelがあった方が見栄えが良くなるのは多分間違いないですが、Spokeの中にだけあるor自分のローカルにあるファイルたちだけでも、配置の仕方を工夫したり、面白い画像とかを使えばそれなりにオリジナリティある感じにできると思います。と私は信じてます。
![assets](https://user-images.githubusercontent.com/47489629/102016623-36030d80-3da5-11eb-9353-51309f531cdb.png)

## 2. その他の便利機能を使う
今度はこんな機能もあるよ。の紹介です。なくても特別困らなそうなので基本操作編には載せなかったのですが、使う場面はあると思います。

1. Previewモードにしてみる  
毎回Publishして、ルームに入って挙動確認って結構面倒だなって思ったりすることがあると思います。私は作ったプロジェクトが重すぎたので毎回そう思ってましたが。。:sweat:  
ルームにまで入らなくてもちょっとどんな感じになるか確認したいって時にPublishしなくても使えるPreviewのモードというのがあります。  
まず、「**Developer**」から「**Enable Experimental Features**」を選択します。デフォルトはDisableみたいなんですよね。なぜだろ。
![preview](https://user-images.githubusercontent.com/47489629/102016643-4d41fb00-3da5-11eb-8431-2db40b546991.png)
すると、Gridの右横に▶︎マークが登場します。これと押すと、シーンのPreviewを見ることができます。例えば、音楽とかを配置していたらちゃんと音が流れているのが確認できたり。
![preview2](https://user-images.githubusercontent.com/47489629/102016654-5a5eea00-3da5-11eb-9ba7-3b7e58489742.gif)

1. 「File」から「**Export**」(glb/spokeファイル)または「**Import**」(spokeファイル)ができる
こういうツールには定番機能ですが、作ったシーンをエクスポートしたり他の人のシーンをインポートできます。
私はあんまり使う機会なかったですが、作成するものを何人かで分担してたり、あと普通に他の人に共有したい時に役立つんじゃないかなと思います。
![import](https://user-images.githubusercontent.com/47489629/102018900-8d0fdf00-3db3-11eb-80dd-d995151df44a.png)
ちなみにExportしたglbファイルをspoke内で使用するには、「**My Assets**」からアップロードします。spokeファイルのインポートとはやり方違うので注意です。

# 最後に
前回画像モリモリにしすぎた結果、Qiitaでアップロードできる上限超えちゃったらしくて今回はGithubのIssueにあげてその画像のURLを持ってくることにしました。まあどこかで引っかかるだろうとは思いましたが、案の定。。
基本操作編で気合入れすぎて、今回はだいぶ省略してるところありますが、誰かのお役に立てれば幸いです。

次はAWS使って独自Hubsを作ってみたいなと思ってはいます。→「[AWS Quick Start](https://hubs.mozilla.com/docs/hubs-cloud-aws-quick-start.html)」
でもAWSのアカウント無料枠の期間終わっちゃってるからどうしようと思ってるところです。暇な時に調べたり考えたりします。