NeosVR 生きてるクラゲの作り方
ハローヤーヤー、feon/Hiromuです。
この記事はNeos VR Advent Calendar 2022(一枚目)の20日目です。
昨日のlillさんの「NeosVR JP Twitterコミュニティ」でした。
明日はあかたるさんの「月毎のハイライト(自分基準)で振り返るNeos1年目のNeos1年(1月~11月)」です。
https://adventar.org/calendars/7623
突然ですが
私は『NeosVR=ジャンプ世界説』を提唱しています。
ヒーローが舞空術を使いこなし、固有結界を領域展開でき、どこでもアイテムを具現化し、ケモノや美少女に変身できる世界。
そんなフィクションは、日本が誇るマンガ・アニメの中でしか見られなかった。
その筆頭たる週刊少年ジャンプを夢中になって読み耽ってきた永遠の少年少女たちは、「いつか僕が(私が)特別なチカラに目覚める未来」を夢見続けています。
しかし、いまこの時代において、その理想郷が NeosVR に実現したのです!
ロマン
ジャンプには「○○の呼吸!」とか叫んで自身の身体能力を飛躍的に伸ばしたり、「○○のピストル!」とか叫んで体を変形させたりといった様々な能力を持つキャラクターがいます。
しかし、ここで注目したいのは、日本において古来より陰陽道の式神をルーツとした自立稼働型の人形に能力を込めて使役するスタイルです。
ジョジョの奇妙な冒険『スタンド』
HUNTER×HUNTER『念獣』
NARUTO『口寄せ』
呪術廻戦『式神』
など、数え上げたらキリがありません。
自分だけの不思議なペットを作り出し、それを使役して特別なチカラを発揮することに、日本人はロマンを感じるわけです。
「オレが3人分になる…」といってゴリラを「ズズ…」と出すとカッコいいわけです。
わかりますか。
というわけで
NeosVRで自分だけのペットを作ってみましょう。
しかし、いきなりゴリラを作るのは極めて困難です。
簡単に作れるクラゲにしましょう。
なお、本稿でご紹介するクラゲの作り方は、2022年8月頃に開催されたNeosFesta4の出展作品『Jellyfish Aquarium』の成果を一部流用しています。
よかったらそっちも見てみてくださいね。
とぅるんとぅるん
では、生きてるクラゲの作成をはじめます。
まず、Torus(ドーナッツ)とY軸をつぶしたSphere(球)を配置してベイクして凸包してみましょう。
(「この人いきなり何言ってんだ...?」と感じたひとは、まず毎週水曜日21時のNeosモデリングClubに行きましょう)
この底面をスライサーツールチップで少しだけ切り取ります。
同じくスライスして上側だけ残したSphereも作って底面を蓋するとこんな感じになります。
スライサーを使うとマテリアルがPBS_SliceMetallicに変換されます(つまりコンポーネントAssets/Materials/PBS/PBS_SliceMetallicを作ってからMeshRendererに指定しても同じこと)
XiexeToon信者の方はBlenderでモデルを作るしかないかも🥺
ここで、コツとしては
LocalSpaceにチェックをいれる(じゃないとクラゲが移動したときにスライス面がズレちゃう)
スライス面のY軸位置をheadスロットのY軸=0と一致させる(後で触手をくっつけるときに楽)
コライダーを消す(実際は見た目を隠してるだけで見えない部分に判定があるため。必要ならBoxColliderなどを後付けしよう)
ぽよんぽよん
クラゲの傘の部分ができたら、さっそく命を吹き込みましょう。
活躍するのはこれらのコンポーネント。
Transform/Drivers/Panner1D
Relations/ValueMultiDriver<float>
Transform/Drivers/ValueGradientDriver<float3>
まずPanner1Dを適当なスピードでループさせます。
その値をValueMultiDriverにつっこんで、後々使いまわせるようにします。
ValueMultiDriverのDriversにValueGradientDriverのProgressを指定します。
ValueGradientDriverのTargetに傘のSlotのScaleを指定します。
すると、簡単にループ動作が作れます。
まぁ待たれよ。
だいたいこんな感じよ。
ValueGradientDriverの作り込みが「生きてる感」の最重要ポイントです。
本物のクラゲはデローンと漂っているやつや、シュッシュッシュッと泳ぎ続けているやつなどがいますが、今回はスーッと広げてシュッと縮むような遊泳運動を再現してみましょう。
うーん、これは生きてますね。
メタバースに生まれた新しい命、真のメタバース原住民はクラゲだったのだ。
ゆらゆら
では次にみんなが大好きな触手を作っていきましょう。
ここではDynamicBoneChainという、アバターの髪やスカートのゆらゆらに使われる技術を利用します。
まず触手(一本分)のSlot(tentacleとよぶ)を作成し、その配下にチェーンの根本に相当するSlot(node_sとよぶ)を配置します。
次に、node_sの配下(子要素)に新しいSlot(nodeとよぶ)を配置して、Y軸を下にちょっとだけずらし、Assets/Procedual_Meshes/SegmentMeshでつなぎます(SlotAに自Slot、SlotBに子Slotを設定)。
そして、nodeの下にnodeを置いてSegmentMeshでつないで…というのを繰り返し、下図のように連結していきます。
うまくいくと、このようになります。
ひもが出来上がってから、node_sにコンポーネントPhysics/Dynamic Bones/DynamicBoneChainを追加して、「子にしたものをセットアップ」を押すと一気にBones (list)が設定されます。すごいぜ。
これで触手を触ってみると、手に当たってゆらゆらするはずです。(本物のクラゲの触手は危ないので触ってはいけませんよ!)
ゆらゆら感を変えたい場合は、InertiaからStiffnessまでのパラメータを変更してみましょう。
触手がまっすぐ元に戻ろうとする力や、ゆらぎが伝搬する柔らかさみたいなものを変更することができます。
次にtentacleの親にtentacles(複数形)スロットを作成し、コンポーネント/Transform/Drivers/CircleAlignerを追加してAutoAddChildrenにチェックを入れます。
そしてtentacle(単数形)を複製しまくると、下図のようになります。
DynamicBoneChainは少し処理が重いので、調子に乗って触手や触手の節を増やしすぎるとフレームレートが激落ちします。
うまい具合の塩梅を探してください。
さて、このままだと傘の伸縮に触手がついてこないので、CircleAlignerの半径を同期させます。
Panner1Dなどを設定したスロットに戻り、ValueGradientDriver<float>を追加して、TargetにCircleAlignerのRadiusを指定します。
Panner1Dの値を使いまわすため、ValueMultiDriverのDriversを追加して、ValueGradientDriverのProgressを指定します。
そして、ValueGradientDriverのPoints (list)を傘の運動と同じように追加し、傘のX,Z方向のスケールと一致するようにCircleAlignerの半径を設定していきます(LogiXでパパっと計算するとよろしい)。
うまく計算・設定できると、傘の縁に触手がぴったりくっついて、しかもゆらゆら触手がゆらめきうつろうさまを見ることができます。
きれい…。かわいい…。
すいーっすいーっ
ここまできたら、あとは泳がせるだけです。
まずはこちらをご覧ください。
LogiXの説明を一からすると1,000,000文字あっても足りません。
ざっくり解説で許していただきたい。
DynamicVariableが分からない人は有識者に聞きましょう。NeosVRには神様がいっぱいおられます。
前提
仮想的なターゲットをおいて、一定角度ずつ回頭しながら進んでいき、十分に近づいたらターゲットを再設定するロジック
Update(しかもUserが空)で動かすのよくないかもだから、誰か補足してほしい
Sequence.1 回頭
仮想的なターゲット(target position)に向かって、クラゲの頭(と進行方向)を回転します。
なぜこのLogiXで回転できるのか?それは俺にも分からん。
冗談はさておき、「Unity ミサイル 追尾」などで検索すると、技術的・数学的な勉強ができるかもしれません。
以前、Y氏やA氏に相談しつつ、そういったプログラム解説記事を参照してLogiXを組んだのですが、元記事を見失いました。
これ、もともとはホーミングレーザーのためのLogiXだったんですよね。
ざっくり言うと、自分の進行方向とターゲットのいる方向を見比べて、自分の進行方向を毎フレームcurve speed角度ずつ修正しているようです。
注意として、Forwardノードを使っているのでクラゲにとっての前は+Z方向です。
modelスロットを90度傾けるなどして、クラゲの頭が+Zに向くよう調整しておいてあげてくださいね。
Sequence.2 前進
Sequence.1でクラゲの頭はターゲットに向きつつあるため、+Z方向に進むだけです。
毎フレーム+Z方向にmove speedだけ進んだ先の座標を計算して、そこに移動しています。
move speedはクラゲの遊泳運動と同期させましょう。
触手のCircleAlignerと同様に、ValueGradientDriver<float>を追加してValueMultiDriverなどの設定を行ってください。
傘を広げているときは遅く進む(あるいは停止)、傘を縮めているときは速く進む、というように設定するとよいでしょう。
Sequence.3 再設定
クラゲと仮想的なターゲットの距離がtarget reset distance未満になったら、ターゲットの座標をランダムに再設定します。
このとき、ランダムの範囲はmove area radiusを半径(球状ではないので正しくは半径ではない)とする直方体の中となります。
そのため、クラゲがワールドのRoot直下にいると原点付近をぐるぐる回ってしまいます。
クラゲを水槽的な何らかのSlotに入れてあげて、泳ぐ場所を調整してあげてください。
また、curve speedとmove speedが大きすぎる場合、クラゲがターゲットに近づくことができず同じ場所をぐるぐる回ってしまうこともあります。
パラメータを調整してあげてください。
こうしてLogiXを組んだ結果がこちらになります。
うーん、これは生きてますね。
クラゲが回転するときに触手がゆらめき交差する様、感動ですね。
クラゲをたくさん配置して光らせると、とっても素敵です。
やったー!
というわけで
イカがでしたでしょうか。
自分だけのペットを作って使役したくなりましたか?
NeosVRには素晴らしいワールドやアイテムがたくさんありますが、自立稼働する生命的なモノはまだ多くありません。
自由気ままに動き回っているイキモノがいるだけで、ワールド全体が生きてるような感覚というか、温かみや躍動感みたいなものが出てきます。
ぜひ、NeosVRの新しい可能性に触れてみてください。
そしていつの日か、あなただけのゴリラを作ってください。
+α
このクラゲちゃんの作り方は、あくまでも基本です。
さまざまな拡張・改良が考えられますので、ぜひオリジナルの「特別なチカラ」を考えてみてください。
ほんの一例をご紹介しますね。
Blenderで傘と触手のモデルを作り直す
Panner1Dのスピードや繰り返しの間隔をランダム化して、複数のクラゲの遊泳運動タイミングをずらす
遊泳運動と同期した効果音をいれる
クラゲに乗れるようにアンカーを追加する
色をバチバチに時間変化させてゲーミングクラゲにする
仮想ターゲットをエサのスロットに置き換えて、エサを置いたら食べにくるようにする
仮想ターゲットを気に入らないユーザに置き換えて、クラゲミサイルを発射して当たったら爆発させる
クラゲとクラゲが重なったら子クラゲを生み出すようにして無限に増やす
ホイップクリームとイチゴを山盛りにして食べれるようにする
いじょ!
この記事が気に入ったらサポートをしてみませんか?