今回はOculus Questの開発ネタをやっていきます。
内容的にはOculus Rift Sなどにもそのまま応用できるかと思います。
銃などを掴む時、取っ手やグリップなど特定のポイントを握るようにしたいと思うことがあると思います。
そういう時はGrabbableについているSnap機能を使うと便利です。
今回は、とても使い方がわかりにくいことで評判のSnapOffsetについて解説していきます。
2019年9月13日追記
よりわかりやすく解説した補足記事を投稿しました。
こちらも合わせてどうぞ。
- 開発環境
- セットアップ
- 使用アセット
- サンプルシーンの確認
- 物を持つ時に特定の場所を掴んでほしい
- OVR Grabbable
- Snap Offset
- Snap Offsetの本当の使い方
- 実際にOffsetさせてみる
- ベストプラクティス(このやり方がオススメ)
- まとめ
- 参考資料
開発環境
Windows 10
Unity 2018.4.1f
Oculus Integration ver1.37
Oculus Quest
セットアップ
このメモは前回の続きとなります。
まだの方は先にこちらからどうぞ。
使用アセット
今回使用したアセットを紹介します。
刀アセット Wakizashi
http://u3d.as/1vSL
高品質な刀です。AssetStoreまとめさんでも紹介されていました。
ハンドガンアセット
弾丸やマガジンも含まれたハンドガンのアセットです。
サンプルシーンの確認
Assets/SampleFramework/Usageに様々なサンプルシーンがあります。
今回も前回と同じAvatarGrabシーンを改造していきます。
が、今回のSnapOffset機能はDistanceGrabシーンで活用されているのでそちらも併せてどうぞ。
物を持つ時に特定の場所を掴んでほしい
前回の記事では物を持った時にGrabbableのコライダーの範囲内であればどこでも掴んで持つことができました。
しかし、銃や刀のように掴んでほしい位置や角度が明確である場合どうすればいいでしょうか。
刀の場合、刀身部分を掴めるのはあまり好ましくありません。柄を握ってほしいはずです。
そこで、OVR Grabbable及びDistance Grabbableには物を掴んだ時に位置や角度を矯正する機能があります。
その機能がSnapOffsetです。
OVR Grabbable
OVR Grabbableコンポーネントを見てみると、
SnapPositionとSnapOrientationの項目が確認できます。
ここにチェックを入れると掴んだ時に、SnapOffsetの所に入っているTransformに合わ移動します。
Snap Offset
このSnapOffsetのTransformの設定ですが、まずOVR Grabbableな3Dオブジェクトに、
掴んでほしいポイントを示す空のゲームオブジェクトを子オブジェクトにする。
そしてこの空のゲームオブジェクトをSnapOffsetとして登録すれば掴んだ時に位置や角度が矯正されます。
・・・と思った方が多いかと思います。
実はこのやり方は間違いです。
この手順だと正常にスナップされません。
掴んだ時に位置や角度がおかしな場所になります。
Snap Offsetの本当の使い方
UnityForumの方にもこの問題点が取り上げられていました。
正しい使い方は以下に記しますが全く直感的ではない使い方です。
Snap Offsetの正しい使い方
1. Unityのシーン内のPosition(0, 0, 0)、Rotation(0, 0, 0)の場所に空のゲームオブジェクトをつくる
2. このオブジェクトを矯正させたい位置や角度分だけ値を変更する
3. このオブジェクトをSnapOffsetとして登録する
以上となります。
実際にOffsetさせてみる
上記の手順通りに実際にやってみます。
まずはPosition、Rotationともに0のゲームオブジェクトを作り、これをSnapOffsetとしてみます。
最初のやり方と違い無事手にスナップされました。
Position、Rotationが0の場合はこうなります。
次にRotationを変えてみます。Xを-60にしました。
すると、掴んだ時の角度が矯正されます。
これをひたすら動作確認しながら調整する必要がありますが非常に面倒です。
ベストプラクティス(このやり方がオススメ)
ここのベストプラクティスを@nkjzmさんが紹介していました。
Oculus Integrationの機能を使った銃の実装についてQiitaにまとめてみました。
— Nakaji Kohki / リリカちゃん (@nkjzm) June 23, 2019
OVRInputでは左右を区別しないキー入力の呼び出しが出来るので、それを活用した方式になります。よかったら参考にしてみてください!
【Oculus Quest】OVRGrabbableでかっこよく銃を実装する https://t.co/auUdVRblNo pic.twitter.com/DRPWDz1RVW
結論からいいますと、Snap OffsetはNone(何も設定されてない状態)のまま。
掴みたいオブジェクトのレンダラーの座標や角度を調整します。
銃の場合ですと、Grabbableがアタッチされている親オブジェクトはそのままに、
子オブジェクトの銃の3Dモデルの位置を調整します。
剣の場合はこちら、剣はRorationのxを-60にするといい感じになります。
実際に動作確認して細かく調整する必要はでてきます。
これで完成です。きちんと手の形に収まるようになりました。
刀を見てみると、刀身を掴もうとしても柄の部分に矯正されているのがわかると思います。
まとめ
SnapOffsetはnullのまま、3Dオブジェクト側の座標を調整しよう
参考資料
あー完全に理解した。
— Nakaji Kohki / リリカちゃん (@nkjzm) June 17, 2019
Vec3 OffsetPos; Qua OffsetRot;を設定したいだけだ。しかも何故か絶対座標という…。
VR - Oculus SDK - Touch controller - Snap Position , snap offset - grab a gun - Unity Forumhttps://t.co/JBHQPmOB9y
他間違っている箇所がありましたらコメントにお願いします。