PSF進捗まとめ #3

いろいろな夏の準備も着々と進んでいたり進んでいなかったりしますが、とりあえず直近の進捗まとめです。

ちなみに、ワールドのリリース時期は本物の蝉の声と『本質的な』蝉の声が混ざっちゃうと嫌なので夏以降にリリース予定です(そもそも間に合わない)。


ポスター

某海の家の店主から「ヘイヨツミちゃん、あんたの夏のポスター私のところに貼らない?」と言われたので「制作開始のポスターも半分やっつけだしちゃんとしたバージョンも作りたいなぁ」ということで新規に制作しました。PSFの制作に際しては承認要求駆動開発(訳:Twitterに上げる画像や動画をチェックポイントとして開発を行っていく)を採用しているので、このポスターを作るにあたって床やら壁やら古き良き掲示板やらを作った形になります。その他のモデルについてはすでに作ってあって公開していないものを配置し、なんやかんやで計45万ポリゴンになったのをじっくりと焼き上げました。

夏といえば、頭蓋骨、拳銃、徹甲弾、3軸ジンバル構造、4人目の人物、不気味なほど青い空、「月」のシンボル、「BREAK THE SUMMER, BREAK THE TOWER, COMPLETE THE MERIDIAN LOOP」、ハイパースマートスピーカー、かわいいくらげのぬいぐるみですよね。

個人的には月をかたどったガードパイプがお気に入りです。現実の風景を再現する以上はオリジナリティーが出しづらいという問題があるのですが、こういうのがあるとウォーターマークとしてうまく働いてくれるので。


LC-3

まだまともに見せてもいない世界観を早速崩しにかかってますけど大丈夫ですか ハジキです。銃、いいですよね。前前作前作と比べると作風が違いすぎると言われればそれはそうなんですが、そう言われると前作は前前作と内容が正反対だし前前作もそれ以前の作品と比べるとまるっきり違うので人生そんなもんじゃないかと思います。

これらの画像はBlenderのCyclesでレンダリングしました。ブルームとかDoFとかもいい感じになるように入れています1。アバター部分に関してはこちらの資料を参考にしています。

Cyclesではレイトレーシングしてくれるので金属表面もきれいに描画してくれるわけですが、当然このモデルをそのままワールド(Unity)に持っていくとReflection Probeが映るだけでディティールが全部潰れてしまうので、ワールドに置いてあるバージョンはちゃんと塗ってあります。ちょっと待ってください、なんで「日本の夏」のワールドに拳銃が存在するんですか???

ちなみに、実はルピさんはこの銃を持てません(おててがちっちゃすぎるとかそういう問題ではなく、本質的に)。なので画像はイメージです。

特にネタバレにはならないと思うのでついでに言っておくと、表面の文言は「神は我々を祝福する」という意味になります。祝福、されたいですよね2


望遠鏡

望遠鏡も今後使う予定™なので「1%の仮想」のエントランスにあったものをアップデートしました。ちなみにこの望遠鏡は特定の製品をモデルとしたものではなく(そもそも天文は全然詳しくない)、いろいろなモデルをざっと調べてそれっぽく仕上げたものなので、天文警察の方はご配慮ください……。

ルピさんについてはアバターの改変差分データを持っている私が勝手に追加したもので、とくに深い意味はないです。かわいいかなと思って🐸


深夜のコンビニ

夏といえば深夜のコンビニでソーダ味の棒アイスの買い食いです(ほんまか?)。そんなわけでコンビニを一軒建ててみたのですが、ただ室内の様子を撮ってみても面白くないので平行投影でぐるぐる回してみました。平行投影、いいですよね3

よく見るとわかることですが、このコンビニでは棚に陳列されている商品のディティールは重視せず単に虹色で塗りつぶしています。こういう現実っぽいディテールを細かく描くのは例えば「1%の仮想」の「ハイパースマートスピーカー」のデータシートのように個人的にはわりと好きなのですが、実は今回は「最高の夏には『ことば』は必要ない」4というコンセプトのもとに極力フラットな表現に抑えています。

この動画では自動ドアは単にアニメーションさせているだけですが、実際にワールドに配置されるコンビニではもちろん自動でウィーンしてくれるようになる予定です5


水族館

夏といえば水族館でのデートです。まあ、VRChatだとカップルでワールドめぐりする人たちもいると思うので……。(カップルのために場を提供するワールド制作者の鑑)

この水族館はエントランスから6部屋+ミュージアムショップを通って戻ってくるというごく普通の構成です。ただし、描画負荷を下げるために極力2つ先の部屋が見えないように部屋や通路の配置を工夫しており、かつ「大部屋を斜めに突っ切るキャットウォーク作っちゃおうぜww」「順路のシメに巨大水槽ぶち抜きの通路作っちゃおうぜwww」といったアホ案を極力採用しています。あとで後悔するのは自分なのに。

ブログに書こうと思ってたことを先にツイートしちゃいましたが、この水族館ではよりリアルな空間を演出するためにVR空間で不要のはず(身体に障害のある方でもVR空間では普通に動けるので)のバリアフリー対策らしきものをしています。ツイートの画像では全ていい感じに隠れちゃってるのですが、実際は階段で高低差をつけている箇所にわざわざエレベータを設置していて、本物同様に昇降できるようになっています。少人数制作である以上は愚直にコンテンツ(=水族館)を作り込むだけではなくこういう脇道にそれたギミックを作ったほうがコンテンツの体験時間や満足度を水増し上げられると思います6

ちなみに、このあとのツイートで「魚群を作ってから水族館を作るまで2ヶ月放置してる」と書いてましたが調べたところこれは大嘘で、4月はじめくらいにはすでに水族館はできてました。単に進捗ツイートキュー(だいたい1ヶ月分くらいは常に持ってる)への追加が遅かったみたいです。てへ。


ダイダン

ダイダンって何ですか???

巨大な重機(しかも変形する)ってなにか興奮と恐怖心を同時にそそられるものがありますよね。全編にわたってそういうノリです。

この動画はレンダリングにめっちゃ時間がかかるのでファスさんと右のダイダン(だからダイダンって何ですか???)を除いた状態でレンダリングして、そのあとに右側だけ静止画でレンダーしたものを合成しています。もちろんデカブツの有無によって動画と静止画では色味が微妙に変わるので、うまい感じにブレンドして。

ちなみにこの動画で見えている「脚」は計△6kくらいです。ではそのように。


PSF進捗まとめ #2

前回に引き続き作者による週間クリフハンガー #PROJECT_SFツイートのコメンタリーです。こういう「作者による解説」って作品を深く楽しむうえでいいですよね。


深夜の信号機

信号です。

VRChat界隈では、ワールドは「目に見える動き」がなくても案外自然に受け入れられるもので、実装されているとしてもパーティクルや水面シェーダー等の規則的な動きをする効果が典型的です。そこで、この場所では+αで「人の介在を感じさせる動き・人に影響を与える動き」「ただの背景ではなく、強制力のある動き」として明滅する信号機を作ってみました。

この信号はアニメーションではなくシェーダーで実装しており、高さとUVで歩行者用・車用のどの色かを識別して動かすという超アドホック実装となっています。また、「交差点が常に90度で交差する」という制約をかけることで、ヨー方向からどちらの道路に所属するかを計算して配置するだけでいい感じに信号として成立するようにしています1

コメントからは本当は3月下旬の春の気配がする深夜の住宅街が作りたい感(前回の記事参照)が滲み出ているような気がしますが、公式には真夏の夜の信号機です。

この動画ではルピさんがなんか「近づけば消えてしまいそうな、儚げな真夏の少女」的存在感を醸し出してますが、実際は単に自販機までジュースをパシってるだけです。いずれ一緒にギミックを試してもらったりとか動画でちょっとしゃべってもらったりもしようかと思っていますので、ではそのように。


おさかな

手がガラス突き破ってますが大丈夫ですか夏といえば水族館デートです(ほんまか?)。

これはボイドと呼ばれるアルゴリズムを実装して魚を1024匹出してみたものです。この記事を読んでくれている人はこれと同じものを当たり前のように実装できるか、あるいは何をやってるのか全く分からないかのどちらかだとは思うので技術的な説明は省きますが、ポイントとしては時間方向とおさかな方向のループの順序を適当に入れ替えることで1フレームあたり数十おさかなの処理だけで相互作用らしきものを表現しています。

普通の水族館の大水槽で見られる「ボイドっぽい魚群」を観察してみると、動画のものよりももっと(水槽と比較して)小さくはっきりとまとまっています。ただ、動画の場合は実装がシェーダーベースである関係上、魚群がはっきりと分かれるくらいまでクラスタ内の引力を大きくしてしまうと同期を全くしていないのがバレてしまいます。なので、この動画の時点では「通常の飼育環境ではありえない超密集飼育」っぽい展示にしています。あとパラメータ調整が面倒でこれ以上いじりたくない2

この動画の時点では「位置情報のメモリを直接テクスチャとして使ってみたらなんかきれいだった」という理由でになっていますが、あとあとLUTを使うなりして現実的な大水槽の展示に即した魚の種類の分布にします。未来の自分が。

ちなみに、それぞれのおさかなは左右に身を振りながら泳いでいるように見えますがこれは偶然で、前述のような近似計算を実装した結果たまたま発振しているという偶然の産物モーションです。

この動画ではファスさんがなんか「水族館で出会った、ミステリアスな雰囲気と狂気とをあわせもつ少女」的存在感を醸し出してますが、実際は単に「そのままだと絵が地味だから」という理由で水槽を眺めてもらってるだけです。いずれ一緒にギミックを試してもらったりとか動画でちょっとしゃべってもらったりもしようかと思っていますので、ではそのように。


田舎の家の「もと」

日本の夏を再現するためには、日本の住宅をいくらか配置する必要があります。かといって、まったく同じ構造の家のモデルを並べていくと「繰り返し感」が出てしまうので、いい感じに多様性のある家のモデルを数十軒作成する必要があります。

こういった街や建物のプロシージャル生成の先行例自体はたくさんあるのですが、

  • 従来は「上空から俯瞰するのに耐えうるモデルの生成」が目的であることが多いのに対してPSFでは「原寸大」のモデルを横から見ることがメイン
  • 完全に乱数ベースで単一のモデルを作ってしまうとギミックや演出を実装するときに扱いが厄介
  • そもそも実装に時間かけたくない

のでもっと簡単な方法を採用しました。

それは矩形の集まりに窓や扉を手で貼っつけていくという温かみのある手法です。Googleマップ等で住宅街を上から見るとわかりますが、たいていの日本の家は「道路に平行な面を持つ1〜4個程度の直方体の適当な和集合をとって上に1〜2個程度の屋根の和集合を乗っけたもの」に分類されます。なので、このルール通りに豆腐(1枚目のやや上側)と寄棟屋根(1枚目の左側)を組み合わせて壁に扉や窓を貼り付けると家っぽいものができます3。 テクスチャは後でなんとか自動化します4

このようなコンポーネントベースの方法でも自動化はできそうな気はしますが、「玄関は道路に面しているのが基本だが、防犯上や立地上の理由で路地を曲がった側面にある場合もある」「ベランダは南向きにある家が一般には好まれる」みたいなルールを書いていくのも大変そうなので手作業でやりました。

また、ただ家を作っただけだと味気ない(生活感がないと不気味に見える)ので装飾となる田舎にありそうなモデルもたくさん用意して配置します。私の一押しポイントは「ただ横に数個並べるだけで圧倒的『田舎感』が出る長方形のプランター(プラスチック・薄茶色)」です。


試験用ワールド

「作業する前に、作業部屋を作らない」とは私のとあるフレンドの言(げん)です。

今後ワールドの各コンポーネントの写真や動画を撮ってTwitter等に上げることによって承認要求を満たすことが予想されるのでささっと作成しました。住宅街のど真ん中でギミックの実演をしてても変かなと思ったので……。(とかいいつつ信号は普通にワールドに配置してるのを撮ってる)

このワールドでは私のワールドにしては珍しく(?)ノーマルマップが入っています。これは「まあ適当にパーリンノイズを貼っ付けておけばそれっぽくなるだろう」と思ってまあ適当に貼っ付けたもので、たぶんワールド本体もこういうノリで絵作りすることになると思います。


Player-replayer

どこまでも手間のかかることを……!5 6 7 8

アバターを指定した姿勢に追従させる方法はいくつかありますが、Unity本来のIK機能についてはUdonのOnAnimatorIKが呼び出されない(要調査)ため使用できず、Final IKのBiped IKについても細かいチューニングが大変だったり頭のロールが設定できない(要出典)ため、今回は「各ボーンの姿勢を愚直に記録・上書きする」という方法をとりました。

現在のUdonSharpではVRCPlayerApi.GetBone{Position,Rotation}(HumanBodyBones)でプレイヤーのボーン姿勢は取得できますが、HumanBodyBonesをいい感じに列挙したりすることができないらしいので、「『姿勢のコピーと追従するTransformの取得をベタ書きする実装』を自動で生成するスクリプト」を書いて対応しました。あとは適当な長さのバッファに突っ込んだり取り出したりするとリプレイが出来ます。注意点として、ボーン構成(長さや初期角度)が完全に一致したアバターでないと再生時に名古屋駅前みたいになっちゃうので、「任意のアバターの動作を再現するリプレイ装置」を作るためにはそれなりに工夫する必要があると思います。


その他のツイート

はい。

ちなみにルピさんはどんなときでも常にフルトラでわちゃわちゃしてて、ファスさんはこういう時(見栄え重視でない時)はだいたい3点トラッキングで来ます。


次回の記事くらいから本格的にギミック関係も紹介できればいいですね(言うだけはタダ)9