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
) に設定
これでスティックやトラックパッドを押しこむとポインタが表示され、離すとその時指していた場所にテレポートできるようになります。
-
ここで余計なオブジェクトは削除していいですが、参考にする為にしばらく残しておいた方がいいかもしれません。 ↩