指の曲げ伸ばしを取得できるVCIモジュール「BoneChecker」を公開しました。
— らーめん (@priramen) January 6, 2020
これで装着VCIなしで指先から弾丸や魔法を発射できるようになります。https://t.co/1ZpCppMQjA#バーチャルキャスト #VirtualCast #vci pic.twitter.com/gT7uwuxPws
指の曲げ伸ばし判定ができるオリジナルモジュールBoneCheckerを導入して、
装着VCIを使用せず、指のみを使って以下のようなことができます。
※指のボーンが設定されていないVRMモデルや、バーチャルキャストの指の仕様変更によっては機能しなくなる可能性があります。
下記のリンクよりUnityPackageをダウンロードして順番にインストールしてください。
インストール方法は、Unityへファイルを直接ドラッグ&ドロップします。
シーンAssets/RamenVCI/BoneChecker/Templateを開くと、中に指の曲げ伸ばしのテンプレートVCIがありますので、これをベースに作成していきます。
最初にキューブがありますが、これはバーチャルキャスト内でVCIの再読み込みをするための物なので、不要であれば削除しても構いません。
「BoneCheckerTemplate」を選択して、
VCI → UniVCI-0.XX → Export VCIを選択して保存します。
The Seed OnlineへのアップロードについてはWikiを参照してください。
1. main.luaの作成
バーチャルキャスト上でVCIを呼び出すと、_main.luaが生成されるのでmain.luaへ名前を変更して編集していきます。 |
|
2. 動作確認 main.luaを上書き保存、またはVCIの再読込等で更新後、指の曲げ伸ばしをするとVCIのコンソール画面に状態が表示されます。 |
左手を握った時に右手の人差指から弾丸を打ち出すスクリプトを作ってみましょう。
※ここからBoneChecker専用の関数を記述しますが、通常のVCIスクリプトには無い関数なので注意してください。
弾丸のサブアイテムを取得します。 ソースの冒頭部分に下記のソースを追加します。
main.lua
|
|
左手の人差し指を曲げた瞬間(左手を握った瞬間)をトリガーとして、右手の人差し指(RightIndexDistal)から弾丸を発射します。 ソースの下の方に左手の人差し指を曲げた時に実行されるfunction BoneEvent_FoldLeftIndex()があるのでこの中に追記していきます。
main.lua
|
|
動作確認をします。 左手を握ると、弾丸が右の人差し指から出ることを確認します。 またforceの値を高くすると弾速が速くなります。 |
現在のスクリプトでは、左手を握ると勝手に発砲してしまうため、誤爆防止用に右手が指鉄砲の時だけ、弾丸が撃てるようにします。
今回は簡易的に人差し指が伸び、中指が折れている状態の時を指鉄砲の形とします。
弾丸を撃つ時に、右手の指の形が正しいかチェックします。 先程のBoneEvent_FoldLeftIndex()に追記します。
main.lua
|
|
動作確認をします。 右手が指鉄砲以外の形をしていた場合、弾丸がでなくなります。 |
更に誤爆防止として、擬似的に特定の構えをしたときに発砲できるようにします。
今回は右肘に左手が乗っている時に撃てるようにします。
弾丸を撃つ時に、右手の指の形が正しいかチェックします。 先程のBoneEvent_FoldLeftIndex()に追記します。
main.lua
|
|
動作確認をします。 左手が右肘に近い時でないと発射されなくなります。 これを利用すれば、頭に近い位置、肩・腰・胸に手を当ててる時、両手を合わせている時等に発動を限定させることができます。 |
今回の完成版のサンプルはRamenVCI/BoneChecker/Sample1Bullet.sceneにあります。
また、いつも私が使用している6発リボルバーを、このBoneCheckerに流用した物がRamenVCI/BoneChecker/Sample6Bullets.sceneにありますので、参考にしてみてください。
作成中のVCI ObjectにBoneCheckerモジュールを組み込みます。
|
|
BoneChecker/Lua/main.luaを参考に、自分のmain.luaにソースを追記します。
main.lua(冒頭)
main.lua(update)
main.lua(末尾)
|
BoneCheckerのモジュールを使用することで、下記の関数が使用可能になります。
関数名 | 説明 | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
SetYourName(yourname) |
BoneCheckerの対象者をニックネームを指定します。 基本的にVCI所有者のみが処理をする前提で作られています。 一応他の人の名前を指定してもできないことはないですが、その場合はラグが発生します。
|
||||||||||||||||||
IsInitialized() |
BoneCheckerが使用可能な状態であるかチェック。 内部処理では、SetYourName(yourname)でアバター情報が取得できていれば使用可能とみなします。
|
||||||||||||||||||
Update() |
main.luaのupdate内で処理させたい関数です。 下記のコードをmain.luaのupdate内に記述することで機能します。
main.lua
|
||||||||||||||||||
CheckAvatar(avatars) |
SetYourName(yourname)で指定したニックネームのアバターが存在するか検索します。 一度アバターの検索に成功している場合は無視されます。
|
||||||||||||||||||
GetAvatar() |
BoneChecker対象者のアバター情報を取得します。 未登録の場合はnilが返されます。
|
||||||||||||||||||
GetFoldFinger(fingerName) |
対象の指が現在曲がっているかチェックする。
|
||||||||||||||||||
GetBonePosition(boneName) |
対象のボーンの位置を取得します。
|
||||||||||||||||||
GetBoneDirection(boneName, forward) |
対象ボーンの向きのベクトルを取得します。 用途としてはTransform.GetForward()に似ています。
|
||||||||||||||||||
CheckBoneDistance(boneNameA, boneNameB, distance) |
対象アバターのボーン間の距離が一定以内か調べます。 例えば、両手が近い位置(0.2m以内)にあるかチェックする場合は下記のように記述します。 CheckBoneDistance("RightHand","LeftHand",0.2)
|
||||||||||||||||||
GetLeftHandVelocity() |
左手の加速度を取得します。
|
||||||||||||||||||
GetRightHandVelocity() |
右手の加速度を取得します。
|