スモールライト
概要
ドラえもんの世界にある、スモールライトです。トリガーを引くとビームがでて、そのビームが当たったオブジェクト(図のレイでは牛乳パック)はだんだん小さくなります。
解説
全体
左にRaycaterがあります。これが「コライダーにぶつかるまでまっすぐ飛ぶ不可視の測定レーザー(レイ)を飛ばし続ける」を行い、前方に物体があることを見つけます。
真ん中にStandard Controllerがあります。これでトリガーを引いていることを検出します。
右にGlobal TransformとSet Global Scaleがあり、物体のスケールを小さくしていきます。
物体の検出
スモールライトの前方にある物体の検出をRaycaterで行っています。これには向きをベクトルで与えたり、Userでないことを示したり、どのくらいの距離までレーザ-(レイ)を飛ばすのかなどを入力します。そして出力としては”HitCollider(ICollider)”がでてきます。これをGet SlotとGet Object Rootを使って、その物体のRoot Slotを手に入れます。
トリガーを引いていることの検出
スモールライトはトリガーを引いているときだけ、働きます。そこでStandard Controllerを用いて右手のトリガーが引かれているときだけTrueが出力されるようにします。このときにスモールライトのスロットを入力にしてGet Active Userスモールライトを持っているユーザーを得てStandard Controllerに入力しています。
またトリガーを引いているときだけビームがでます。ビームにはInventory→Neos Essentials→Examples にあるGreen Laserを利用しています。そのインタフェースノードが中央に表示されていますが、そのActiveにトリガーの結果を接続しています。これによりトリガーが引かれているときだけ、ビームが表示されます。
またトリガーを引いているときだけ、0.25秒ごとに、スケールの縮小操作(ここでは0.97倍)をするようにします。そのために、Fire While TrueによりTrueが入力されているときにはパルスが出ているようにします。そしてImpulse Timeoutを用いて0.25秒間はパルスの出力を行わないようにします。逆に言うと0.25秒ごとにImpulseの出力が行われます。
物体のスケールを小さくする
Global TransformとSet Global Scaleがあり、ここでは0.25秒ごとのImpulseを受けると元のスケールから0.97倍されたスケールをセットしていきます。これによって徐々に物体のスケールが小さくなっていく様子が再現できます。
グリーンレーザーの処理
このスモールライトではGreen Laserを利用していますが、これが検出されて小さくなっては意味がありません。
この図のようにConeColliderとGrabbableのEnabledのチェックを外して、衝突判定がされず、つかむこともできない、つまり一体となっているように設定します。
追記
実は上のLogiXではオブジェクトに対してはうまく動くのですが、アバターには大きさは小さくなるのですが、視点がずれていくという問題があります。これは普通のオブジェクトの場合にはObject RootのScaleを書き換えればいいのに対して、アバターはその上のUser RootのScaleを変える必要があり、違うからです。
そこで、上のようにGet Object Rootからアバターの場合にはGet Active User Rootを使ってアバターかどうかを判断して、そのスロットをセットするようにします。これでアバターに向かってスモールライトを使うことができるようになりました。
おわりに
NeosVRはドラえもんの世界を再現できます。独自の物理(LogiX)があり、物理法則を利用してワールドのオブジェクトに影響を与えることができます。ここではスモールライトを紹介しました。
関連するノード
Raycater, Standard Controller, Global Transform, Set Global Scale, Get Slot Get Object Root, Get Active User, Fire While True, Impulse Timeout, Global Transform, Set Global Scale