ProjectCiAN 制作記

画像12

Reflexさんと一緒にクラブワールドを作り、4月23日にきるゆさんをお呼びしてプレオープンイベントを行いました。私はShader及びUdon(U#)を用いて、ワールドのモノを動かすことを担当し、そして何かをやりました。その制作記録を、私個人の視点から綴ってみようと思います。自分用の記録です。


はじまり

はじまりは昨年12月25日。”ク”リスマスプレゼン”ド”。

最高でした。おばけさんのDJもかつてないほど刺さったし、fotflaさんのドもそれを引き立てる至高のものでした。
(と勝手に言っています)の美しさと機能としての照明の融合。あの狭い空間だからこそ活きるものだと思います。それに丁寧に作られたポストエフェクト。見たことのない景色に心を奪われました。…なんというか、もはや言葉では表せないですね。

私の『やりたいことメモ』がScrapBoxにあるのですが、そこには単純に「線を描きたい」と書いてありました。ReferenceにはPorter RobinsonのMirrorのMV。たしかMVを観てすぐに書き込んだ覚えがあります。あの森を歩きたかったのですが当時としては実装手段がわからなかったのもあり、最終的にそれを目指すためにまずは空間ではなく平面的な線の表現を模索しようとしていたのですが…そんなタイミングでアレを見てしまったわけです。
そう、すごく嬉しかった半面、悔しいとも思っていました。でも、実はその悔しさの理由をちゃんと解釈できていません。やりたかったことを先にやられただけの理由とは思えなくて…そもそも私はただのFollowerなので、そういう意味で悔しいと思うのは違うと思うのです。感情は謎です。いい話ですね。

悔しさの理由もわからぬまま、そうして居ても立っても居られなくなってしまった私ですが、果たしてなにをどうすればいいのかわかりませんでした。例えば仮にドのような何かをしたいとして、おそらくそのための場所から作らなければならない。たぶん無理。じゃあどうする。そもそも今の私に何がある。何もない。最初からはじめなくては。それはあまりに遠い。そもそも自分がやるべきことはそれか?…と。かつてないほど手が動きませんでした。

そんなことを悶々と考えてなにもできないでいたところ。12月28日

三日坊主さん、kaiwareさんを中心に開催された…ライブ?がありました。私は待機インスタンスには行けましたが本会場への移動に失敗したので、その後おきゅたんさんの配信で観ていました。終始謎のシュールさはありながら、三日坊主さんの訴えかける何か…いや、これも言葉にできません。語彙力の無さよ。
ものすごく楽しかったです。参加できずにすべてを見ることができなかったのも、もしかしたらよかったのかもしれません。何も考えなくてよかったから。素直に楽しむことができたのだと思います。結果、私はなんだか吹っ切れていました。

なんだったんでしょうね…いいものに触れたときの心の動き。楽しいですね。

同日、ReflexさんからDMが届きました。Shaderについての質問で、それに答えると即、ものが返ってきました。CiANの天井にある分割ディスプレイの原型です。
彼もまた、プレゼン"ド"に心を撃たれたひとりでした。そして彼は、彼にとっての理想の空間を作ろうとしていました。ならば私はどうする。あの日の冗談みたいなお誘いも、もしかしたら。さっそく行動に移すことにしました。
1月3日にパーティクルなどをMIDI(ORCΛ)で叩く原型を作ってみせ、Reflexさんのところで一緒にやりたいという意志表明をちゃんとしました。そうして制作の日々が始まりました。

私個人のざっくりした制作スケジュールとしては、1月にパーティクル作り、2月前半がパーティクルコントローラー、2月後半から3月上旬にかけてStandardShader改変やStreamPlayerなどの細かいScript作り、以降は照明周りと同期。細かい修正などは別にして、3月中にはほとんどの作業を終えることを目標にしていました。それ自体は単にげんじつサイドの理由です。4月に入ってプレオープンまではGI関連と本番用の最終調整くらいです。おそらく。いろいろ振り返ってみようと思います。


Telescope

パーティクルはテーマを「三角形」と「線」の2つに絞ることにして制作しました。すべてGeometryShaderです。私が見たかったもの全部盛りです。きっと。
「線」は、あの日観たものがすべてではないと思ったので、再度私を叩いて砕いて組み直しました。その結果です。

これが第1歩。少しは近づけましたかね…

これはあの場では使えなかったけど。またいつか何かがあるかもしれない。

三角形についてはまあ、いつもどおりです。「らしい」と言っていただけたし、キヌさんから「説得力」という言葉をいただけたのも嬉しかったです。
三角形もやるだけならそう難しくなかったのですが、その在り方にはけっこう悩んでいました。パーティクル作り最序盤のころにmarupopさんに見せたときに、「三角形というある意味で最初から完成された形状を扱うのは難しい」という話をしました。単体の形状としての発展性が難しいのはすでに自覚していて、であれば今回はその在り方を模索しました。したつもりです。

この世界に存在するオブジェクトは概ね三角面の集合体ですから、そう考えるとたぶん何にでも再解釈できるんです。まだまだ何かできそうな気がしています。

こうしてすべてが出揃って、それでもまだ足りない気がしていました。見慣れた方々からすれば、それらそのものに目新しさはなかったと思います。それでも私がやる意味を考えて、あったものと無かったものをひっくり返して、そうして最後に残ったのがでした。

スクリーンショット 2021-04-29 12.38.45

1月16日。進捗報告の動画から。個々の三角にレイマーチングを乗せると、ちゃんと輪郭線だけが残るんです。私らしいね。そういえばコントローラーも実験段階ではこんなでした。

思いがけない効果を生んだものもありました。ひとつはポストエフェクトとレイマーチングの組み合わせ。全然制御できてないので完全に偶然でしたが、エフェクトひとつで、または組み合わせで世界が様変わりするのは楽しかったです。他にはない景色が見せられたのではないでしょうか。それに壁面ディスプレイ。発想の基となったのはShelterにあった、たまに出てくる壁面照明。当初は照明の代わりになり得るものとして作っていて、会場のロゴテクスチャができたらそれを貼る予定でした。しかしロゴがプレオープンに間に合わなくて、なんとなくDisplay用のRenderTextureを置いてみたら、きるゆさんのVJとドハマりしてしまいました。びっくりです。本当に、きるゆさんのおかげでもあります。

そういえば、は三角でも線でもない、ある意味で異質なものなわけですが…あれはButadieneさんへのリスペクトです。私のレイマーチの始まりであるYUKI。そこから私と三角形の始まり、そして私にとってのすべての始まりである、初めて体験したあの日の電ドへ繋がるものとして。

ちょうど2年だったのですね。本当にいいタイミングで開催できました。

Shaderの中身もせっかくなので書きたいところですが、年越しでどうなるかわからないのでやめときます。私が持っていてもどうしようもないのだけどね。


次はコントローラー。パーティクル制御の方法には長いこと悩んでいました。一番はリズムに合わせて動いてほしかったので手っ取り早いのはMIDIから制御する方法だろうと思い、1月末にパーティクルが出揃った時点ではMIDIでAnimatorをひたすら叩くという実装をしていました。とりあえず真似してみる精神です。

これがすんなりできたのはAvatars3.0でAnimatorの学習ができていたからで、VRChat恐ろしいなあと思いました。

そもそもワールドをSDK2で作るかSDK3で作るかすらもしばらく決まらなかったので、SDK2ならMIDIで、SDK3ならUDONでどうにかするという方針で、どちらも対応できるように心積もりだけしておくことにしていました。

この時点では「可能かどうか」程度の実験でした。そういえば動画の右のほうに何か映っているんですね。…まあ。

Referenceは…言うまでもないですけどね。phi16さんのD˸0629です。といっても参考にできたところは「Pickableなオブジェクトの座標を入力とする」という点のみです。追加された日に一度だけ観に行きましたが、操作も何もわからなくて(その日は時間がなかったのもあって)10分で退散してしまいました。その時点では何かを作る予定も気持ちもなかったですし。今ならまた何か違った感想があるのでしょうか。

今回は名前を先につけることにしました。名前からモチーフを広げられないかなという試みもありました。

決まったのは2月1日みたいです。望遠鏡のモデルを作ってコントローラーに仕立て上げることも考えましたが、最悪UIしか視えなかったのでやめました。その結果があれです。

画像2

2月3日。数時間悩んで最終的にこうなりました。裏に落書きがたくさんあります。というか照明、この時点で上にあったのか…

操作盤のような形態にすると自然と寄ってしまいました。VRUIわかりません。

後述する照明コントローラーは、最初はパーティクルコントローラーとは共存していなかったのですが、照明も同時にある程度は操作できるようにしてほしいというReflexさんの要望があり、組み合わせ方を考えていたところ、インターステラーの動画をふたりで観ていたときにコクピットで頭上の操作盤をパチパチしているのを観て、上もアリかあと。適当に置いてみたら背伸びすれば届くくらいの高さで、それはそれでいいかなあと思うことにしました。

画像3

かっこいい。と思っています。

パーティクルは基本的にUDONによって制御されていますが、U#を書き慣れていなかったこともあり、UDONでは極力何もせず細かいことは全部Shaderに任せる方針でコードを書きました。Updateの計算量削減とかSyncronize Positionの同期粒度を吸収するためのこととか、気を使ったのはそれくらい。あの頃はAmebientのアドカレをずっと読んでいました。入門以外で記述の意図が解説されてる記事ってあれくらいしかなかったですし。初学者には大変ありがたかったです。
座標をコントローラー描画Shaderに送り、Shaderで必要な処理をし、それをそのままメモリとして各パーティクルに渡しています。無駄はありますが、各パーティクルは独立しているので扱いやすかったのもあり、今回はこうしました。というか、基本的なGPGPUすら未だにちゃんと扱えていないことを自覚していたので、こうするしかありませんでした。
要所であったビートシンクはタップテンポ方式になりました。できそうだったので。DJさんやVJさんと同じようなことをしている気になれたのはちょっと嬉しかったです。

こうしてコントローラーも形になったものの、この時点で自信がほとんどなくなっていました。自分がみたいと思ったものをひたすら作ったわけですが、それが他の方にとってもいいものであるかがわからなくて。悩みながらでも、とりあえず「これを見たいと思った自分を信じろ!」方針で作業を進めていましたが、まあ限界はあります。限界でした。

時を同じくReflexさんも会場の概観を作り終え、試しにワールドに入ってみることになりました。配信テストやRealTimeGIなどの様子を確認するためReflexさんが音と映像を両方やって、ついでに私がパーティクルを動かしてみました。ここでダメだったらTelescopeは一から作り直し、もしくは棄てるつもりでした。内心はね。

スクリーンショット 2021-05-03 12.44.08

ちゃんと、いいと思えました。何よりあのReflexさんが「いい」と言ってくれたので。ここから先はReflexさんを勝手に信じることにしてモチベーションを復活させました。自信の根拠をコントロールするのも大事ですよね。ね。

この日でした。というやつ。1枚目は私が撮りました。

画像10

おまけ。これは起動スイッチ。かわいい。

めちゃくちゃどうでもいい小話として、NodeはTelescopeを意識していました。雪、三角、星。それらをつなぐ線。あの子のすべてです。


照明

照明制御について。見ての通り、Shaderで光の強さを書いて、それをカメラで読んで照明に渡しています。とてもシンプルです。
発想の基となった出来事がありました。

照明の光り方はShaderでいう0~1の波形に置き換えられそうだったので、似たようなことができそうだなと思いながら見ていました。そして、なにをやるにしてもVRChatの中だけで可能な限り完結させたいという気持ちがずっとあって、今回の照明制御はそれができそうだったのでそのようにしました。理由のひとつに、私以外の誰にでも扱えなければならないという課題がありました。私がいないと稼働できないという状況は避けたいので、触りたい方が触ってくれてもいいし、それも面倒ならAudioReactiveにしておけばいい。VRChatの中で完結させておけばそれができます。それにVJつきを想定こそしていますが、最悪映像がなくてもそれなりに耐えられる場所にしたいという要望もあったので、いろいろなパターンを仕込む必要もありました。なので照明もコントローラーを用意することにしました。

それに、それ用の何かを作れば、Telescopeの隠蔽にも使えそうだったので…隠せてたのかしらね。

とはいえ最初からこんな操作盤になったわけではなくて、かなり迷走しながら今の形になりました。

画像6

画像6

当初はColorPickerみたいなもので色とか照明の光具合を渡すような感じだったのですが、実際に扱うにはすごく残念な感じでした。少なくとも照明については私以外の方が扱う可能性があるので、とにかくシンプルな構成にしたかったのです。…シンプルになっているのかしら。

そんなことを考えながら、直接は関係ないですが、合間にこんなのを作ってもいました。

ここにコントローラーがあること自体、すでにTelescopeがあったからなわけでした。これを照明制御に流用した形です。launchpadってこんな感じなのかなあと妄想してタッチ式になった覚えがあります。
個人的に面白いかなと思うのは、点滅パターンはUVスクロールで切り替えてカメラで読むだけなので、やろうと思えばいくらでも点滅パターンを用意できる点です。

画像8

こんな感じ。下4つがAudioReactiveです。もともとはVJ(?)用に作ったものでしたが、照明にも使えそうだなと思っていたところ、ちょうど地下でも実装されて最高になったのでこちらでも導入しました。

画像9

天井にも照明があります。あれ実は低音域で閾値を超えた音量を検知すると反応して揺れます。吊り下げ式の照明をReflexさんが作ってきたときに、音圧で揺れててほしいなあと思ったのでそうしました。プレオープンでは確認してなかったけどどうだったのでしょう。こういう細かいディテールづくりは楽しい作業でした。

あとスポットライトもあります。Reflexさんがなんとなく作って放置していたものを、私が暇つぶしに操作できるようだけにしてさらに放置していたのですが、不可解弐QⅡを観てスポットライト表現をやりたくなったので突貫実装しました。まあ会場の雰囲気にあまり合っていなかった(曰く「チャラい」)のでほとんど使いませんでしたが。やればいいというものでもない、ことを学びました。難しいです。

照明が光るようになったらあとはRealTimeGI用に調整です。落雷さんの記事がとても参考になりました。StandardShaderを読むきっかけにもなって、なんというか、いろいろタイミングがよくてありがたいことですね…

実はパーティクルの随所に落雷さんのGlitchを使わせていただいています。自作したものよりこちらのほうがかっこよかったので…ありがとうございます。


FakeGI と 空

そんなこんなで3月が終わりました。当初の予定では3月中には負荷テストがてらプレオープンして、その後本番。というスケジュールでしたが、Reflexさんがすごく忙しくなって、予定はどんどん後ろ倒ししていきました。私も遅延を言い訳に地味な修正作業を延々とやっていたので、それ自体はむしろよかったのですが。

ほんとお疲れ様です。

ある日、負荷テストと称して弊アバター60体をまとめて1アバターにアップロードして置いてみるなどして(遊んで)いたのですが、RealTimeGIが動かなくなるのがしんどいという話になりました。光を反映しないのはともかく、光ったまま元に戻らないのがよくないと。聞くと某所ではRealTimeGIを使わずに照明を制御しているそうで、同じようなことをできないかという無茶ぶりが飛んできました。非常にざっくりした仕組みを教えてもらいましたが実際の中身はそこからわかるはずもなく、できるわけねーとは思いながら、ひとまず考えてみることにしました。

そもそもあの場所はReflexさんの願いの場所です。私の願いを上乗せこそしていますが、言い換えれば私は間借りしているような立場ですので、Reflexさんの要望には可能な限り応えなければならないという気持ちもありました。実装がわからないからといって諦める理由にはなり得ないのです。幸いにも実装をひとつ思いついたので、ものは試しで作り始めました。

基本部分は4日くらいで形になったみたいです。本物とはほど遠い見た目ですが。FakeGIと勝手に呼んでいます。その後パーティクルとの描画の整合性をどうにかするのに苦労しました。でも当日は直前まで手を加えていたのもあって見落としもありました。悔しいですね…

要望といえばもそうです。かなり初期の方にReflexさんが言った冗談を私が真に受けた形ではありますが。実装的にはただのDissolveです。GeometryShaderも一瞬考えましたが、Reflexさんがそんなポリゴン遊びができるようなモデルを作るはずがないんです。信頼してるのでモデルを確認することもなく即却下しました。でも三角の可能性をみてみたいし、これも一度きりの飛び道具だから思い切ることにしました。狭い空間から広い空へ。みたいですよね。…これも披露するにはいいタイミングでした。全部持っていっちゃいましたね。

Dissolve用のマスクはドロネー図と呼ばれるものだそうです。ShaderToyにはなんでもありますね。ありがたいことです。


余談。StreamPlayerは(私は扱ったことがないので知りませんが)Topazが微妙らしいということで、phi16さんの記事をみながらMinimumなものを作りました。テスト用にと動画URLを入力できるようにしたところ、ほしい機能がいろいろ増えるもので。プレオープン後にも手を加えていましたが、もうUSharpVideoでいいのでは…という気持ちがないでもありません。そういえばこのStreamPlayerも某クラブに提供していましたが、前提が違うと必要な調整も違うもので、動作が怪しい代物を渡してしまって申し訳なかったです。同期はしんどいねという話です。

同期がしんどかったという話は…蛇足が過ぎるのでやめときます。いつもどおりです。プレオープン後もずっっっと同期周りを触っていました。UNUに救われました。

今回は共同制作にあたりGithubを使いましたが、私がGithubをまともに扱ったことがなかったので誤った操作を何度もし、かなりご迷惑をおかけしてしまいました。何もかも助けてもらいました。

というか、私はほんとうにShaderとU#しか触っていなくて、他のあらゆるタスクをReflexさんに任せてしまっていたのが申し訳なかったと感じています。私が用意した3Dモデル、パーティクル用の板しかありません。まあ実際、私が作ったモデルなど、この空間にとってはノイズにしかなり得ないので手を出しづらかったのはありますが。まあ…仕方ないのかな。

画像9

努力の形跡。使われなくてよかった。


プレオープン

FakeGIがとりあえず形になった日、4月17日。唐突に「来週GCが休みだから来週やる」と連絡が入りました。FakeGIを実装することによる他への影響をまだ何も確認してない段階です。だいぶ無茶です。まあ私も即答しているんですが。いつまでも眠らせておくわけにはいかなかったのです。
どうにか最低限の形にして、告知映像を撮ったのが19日。

また貼っちゃお。すごくカッコイイ映像ですよね。これをポンと出してくるあたりプロの所業というものです。流石ですよね…

私のところが「???」なのは私の要望なわけですが、別に私がやろうとすることを隠したかったからではなく、単に名前がついていなかっただけです。いわゆるVJではなく、ドは名前というには違う気がするし遠慮したかった、パとか言ったらそれこそその文脈からおこられそう、みたいな。むずかしいですね。

で、告知ツイートが伸びていくのを震えながら眺めていましたが、震えるような時間も残されていなかったので、ワールドのセットアップをひたすらやりました。インスタンス上限を超えるほどの反応があったので、急遽照明コントローラーに弾かれインスタンス対応をしました。具体的にはインスタンスマスターが私かReflexさんでなかったときに勝手に照明をAudioReactiveに切り替えるようになりました。

これは一応、宣言のつもりです。期待されていたのかどうかわからなかったので。そうして手は尽くしました。

実は開場前に配信テストをしてたのですが、あまりに同期が怖くて確認のためにテスト中にTelescopeを全部出してしまってたんですよね。それはもうネタバレです。あのテスト配信を観ていた6人の方には悪いことをしました。てへ。

プレオープン本番。私は特等席で観させてもらいました。イベント主催はイベントをちゃんと楽しめないといった話をよく耳にしますが、私個人としてはそんなことなく普通に楽しんでました。まあ裏方ですし。Telescopeの4面ディスプレイを一人で操作するのは大変でしたが… ReflexさんもきるゆさんもDJ/VJ初めてとは思えないくらいカッコよかったですよね。お二人に華を添えられたのならよかったと思います。

スクリーンショット 2021-05-04 14.10.58

いい景色でした。ちゃんと写真に残したかった。個人的にみせたかった方々にみせられたのでよかったです。


終わりに

今回、VRChatで初めて人前で演出を披露しました。今まではTwitterに動画を流して終わっていましたので。機会がなかったわけではないと思いますが…意識の差かな。緊張やら恐怖やらで大変でしたが、それはそれで楽しかったです。

それに、恥ずかしいので最後に小さく書き残しますが、fotflaさんが「電ドを見たい」って書かれていたので、「俺がやるんだ!」って息巻いていました。いちFollowerとして感謝の気持ちを込めて、GCで勝手に受け取ったこれまでのすべてを乗せて。最初に制作をはじめる強力なモチベーションとなりました。

それと同時に、自分の力の至らなさを痛感しました。それは技術的な意味でも、表現的な意味でも。だからこそ、きっと次へ行けるんだと思います。

『どうしてワールドを作るのか』という私なりの答えなのですが、別にワールドに限ったことではないと思うので、これからも追い求めていきたいです。


最後にReflexさんについて。たしかフレンドさん経由でGarageに迷い込んだのが認知したきっかけだったと思います。「モデリングもShaderもできる強い方だ!」みたいな感じで一方的に畏怖していたのですが、いつの間にかフレンドになり、いつの頃からか話せるようになり(というか構ってもらえるようになった)、気づけば私にとってはShaderの話ができる最初のフレンドさんでした。VRChatに来てずっとShaderを触ってはいるものの、私の周りにはShaderを書く方はいなかったし、そんな中でそういう話をするのはずっと遠慮していたので、すごく嬉しかったのを覚えています。そんなつよつよな方と共同制作ができたのは嬉しかったし、感謝しています。私を選んでくれてありがとう。

そして、ProjectCiANは始まったばかりです。そのうちまた開かれるときが来ると思います。CiANをこれからもよろしくお願いします。

画像13