3D Scene オンラインエディタ - Spoke - 基本操作編

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

最近、Mozilla Hubsで動くルームを[Spoke](https://hubs.mozilla.com/spoke)で作る機会があったのですが
Spokeの日本語ドキュメント少なくすぎじゃねって、結構💢マークを頭につけながら作業してました。（実際まだ少ないと思います。）

英語で探せばまあまあ情報あります。
なら英語で頑張れよと言われそうですが、仕事終わりに深夜テンションでAlexaと一緒に歌を歌いながらSpokeをいじっていたので、そんな状態で母国語以外が私のポンコツ脳に入る訳ありませんでした。。

そうは言っても情報がないよりは全然良いので、Spoke初心者の私は頑張って読みました。

この記事は、
Spokeのことをすっかり忘れた未来の私が困らないように & いろんな人にSpokeを使ってみて欲しいと思って書いています。
Spokeに出会って、あ意外とVR初心者でもVR制作に関われるかも。。と希望をもったので、これを読んでそう思っていただたら嬉しいです。
もっと言うと、私より優秀な人がいろんな応用をして、それを記事にして公開してくださるとなお嬉しいです笑。

内容は、
SpokeのHello Worldのような感じです。画像とGIF盛り盛りでいきます。

ちなみに今回は基本操作編で、次はArchitecutre Kit編を書くつもりです。
（[Architecutre Kitとは](https://hubs.mozilla.com/docs/spoke-architecture-kit.html#docsNav)）

[追記]
書きましたので、リンク置いておきます。
「[3D Scene オンラインエディタ - Spoke - Architecture Kit編](https://qiita.com/kamimi01/items/b13fe9c5eca6e2ce907c)」


# Spoke(スポーク)って？

序盤から説明もなしに連呼していましたが、
まず[Spoke](https://hubs.mozilla.com/spoke)というのは、**Mozilla Hubsで利用可能なルームを作成するツール**です。車輪の部品ではありません。
（リンクから以下の画面に飛べます）

そして、[Mozilla Hubs](https://hubs.mozilla.com/)というのは、**多様なデバイス上で動作するバーチャルプラットフォーム**です。
今回はMozilla Hubsの説明は省きます。
[kn1cht](https://qiita.com/kn1cht)さんの1日目の記事「[2020年のHubsふりかえり & Hubs Advent Calendar 2020について](https://note.com/kn1cht/n/nc03eef9587f6)」を読んでいただけたらと思います。
![スクリーンショット 2020-12-01 16.27.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401966/2469e5a4-d413-1f77-549c-4db799ef3d6d.png)
特徴は、
1. **Webブラウザで動作する**
2. **多様な形式のファイル（e.g.3D Model / Image / Moview）を配置したルームを作成できる**
かなと思います。
アプリケーションのインストールが不要っていうのが良いですね。

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

最初に書きましたが、この記事はHello Worldレベルです。
主目的は、**Spokeでの基本操作に慣れること**で、
せっかくなので成果物があった方が良いと思うので、既製のアセットを使ってルームを作成してみようという記事です。

VR制作全く初めて、な人向けです。

例えば

* Blenderで3Dモデリングしてる
* Unityでオブジェクトいじってる

みたいな方々は、おそらく序盤で触れた[Architecutre Kit](https://hubs.mozilla.com/docs/spoke-architecture-kit.html#docsNav)でルームを制作することから入った方がやりがいがあると思います。

この先を読んで、作成できるルームは以下のような感じです。
外国風の家々が立ち並ぶ中に、画像が浮いています。
![スクリーンショット 2020-12-01 17.35.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401966/5d5c661b-3bb6-3d4c-5d71-5800189cc08e.png)


# ルームを作成してみる - 事前準備編 - 

早速ルーム作成の前に、2つだけやることがあります。

1. とにもかくにも[Spoke](https://hubs.mozilla.com/spoke)をブラウザで開きます。（ChromeでもFirefoxでも動きます。まあMozillaが提供してるので、Firefoxが良いのでは）
2. 右上の「**Login**」ボタンを押して、メールアドレスを入力したら「**Send Magic Link**」を押します。登録したメールアドレスにきたメールの中にリンクがあるので、それを押します。すると勝手にログインされます。

![メールアドレス登録.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401966/f9436736-2a4b-b0bb-aa6e-2b540df546de.png)
これでOK。二度目ですが、アプリのインストールが不要なのはありがたいですね。

# ルームを作成してみる - 基本操作編 - 

では早速行きます。

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

まずは土台を作ります。

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


2. 任意の既製プロジェクトを選択する
もうお気づきかもですが、ここで選択したプロジェクトで、既にルームの90%の見た目は完成です。0%の状態から作っていくのは、Architecture Kit編でやることです。
私は左上の「Cudillero Diorama」を選びましたが、別にこれじゃなくても全然良いです。好きなものを選んでください。
![既製プロジェクト.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401966/4689f393-e993-b98c-d5d8-3b4c3962dcbe.png)

## 2. オブジェクトを配置する

画像を配置していきます。
今回は配置するのは画像のみですが、配置の仕方や位置の調整などはどのオブジェクトであろうが基本同じです。
Properties（つまり詳細設定）は、オブジェクトごとに異なります。

1. 「**Elements**」を選択する
![element.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401966/00439006-cb30-fd0a-e8d7-bb28f43020e0.png)


2. 「**Image**」をシーンにドラッグ&ドロップする
変な位置に配置されちゃっても、あとでいくらでも調整できるので、今は気にしなくて大丈夫です。
![imageのドラッグ&ドロップ.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401966/709914cf-46d6-069d-0305-5280cce3fbff.gif)

3. 「**Hierarchy**」から配置した「**Image**」を選択する
![hierarchyからimage選択.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401966/5938ccc9-fbf4-0a5f-936d-84b39595722e.png)

4. 「**Properties**」の「**Image URL**」に画像のURLをコピペする
公開されている画像のURLであれば、なんでも大丈夫です。今回は以下の画像のURLを使っています。
https://hubs.mozilla.com/docs/img/hubs-business.jpeg
正しいURLを入力して、「Enter」を押すと、右端に出ていた赤い:warning:マークが消えるはずです。
![imageUrl.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401966/e41f4589-7f65-18f0-f2cf-8c5a903f54c2.png)

## 3. オブジェクトの位置を調整する
位置を調整します。
方法は2つあります。
ちなみにこれは、オブジェクトの大きさを調整する時（「**Scale**」）も向きを調整する時（「**Rotation**」）もほぼ同じです。
大雑把で良いなら方法１で良いと思いますが、細かい調整をしようとすると、方法２が良いです。使い分けましょう。

ちなみに視点の変更は、左クリックをホールドしながらシーン内でドラッグをすると、変更できます。
あと、Tipsですが調整したオブジェクトがうまく見えないときは、そのオブジェクトをダブルクリックするといい感じの視点になってくれます。

方法１：シーン内で調整する
左上の4方向の矢印（[T]translate）のモードが選択されていることを確認してください。選択されてると、青くなってるはずです。
で、赤・青・緑の矢印をそれぞれ矢の方向に引っ張ってください。引っ張った方向にオブジェクトが動きます。
![配置シーン.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401966/4a8da802-48ff-2aae-2327-0bee150e2531.gif)

方法２：「Properties」で調整する
ちょっとわかりにくいかもですが、「**Position**」の「x」「y」「z」付近にカーソルが来るとカーソルが変わると思います。
左クリックをホールドしたまま、
左に動かすと、値が小さくなります。
右に動かすと、値が大きくなります。
また、カーソルで調整せずに、値を直接入力することもできます。
![配置properties.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401966/d59cef08-bf45-ed76-1606-3d8461e9db92.gif)

## 4. オブジェクトの向きを調整する
向きを調整します。
さっき書きましたが、こちらも配置の調整と同じく、2つあります。
向きが変わったことをわかりやすくするため、同じ画像を2つ配置しています。ここではそのうち1つの向きを変更します。

方法１：シーン内で調整する
左上の2方向の矢印（[R]Rotate）のモードを選択してください。選択されてると、青くなってるはずです。
あとは、調整したい向きの円（赤・青・緑）を左クリック&ホールドして、回したい方向にマウスを持っていきます。
![向きシーン.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401966/8ec0ed00-8be5-822a-e67d-10b5d9292d17.gif)

方法２：「Properties」で調整する
配置の調整と全く同じなので説明は省略して、GIFだけにします。
![向きproperties.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401966/5263178a-ac9f-e61e-7b88-4ed41f74b92d.gif)

## 5. オブジェクトの大きさを調整する
大きさを調整します。
こちらも配置の調整と同じく、2つあります。

配置や向きの調整と異なるのは、デフォルトだとx、y、z共に同じ値になります。
:link:のマーク（「Uniform Scale」）をオフにすると、x、y、zそれぞれ好きな値に設定できます。

方法１：シーン内で調整する
左上の2方向の矢印（[Y]Scale）のモードを選択してください。選択されてると、青くなってるはずです。
真ん中の白い立方体をクリック&ホールドして、右上に引っ張ると大きくなります。反対に引っ張ると小さくなります。
![大きさシーン.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401966/668dac50-7c89-08d6-bc66-ca6e936fb5f6.gif)

方法２：「Properties」で調整する
配置の調整と全く同じなので説明は省略して、GIFだけにします。
![大きさproperties.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401966/00de5b25-ff8b-fb13-b119-d13c6c61fe0a.gif)


## 6. オブジェクトを複製する

さっき配置したImageを複製します。
Imageだとあんまり複製する意味が感じられないかもしれないですが、Architecture Kit編では、複製はかなり使います。というか使わないと普通に大変です。

1. 「Image」を複製する  
ショートカットは、「Command + D」（Macの場合）です。Windowsのショートカットはよくわかりませんが、右クリックして「**Duplicate**」を選択すればできるはずです。  
複製元と全く同じ位置に複製されるので、わかりやすいようちょっと位置をずらしておきましょう。
![複製.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401966/0e734796-586e-8c71-29e2-4ea39882f8db.gif)

## 7. カメラの位置を調整する
カメラの位置を調整します。
ここでのカメラは、ルームを作成するためには必ず必要になるものです。
ここで撮ったものは私が知る限り、以下の2つで使われます。

* ロビーの開始点
* サムネイルの画像（作成したルームは、URLで共有することができますが、その時に表示されるプレビュー画像とかです）

どっちかというと、最初のロビーの開始点の方が重要な気がします。ロビーというのはルームに入る前の場所のことです。一度でもMozilla Hubsを使ったことあればわかると思いますが、「[Hubs ロビーからルームへ](https://support.mozilla.org/ja/kb/lobbies-and-rooms-hubs)」を見てください。
Hubsのルームには最大25人までという制約がありますが、これを超えても、ロビーからであれば部屋全体をマウスで視線を変えて見ることができます。（参考：「[Maximum Capacity](https://hubs.mozilla.com/docs/hubs-room-settings.html#maximum-capacity)」）
変な位置から始まっていると、ぱっと見なんのルームなのか分かりにくいですし、
残念ながらルームに入れなかった人たちがロビーに来て、例えば空しか見えない状態とかだと普通に悲しいですよね。

1. 「**Hierarchy**」から「**Scene Preview Camera**」を選択する  
視点を変更して、撮影したいシーンが見えるようにしておきましょう。
2. 「**Properties**」の「**Set From Viewport**」を選択する  
すると、カメラが今見えているシーン（つまり私たちが見ている画面）と全く同じものが見えるように良い感じに移動してくれます。
よくわからんって人は、二本指でシーンを引いて遠目で見てみると、何を言っているのかわかると思います。（二本指というのはトラックパッド使用者向けに言ってます）
![カメラ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401966/177a6c78-e293-df2b-5642-7d397e2dccd5.png)

ここまで説明しておいてなんですが、Mozillaが公開していたチュートリアルや他の人のチュートリアルでは、別にこのカメラの調整してなかったんですよね。
SaveまたはPublishする時点で、写っているシーンがそのままロビーやサムネイルに使われるらしいのですが、私はそれがうまく行く時とうまくいかない時があったので、念のためこのカメラの位置調整は必ずやるようにしてます。
「[Add Scene Preview Camera Node #1011](https://github.com/mozilla/Spoke/pull/1011)」を見るに、おそらく私と同じ問題が発生するユーザーがいたので「Scene Preview Camera」が追加されたみたいですね。

## 8. Save（保存）する
保存します。別に最後に保存する必要はないです。ブラウザが固まったりすることが往々にしてあるので、こまめに保存しとくほうが良いです。
と言っても、オブジェクトがたくさんあるシーンほど保存するのもちょっと時間かかりますので、まあ程々に。

1. 保存する  
ショートカットは、「Command + S」（Macの場合）です。  
マウス操作でも保存できます。**ハンバーガーメニューの横三本線 > File > Save Project または Save As** ですね。  
すると、Save Projectっていうのが出ますので、「**Save Project**」を押しましょう。（何言ってんだろう笑）  
ちなみにここで出てくる画像が、カメラで撮ったシーンになっています。ここが想定外の画像になっているということは、カメラの位置がおかしいので、直しましょう。
![saveas.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401966/fc0b2b7e-26b6-6b28-8761-bb7d99d5e0e8.png)
![save.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401966/a11b315d-334d-e81e-1137-072ab3edf150.png)

## 9. Publishする
やっと、HubsにPublishする時がきました。  

1. 右上の「**Publish to Hubs**」を選択する。 
![publishtohubs.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401966/81f38874-442e-2e7d-6b81-8e33b8f745e7.png)

2. 「**Save and Publish**」を選択する。
いくつかオプションが見えてますね。
私は毎回どれもチェックなしでPublishしてました。
Mozillaの説明(英語)はこちら→「[How to Publish and Export Spoke Scenes](https://support.mozilla.org/ja/kb/how-publish-and-export-spoke-scenes)」  
私も使ったことないのですが、上記を読むに、
「Allow Remixing」は、他の人が私のシーンをダウンロードしたり、編集したり、再Publishできるよ
「Allow Mozilla to promote my scene」は、Mozillaが私のシーンをもっとより良くしてくれるよ
ってことらしい。（酷い訳だ。。）
自分のシーンを他人が使ったり、勝手にシーンを変えられたくないのであれば、どちらも未選択で良いと思います。
![saveandpublish.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401966/58e2a0af-83d7-4fa1-dc7c-140c77e25967.png)

3. 「**Publish Scene**」を選択する  
これも保存する時と同じで、重いシーンほど時間かかります。
あとここで、「Performance Check」の結果が出ます。今のところは「High」「Medium」「Low」の3段階ですね。
これがHighに近づくにつれ、ルームでの操作が重くなります。
体感だと、MobileやVRデバイスでの動作が遅いです。あと、サイズやポリゴンが大きいオブジェクトがあったりすると、なかなかルーム内に表示されません。あと何より、Publishしたり保存したりするのにかなり時間がかかるようになります。
ここら辺を見て、なんとか調整しましょう。→[Optimizing Scenes
](https://hubs.mozilla.com/docs/spoke-optimization.html)
私はこれを知らなくて、気に入ったオブジェクトを配置しまくっていたら、5項目中4項目がHighになって、案の定何をするにも動作が重くなって不幸になりました。その後頑張って軽くしましたが、実はまだちょっと重いんだよな。。:sweat:
![publishscene.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401966/90a3aa97-029b-8505-3423-f3f1b5bdba31.png)
ちなみに、一度でもPublishをしたルームのリンクは、自らルームをCloseしない限り有効です。
つまり、Publishしたことのあるルームの場合は、「Save and Publish」し終えたら、そのリンクをリフレッシュするなり新しいタブ/ウィンドウで開き直せばOKです。もう保存済みのシーンが反映されているはずです。もちろん、次の4に進んでもOKです。

4. 「**View Your Scene**」を選択する
やっとルームに入る手前まできます。これを押すと、新規タブが開きます。
![viewyourscene.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401966/8f090045-0ec0-3a2c-e9a1-337fb9784b6d.png)

## 10. ルームに入る

ここまででもうSpokeの説明自体は終わりなのですが、せっかくなのでルームに入るところまで説明します。
ここから先はもうわかるから良いよって人は、飛ばしてください。

1. 「**このシーンで部屋を作成**」を選択する
![createRoom.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401966/b6fdba64-ef37-7221-913c-ea5d3e9ac8d1.png)

2. 「**ルームに入る**」を選択する
![enterrooom.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401966/b8790237-168a-fa92-f1e8-1a53b598dcf8.png)

3. 任意の「**名前**」と「**アバター**」に変更する
別に変更しなくても、デフォルトで勝手に名付けられるし、アバターも割り当てられるんですが、
好きな名前をつけた方が相手も見つけやすいですし、アバターもたくさん種類があるので（何なら自分でアバターも作成できますし）
デフォルトじゃない方が色々楽しいと思います。
ちなみに↓はハロウィーンのときにどなたかが作成してくれたアバター。エスニックな感じが可愛くてお気に入りです。
![nameandavatar.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401966/12f26000-5529-c847-5a7e-bebe9f87fb0c.png)

4. 「**承認**」を選択する
![approve.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401966/3f0a3346-d4f1-9305-df9d-09cd88ca8651.png)

5. マイクの使用を許可して「**次へ**」を選択する
![mike.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401966/f6855403-2e32-a4b4-addf-d54eb4578498.png)

6. 「**入室する**」を選択する
これで入れます!
あとはルームで好きなだけ遊びましょう。操作方法はここでは割愛します。
ここにいっぱい載ってますので、ご参考までに→「[Hubs ルーム内での操作方法](https://support.mozilla.org/ja/kb/hubs-room-experience)」
![enter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401966/7555c2d0-5169-4306-eb64-203ab27f59cb.png)

# 最後に
やっと書き終えたって感じです。
ちなみに今更ですが、Mozilla HubsもSpokeに関するドキュメントはたくさん出しています。
こちら→「[Spoke Documentation](https://hubs.mozilla.com/docs/spoke-creating-projects.html)」
なのですが、作ってみようというよりかは辞書っぽい雰囲気が強いように感じました。これを見ればとりあえず訳わからなくても、ルーム作成の流れが掴める！という感じではないのですよね。
ちなみにそういう動画(英語)はあります。まあでも最初に書いた通り、あのテンションで母国語以外は無理でした。はい。
（※英語は好きな方ですので、元気がある時は頑張って読みます）

なので、今回この記事を書くに至りました。
これ読んだら、あとはSpokeでガンガン作ってみて、わからないことがあったらドキュメントを読むのが良いと思います。
少なくとも私は、Mozillaが出してる公式のドキュメント（英語ですが）を読めば解決できたことがほとんどです。

以上で終わりです。
誰か（もしくは未来の私）の役に立ったらいいな。