クワマイでもできる

クワマイでもわかる

VRChatに銀河を作る[1]

f:id:kuwamai:20180912190228p:plain VRChatで星を立体的に見れたら楽しそうだと思った。最終的に星の位置情報に合わせてパーティクルが光るワールドを作ってみた。色々初めてのことが多かったので、メモ。Unity初心者が見よう見まねでやった記録なので、多分もっと良い方法があります。

できたもの

こんな感じで立体的に星がパーティクルとして表示される。

つづき

この記事を書いた後にあれこれ大幅にアップデートした。その話はこっちに書いた。

ネタを考える過程

なぜ星を表示しようとしたのですか?と聞かれまくるので書いておく。

僕にとって今回が初めてのワールド製作で、VRChatのSDKに関して知識が一切ない。せっかく作るなら面白いワールドにしたかったので、簡単かつ面白そうなテーマを考えていた。

モデリングもできないので、教育機関向けに公開されてるデータを持ってきて置くだけならできそう。多分星の位置情報とかありそう。「星 位置 データ」でGoogle検索したらヒッパルコス星表が出てきました。要するに何ら脈絡はない。さらにいうと僕自身天文に関する知識はオリオン座が見つけられる程度。光ってる星の名前がわかんなくても星は綺麗だよね。

制作の記録

星の位置データを入手

星の位置はヒッパルコス星表というものが有名らしい。
以下の記事が参考になりました。

参考サイトにある通り、下記サイトからヒッパルコス星表がダウンロードできる。

HEASARC Browse: Search of STAR CATALOG Catalog(s)

必要な項目にチェックを入れる。今回はname, parallax(距離), vmag(明るさ), ra_deg(赤経), dec_deg(赤緯)を選択。 通常天文では角度を時, 分, 秒で表現されたものを使うらしいけど、普通に度の表記も選択できた。ありがたい。

f:id:kuwamai:20180914202102p:plain

チェックしたらLimit Results ToをNo Limitにする。そしてStart Search。これで該当する星が全部出てくる。今気づいたけどOutput Formatの項目でもう少し読み込みやすい選択肢があったかも。今度機会があったら見てみる。

f:id:kuwamai:20180914202434p:plain

データの前処理

ダウンロードするとこんな感じでずらっとデータが書いてある。

Results from heasarc_hipparcos: Hipparcos Main Catalog
Coordinate system:  Equatorial
|name      |parallax|vmag |ra_deg      |dec_deg     |
|HIP 48752 |    4.17| 7.84|149.16726051|-89.78245385|
|HIP 71348 |    2.08| 6.82|218.87831588|-89.77169600|
|HIP 42708 |    2.39| 7.20|130.51854607|-89.46050180|

よく見るといろいろ項目が空白になっているものもある。

|HIP 62662 |    8.73| 9.23|192.59313824|-88.12099013|
|HIP 57037 |        |10.84|            |            |
|HIP 32914 |        |11.43|            |            |
|HIP 46043 |    2.62| 9.68|140.84701457|-87.97397795|

プログラムで対処するのが面倒なので、事前にコマンドで取り除いた。随分乱暴だけど、とりあえず以下のコマンドで空白がある行を除去できる。
BrowseTargets.1213.1536347830とは僕がダウンロードしたヒッパルコス星表のファイル名のこと。これでhippa.txtに空白のないデータが保存された。

$ grep -v " " BrowseTargets.1213.1536347830 > hippa.txt

座標系の変換

星の位置は角度と距離で表現された球座標系。BlenderやUnityは直交座標系なので変換する必要がある。変換するスクリプトPythonで書いてみた。

で、ひたすらxyzが並んだデータができた。

https://raw.githubusercontent.com/Kuwamai/3d_HIP_mesh/master/hippa_pos.txt

モデリング

この方法が一番いいのかわからないけど、星の位置を頂点とする3Dモデルを作ることにした。BlenderPythonで動かすことができる。今回みたいにたくさんのデータに従った3Dモデルを作るときは便利そう。BlenderPythonを動かす方法は下記のサイトが参考になりました。

追記(2020/10/01): ↑の記事がリンク切れだったので↓の記事を参考にしました

で、僕が書いてみたスクリプトはこんな感じ。

できた3Dモデルがこちらになります。ウニみたい。fbxでエクスポートしました。

f:id:kuwamai:20180917161653p:plain

スクリプトにエラーがあるとコンソール画面に出るらしいんだけど、macだと後からコンソールがひらけない。ターミナルから起動する必要があるらしい。

ターミナルからBlenderを起動

Unityの作業

Mesh Particle Emitter

できた銀河のモデルをUnityに置いて、Mesh Particle Emitterを適用すると、モデルの各頂点からパーティクルが出てくる。公式のマニュアル通りにやったらできた。

https://docs.unity3d.com/ja/current/Manual/HOWTO-MeshParticleEmitter.html

VRC SDK

なんと、ワールドにするにはVRCWorldというPrefabを一個置くだけで良いらしい。こちらの記事が参考になりました。

デフォルトでジャンプができないらしく、PlayerModsを適用させるらしい。こちらの記事が参考になりました。

つまづいたところ

Blenderモデリングする際、頂点データさえあればMesh Particle Emitterが適用できるかと思ったけど、パーティクルが出てこなかった。なのでBlenderスクリプトは頂点を設定した後に面を張っている。

今後の展望

もっと作り込めば普通に楽しめるコンテンツになりそう。とはいえ続ける時間も気力もないので、星が好きなVRChatユーザーの方がいらっしゃれば続きをやっていただきたいです。。。

星座の表示

正直どの星が何なのかさっぱりなので、有名な星座を構成する星は色を変えるとかした方が分かり易そう。オリオン座を横から見てみたい。

銀河の回転

よくプラネタリウムは何時何分の空ですとかやってるから、この銀河のオブジェクトを回転させる仕組みができたら実現できそう。シェーダーで頑張れば時間も出せるはず。知らんけど。

軽量化

VRChatでパーティクルを数十万も出すもんじゃない気がする。ただ点が出てれば良いだけなので、何かもっと軽量な方法を知りたい。点群情報をテクスチャに埋め込んで、シェーダーで表示する方法とかあるらしい。

この記事が参考になるらしいんだけど。。。来世読む。

星の増量

今回はヒッパルコス星表を試したけど、もっと星の多いGaia星表というものがある。使えそうなデータだけで10億。

こちらの記事を参考にDLはできたけど、星が多すぎて宇宙ヤバイ。絞り込み検索すれば良いわけだけど、銀河からいい感じに星を絞り込む知識皆無。いつか再挑戦したい。

http://astro1.sc.niigata-u.ac.jp/~nishi/Gaia/HTUJ.html