Unity+VRTKで、配置したオブジェクトを掴んでふりまわしたり、拡大縮小する為の方法をまとめました。
簡単な3D Model Viewerならこれだけで作れます(モデルを動的に読みこむことはできませんが…)。
使ったバージョン:
- Unity 2018.2.8f1
- VRTK 3.2.1
VRTKを使えるようにするまで
- 新しくプロジェクトを作る
- VRTKをAsset Storeからインポートする
環境に応じてOculus IntegrationやSteamVR Plugin等もインポートしましょう。 -
VRTK_MaterialColorSwapHighlighter.csでエラーが出る
Assets/VRTK/Scripts/Interactions/Highlighters/VRTK_MaterialColorSwapHighlighter.cs(146,66): error CS1540: Cannot access protected member `UnityEngine.Texture.Texture()' via a qualifier of type `UnityEngine.Texture'. The qualifier must be of type `VRTK.Highlighters.VRTK_MaterialColorSwapHighlighter' or derived from it
よくわかっていませんが、とりあえず以下のようにエラーが出ている行(146行目)をコメントアウトすればOKです:
https://github.com/thestonefox/VRTK/issues/1758 によれば、エラーが出ている行(146行目)を、
if (resetMainTexture && material.HasProperty("_MainTex"))
{
renderer.material.SetTexture("_MainTex", new Texture2D(0,0));
}
とすればいいそうです。
これでVRTKが使えるようになります。
試しにVRTK/Examples以下にあるSceneを読み込んで実行してみましょう。
物を掴めるようにするまで
以下はちょっと手抜きして、VRTK/Examples以下にあるSceneをコピーして利用することにします。
既に作ってあるSceneで対応したい場合は、Scene全体をコピーするのではなく、[VRTK_SDKManager]や[VRTK_Scripts]などをコピーすれば動くと思います(←適当)。
-
VRTK/Examples/043_Controller_SecondaryControllerActionsというシーンを開く - Sceneを別名で保存する(
File→Save Scene as...を選ぶ) - 掴みたいオブジェクトを配置する
まだ移動はできないので、手が届くところ(原点の近く)に配置する必要があります。1
- オブジェクトにColliderを追加
(既にある場合は飛ばしてよい) オブジェクトを選択して、InspectorのAdd Componentから、オブジェクトの形状に応じて適当なColliderを選んで追加し、設定する - VRTK_InteractableObjectを追加
同様にAdd Componentから、VRTK_InteractableObject(VRTK/Scripts/Interactionsにある。検索した方が早いかも)を選んで追加し、Is Grabbableにチェックを入れる - 重力や慣性の影響を受けて欲しくない場合は、
Add ComponentからRigidbodyを追加して以下のように設定:-
Use Gravityのチェックを外す(重力の影響を受けない) -
Is Kinematicにチェックを入れる(慣性の法則に従わない)
-
これでコントローラのグリップボタンで掴めるようになります。
両手で掴んで拡大縮小
拡大縮小もしたい場合は、上に加えて以下の設定をします。
- オブジェクトに上と同様、
Add Componentから以下を追加:-
VRTK_ChildOfControllerGrabAttach(VRTK/Scripts/Interactions/Grab Attach Mechanics/にある)-
VRTK_FixedJointGrabAttachなど他にも類似のものがあるので、状況に応じて使い分ける必要があるかも
-
-
VRTK_AxisScaleGrabAction(VRTK/Scripts/Interactions/Secondary Controller Grab Actions/にある)
-
-
VRTK_Interactable ObjectのGrab Attach Mechanic ScriptとSecondary Grab Action Scriptをオブジェクト自身に設定 -
VRTK_Axis Scale Grab ActionのUniform Scalingにチェックを入れる -
VRTK_Child Of Controller Grab AttachのPrecision Grabにチェックを入れると,物体のつかんだ場所を把握してより正確な動作ができるようになる
おまけ:テレポート
- 編集しているSceneを保存してから、
VRTK/Examples/004_CameraRig_BasicTeleportを開く -
[VRTK_Scripts]のPlayAreaを選択してコピーする - 編集していたSceneを再度開き、
[VRTK_Scripts]以下にペーストする
(上下移動などもしたい場合はVRTK/Examplesの他のSceneを参考にしてください) -
[VRTK_Scripts]のLeftControllerとRightControllerにVRTK_Pointer、VRTK_Bazier Pointer Renderer(またはVRTK_Straight Pointer Renderer) の 2 つを追加 -
VRTK_PointerのPointer Rendererを自分自身 (LeftControllerまたはRightController) に設定
これでスティックやトラックパッドを押しこむとポインタが表示され、離すとその時指していた場所にテレポートできるようになります。
-
ここで余計なオブジェクトは削除していいですが、参考にする為にしばらく残しておいた方がいいかもしれません。 ↩