View on GitHub

NeosVRJP-Techbook

NeosVRJP-Techbook (NeosVRの応用編・技術ノート)

スモールライト

概要

ドラえもんの世界にある、スモールライトです。トリガーを引くとビームがでて、そのビームが当たったオブジェクト(図のレイでは牛乳パック)はだんだん小さくなります。

pic pic

解説

全体

pic

左にRaycaterがあります。これが「コライダーにぶつかるまでまっすぐ飛ぶ不可視の測定レーザー(レイ)を飛ばし続ける」を行い、前方に物体があることを見つけます。

真ん中にStandard Controllerがあります。これでトリガーを引いていることを検出します。

右にGlobal TransformSet Global Scaleがあり、物体のスケールを小さくしていきます。

物体の検出

スモールライトの前方にある物体の検出をRaycaterで行っています。これには向きをベクトルで与えたり、Userでないことを示したり、どのくらいの距離までレーザ-(レイ)を飛ばすのかなどを入力します。そして出力としては”HitCollider(ICollider)”がでてきます。これをGet SlotGet 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 TransformSet Global Scaleがあり、ここでは0.25秒ごとのImpulseを受けると元のスケールから0.97倍されたスケールをセットしていきます。これによって徐々に物体のスケールが小さくなっていく様子が再現できます。

グリーンレーザーの処理

このスモールライトではGreen Laserを利用していますが、これが検出されて小さくなっては意味がありません。

pic

pic

この図のようにConeColliderとGrabbableのEnabledのチェックを外して、衝突判定がされず、つかむこともできない、つまり一体となっているように設定します。

追記

実は上のLogiXではオブジェクトに対してはうまく動くのですが、アバターには大きさは小さくなるのですが、視点がずれていくという問題があります。これは普通のオブジェクトの場合にはObject RootのScaleを書き換えればいいのに対して、アバターはその上のUser RootのScaleを変える必要があり、違うからです。

pic

そこで、上のように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