PSF進捗まとめ #5

忘れてた 久しぶりに、PROJECT: SUMMER FLARE関連のツイートまとめ。

まだまだ絶賛作業中なのですが2020年中には公開したい……!


LC3関連

「一日前」でも出てるヤバい銃ことLC-3です。

ゲームに登場する普通の銃(?)ではステージ内の弾薬を拾って使うのが一般的ですが、VRChatの場合はパフォーマンスやプレイヤーまわりの仕様があまりにも複雑で制御しづらい1ため、なんか不思議なしくみで銃弾が無限に使えるようになっています。この銃、いつか機会をうかがって物理でも作ってみたいんですけど、こんな小型の2色16セグLEDは実在するのか……?

スリーブガンという仕様は「本編で銃をずっと持ってワールドをまわるのが(特に物理的に常にコントローラを握っている必要があるIndexコントローラの場合)つらい」とか「両手を使わないと進めない場所がある」という理由で実装したものです。なので、大して歩き回る必要のない「一日前」ではこの機能は有効になっていません。ただ、右腕に常に銃がくっついてくるのは微妙にウザいのと、手を振ったときに誤爆しやすいので、もしかしたら別の仕様で銃を持ち運ぶように変更されるかもしれません。なんかこう、手を前にパッと突き出すと「召喚」されるとか……


望遠鏡

「一日前」でも出てる望遠鏡です。

そもそも「一日前」のエントランス部分は「1%の仮想」のセルフパロディで、そっちの方の演出の〆で使ったギミックをこっちにも持ってくるという目的で実装しました。もちろん本編でもいい感じの場面で出てくると思います。望遠鏡、月、仮想、何も起こらないはずはなく……

この望遠鏡はツイートのように実際にものを見ることができます。倍率とか、覗き込んだときの像の見え方とか、いろいろツッコミどころが多いギミックなんですけど、Half-Life: Alyxに毒されてワールドに置かれた機能的なオブジェクトが本来の機能を持っていないのが気に入らないのでそれっぽく望遠鏡してくれるようにギミックを作りました。技術的には、頭と接眼レンズの位置から見え方を計算して視界ジャックの要領でものを見せています。また、このギミックはVRモードとデスクトップモードで挙動が違っていて、VRでは実物よろしく見たいものが視界の中央に来るように顔を動かす必要がありますが、デスクトップモードではそのような細かい調整はできないので、単に頭を突っ込むと像が画面中央に表示されます。


「一日前」の小物類

私たちはその先に進めるのでしょうか?
天まで届くあの塔を超えた、その先へ?

ここらへんは「一日前」のワールドとかギミックの紹介です。詳細は、実際に訪れてみてください。

ホワイトボードにいたっては手で触って回せる必要はまったくないのですが、単に没入感が出ると思って実装しています。VRChatではオブジェクトのオーナーでない人がオブジェクトを動かしてもすぐオーナーが保持している姿勢で上書きされてしまう(結果よくわからないもぞもぞした動きをする)ため、ホワイトボードに近づいた人に自動でオーナーシップが移動するようにしています。地下にあるLC-3用の的についても、近づいた場合かLC-3を持った場合に自動でオーナーシップの移動を行っています。


ダイダン

だからダイダンってなんですか?

4本足の重機のアニメーションを手付けでやるのはとてもじゃないけどやってられないので、Udon様にお願いしたデモです。油圧シリンダーの動きも(Constraintの勉強をするより書いたほうが早いので)すべてUdonで実装しています。動画内の赤い球は足先の目標地点で、足先が到達できないような姿勢になるとレイを飛ばして場所を再設定します。動画の時点では足先が現在の姿勢のみから決定される(移動方向は考慮しない)ため急峻な坂では体が引っ張られるような挙動になっています2。が、実際に使われるシーンではいろいろな制約があるので見かけ上そこまで問題にはならない……はずです。


アーム

うで。私の作品は例のごとく†解釈†がただひたすらにややこしいので、解釈違いが発生しないように慎重に実装を進めてまいります。

ダイダンもあるように、PSFでは「フルスクラッチアバターを何体もワールドの演出として使用する」とかいうVRChat界隈的には非人道的な人月の使い方をしているので、のちのちアバター単体の販売とかもできればいいんですけど、こいつの場合は扱いがややこしいのでいろいろ検討中です。

というかこの腕とLC-3のプロトタイプは2018年にすでにツイートしてるんですよね。もとは3本指だったのですが当時はスキニングの概念を知らなかったHumanoidアバターの構造との相性を考慮して新規にモデルを組み直しました。


夏の景観

夏、いいですよね。なんてことない住宅街の路地裏も、「最高の夏」としてラベリングされてしまうと、もう帰りたくなくなっちゃいますよね。


水族館

アクアリウム。

魚群は大昔に書いたシェーダーで1024匹のボイドを計算し、それらの一部か全部を描画するSkinned Mesh Rendererを複数配置してくことでたくさんの魚を表現しています。とくに、水槽によっては細長い空間に魚を満たす必要があるため、同じCustom Render Textuerを使いながら描画側のシェーダーのパラメータをいじることで魚の描画範囲を変更しています。そんなわけで、遠目によ〜く見ると水槽の長い辺方向の速度がやけに速かったり、2つの離れた魚群が同じような動きをしているように見えたりしますが、VRで見ていると(2つの意味で)視野が狭いのでそこまで気づかないと思います。

コースティクス的なアレは水槽ごとに設置したプロジェクターによるもので、Udonでプレイヤーがどの部屋に居るか検出してオン・オフを切り替えています。とくにこの水族館は2部屋先が絶対に見えないように設計してあるので、今いる部屋とその前後のみ有効にすれば不自然になることなく高コストなエフェクトをガンガン使用できます。


リスポーンシステム

本当は「一日前」の時点で実装するはずだったやつです。

VRChatではピックアップ可能なオブジェクトがどっか行くのは日常茶飯事で、ワールド作者側が厳密に制限することはほぼ不可能なため、進行に必要なオブジェクトをただ単に配置しておくだけでは必ず「詰み」が発生します。「1%の仮想」と「アスタリスクの花言葉」では徹底してピックアップオブジェクトの初期地点にリスポーンボタンを置いて対策していましたが、今回はもうちょっとスマートに自動で復帰するようにしました。

このリスポーン機能は青いUIを出すUdonの一部として実装してあるので、このUIが出るオブジェクトすべてに自動で実装されます。強いて言えばPortalシリーズとかBorderlandsシリーズ3における「統一感のあるリスポーンエフェクト」のようにメッシュがいい感じに消えるやつができればいいんですが、実装と動作検証に時間がかかりすぎるのであっさりめな演出になりました。


その他小物類

たぶん本編には出ないけど作りたいから作ったやつ、その1とその2。

見ての通り、謎の言語で書かれた洋(?)書と無駄に黒塗り4された学術論文(プレプリント版)です。実際はワールドを作ることに疲れて設定資料集を出すというていで試しにレンダリングした画像です。こういう「作中では登場しないかさらっと言及されるだけだけど設定上重要な役割を果たしてるオブジェクト」っていいよね……。洋ゲーとかをクリアしたあとにFandomを読み漁っちゃうこと、あるよね……。


はしご

はしご。VRChatの文脈でいうとCyanLaserさんのクライミングシステムとそれを使用したワールド群が有名だと思われますが、こちらはUdonで独自に実装したものです。

システム的には、「はしごの段を握った手を握った地点に近づけるように速度を与える」ように実装しています。そのため、(リアルの)手を動かしながら手を離すと、当然、動画のように飛べます。ただしこういうアグレッシブなレベルデザインを好き勝手できるかというとそうでもなくて、トラッキング方法・PCスペック・VR酔いへの耐性が人によってだいぶ違うことを考慮するとコンサバに作らざるをえなくなります。特に非VIVE/SteamVRベースステーション環境では真後ろに手を回したりできなくなるはずなので、まあ、「アスタリスクの花言葉よりは簡単なアスレチック」にはなるんじゃないかと思います。(それVery hardくらいのニュアンスになってない?)

このギミックではmasterとslaveと名付けられた2つのPickupを使用していて、はしごを握っていない場合にmasterが手から最も近い地点の段に移動し、masterが握られている場合のみslaveも使用されます。Pickupは「左右どちらの手で持たれているかを区別できない」「持てる手を左右どちらかに制限できない」「両手で同時に持つことができない」という致命的な弱点があるので5、2つのPickupをうまいことハンドルして両手でつかめるっぽくしています。動画で持つ場所のアイコンがなぜか持ち手の左右に寄っているのも「今は右手(または左手)で握られることを想定してるから別の手で持つんじゃねーぞ」という威嚇です6

このシステムでは1つのUdonBehaviourでワールド内のすべてのはしご(プレハブ)の位置をロード時に取得しているので、ワールド内にはしごプレハブをペッと置くとそれだけで登れるようになります。動画では1種類のはしごしか出ていませんが、本編では「前に進むやつ」とか(実装済み)、「横に進むやつ」とか(余裕があれば実装予定)、常識的な範囲で非人道的なギミックが出てくる予定です。こういうのはboothとかで配布(販売)すれば界隈内でウケるのかもしれないですけど、そもそもこういう「単体では無価値なギミック」7を1つの作品として昇華できる人はそもそも自前で実装できると思われるので、そういうスタンスで日々を生きています。


PSF進捗まとめ #4

UI会議

これUIのデザイン決定したあとに描いてません?

3Dのモデルやデザインを考える上で、最も簡単なブレスト方法はVR空間にペンを持ち込んで「空間上に描く」ことです。このやり方はVRプラットフォームの概念に慣れていない人から見れば「バーチャル空間上でディスカッションするなんて新しい!」みたいな感じかもしれませんが、廃人慣れている人から見れば「いや、あっちに『行って』考えればいいじゃん」みたいな感じだと思うので難しいものですよね。

執筆現在のVRChatでは、インタラクトまたはピックアップ可能に設定したオブジェクトについて、手やカーソル(デスクトップモード時)を近づけた時に水色のアウトラインと事前に設定したテキストが表示されます。ただし、これはあくまでミニマルなもので、SF映画でありがちな「空間に情報がシュイーンと出て手でシュッ!とやるとシュイシュイシュイッ!ってなる感じのやつ」をやろうとすると、やはり自分で作るしかありません。

しかし、自分でUIを作るとなると、今度はVRChat本来のUIが強制的に表示されてしまうためかえって邪魔になってくるわけです1。なので、このときは「VRChatのUIと自然に馴染む『装飾』としてのUI」ということで、後述するツイートのようにオブジェクトの前面にピコッとアイコンが出てくる形に落ち着きました。本当は直方体の角にマーカーが表示されるタイプでもよかったんですけど、デフォルトキューブとイメージが被りそうだったのと、ピックアップ中のオブジェクトに常に直方体がかぶさって見えるのがたいそうダサそうだったのでなかったことになりました。


自販機

で、出来上がったやつです。前述のような「対象となるオブジェクトの角になにかを表示するタイプのUI」だとこういった小さいボタンにうまく対応できないので、結果的にこういうアイコンタイプでよかった形ですね。ちなみに、この自販機の本体(UdonBehaviorがついてるやつ)は自販機表面をビュンビュン飛び回ってる不可視のボタンひとつで、両手のうち近いほう(VRモード)または視線の先(デスクトップモード)の位置をもとにしてうまいことたくさんボタンがあるかのように見せかけています。また、出てくる缶2についてはワールド全体で缶プールを共有しているので、古い缶はときどきしれっと消えます。

実装面でいうと、このUIは1) 表示用のプレハブをInteractまたはPickup対象の子に配置し、2) UI表示用のUdonBehaviourをアタッチすることで実装しています。結果的にUdonの数が倍増するのであんまりきれいな実装ではないのですが、逆に今のUdonSharpには継承のようなきれいな実装をするための機能がないので仕方がないのかなと思います。アイコンの種類とか色とかはいい感じにマテリアルに渡してテクスチャから引いています。これ(分かる人には自明だし分からない人には分からないので)書く意味ある?

ちなみに、動画ではあまりうまく映っていませんが、取り出し口の「ふた」は缶が出てきた衝撃でプラプラするしなんなら手で押せます3。これは実際そんなにUdonを使ってはいないのですがこういう細かいディティールがあると「そこにある感」が出ていいですね。

この動画、「撮り方」をよくよく考えてみると例のアレの機能も同時並行で進化していってることがわかります。遍在、させたいですよね。


LC-3

VRコンテンツにおいて、銃というアイテムには魔力とも呼ぶべき魅力があります。極端な例をあげればただ銃を撃つだけのゲーム(失礼な言い方)まで存在するように、現実ではそうそうできない「銃を思う存分ぶっ放す」という体験は一般的に大きな魅力なのでしょう。かくいう私も、Half-Life: Alyxとか、Fallout 4 VRとか、PAYDAY 2とか、BONEWORKSとか、Skyrim VR(ただし弓)とかで計百時間くらいは撃ちまくっています。まあ、これを作らない手はないですよね。

しかし、一つ問題になってくるのがリロード方法です。上記のようなタイトルにおける銃のリロード方法は、コントローラのボタンを押すだけのもの(F4VRとPAYDAY2、どちらも非VRゲームからの移植なのと銃の種類がかなり多いので実装コスト的にやむなし)、本物の銃とほぼ同じ動作が必要なもの(BONEWORKSとH3VR、そもそもコンセプトからしてリアル志向なので妥当)、その中間(Alyx)がありますが、VRChatの場合はPickupの実装の自由度(うまく実装しないとフォーカスが銃本体に吸われてしまう)やコントローラごとの差異の吸収がうまいことできない4 5関係でこれらの手法はあまり安全ではありません。なのでLC-3では「弾を撃ち尽くして下に振り下げるとリロード、その後振り上げると装填+自動コッキング6」という無から弾が湧き出てくるメソッドになりました。まあ、そもそも呪詛もとい祝福の言葉が刻んであるような不思議銃なので、理由付けはいくらでもできます。

動画ではしれっともう片方の手でマガジンの底を押して装填していることもありますが、これはAlyxリスペクトというか、「直感的に操作できそうなことは全部実装する」の精神で実装しています。特に二丁持ちしてマガジン同士をカッと突き合わせて装填するのがかっこいいんですよ。本編ではたぶん一丁しか出てきませんけど。


電波暗室

「この部屋はダイナミックなライティングをガッチガチにやりたいなぁ」と思ったのでやったやつです。リプライの通りめちゃくちゃアドホックなやり方で実装しているので決して汎用的なギミックではありませんが、まぁこういう丁寧な実装が質の高い体験につながる7ので、やりました。


エレベーター

こういう動画を撮りたかったんですよ(話速1.10倍・高さ1.10倍・抑揚1.30倍)。執筆時点で300いいねがついているのですが、何に対する「いいね」なのか内訳が微妙に気になっています。

エレベーターの実装については、「実際にハコを動かす」か「動作音だけ再生しておいて、ドアが開く直前にテレポートさせる」の二通りがありますが、前者のほうがエレベーター外部の声や環境光の変化、エレベーターが移動することによるアバターやDynamic boneの「ブレ」によって上下移動していることを「感じる」ことができると思って前者にしました。実際のところこれはVR感覚ならぬ「VRC感覚」で、VRChatをプレイしたことのない人がはじめてこのエレベーターに乗ったら「なにこのガッタガタなエレベーターは」となることは確実なのですが、まあ、諸条件を考えるとどちらを優先すべきかは目に見えてるので……


神社

神社、いいですよね。境内の敷地面積の都合上、「Ennichi Playgruond」とは無関係の別の神社ということになりました。

たしかこれがルピさんファスさんと三人ではじめて動画を撮影したときだったと思うのですが、ファスさんが案外私と身長が変わらなくて驚いたり、一人で撮った動画を確認しているときにファスさんとすれ違ってビビったり、こいついつも面白い体験してるないろいろ面白い体験でした。


コンビニ

こいつらは一体何を撮りたいんや……

ちなみに、この入店音は1%の仮想のBGMのアレンジなのですが、これ自体が2009年に作ったゲーム「Daydream」のテーマ曲のアレンジで、これを2015年前後に作ってたゲーム(未完)のコンビニ入店音としてアレンジして使おうとしていたものを5年の時を超えて持ってきたものなります。使いまわし。


水着回

はい。