VRTKはSDKという概念でVRデバイスの切り替えを実装しています。
Simulator(WASDで移動し、Mouseで回頭する)が使いづらいので自作してみよう
Simulatorをコピーして名前を変える
Simulatorの構成を確認
- SDK_SimXXX というのがSDKクラスを継承
- SDK_ControllerSim コントローラーのMonoBehaviour
- SDK_InputSimulator コントローラーのMonoBehaviour
となっております。
名前を決めてフォルダを作る
マウスカーソルの位置に手が動き、左クリックがトリガー、右クックがグリップとして振るまうSDKを作ってみたい。
名付けて MouseGrab
。
Systemを作る
Simulator/SDK_SimSystem
を Control-D
で複製して MouseGrab
フォルダに移動。SDK_MouseGrabSystem
にリネームする。
中身のSim, Simulator等を適当に置き換える。
[SDK_Description("MouseGrab", null, null, "Standalone")]
public class SDK_MouseGrabSystem : SDK_BaseSystem
{
}
属性でSDK名を定義している
Controller用のMonoBehaviourを作る
SDK内に相互参照があるので適当な順に作ります。
Simulator/SDK_ConstrollerSim
を Control-D
で複製して MouseGrab
フォルダに移動。SDK_ControllerMouseGrab
にリネームする。
中身のSim, Simulator等を適当に置き換える。
Controllerを作る
Simulator/SDK_SimConstroller
を Control-D
で複製して MouseGrab
フォルダに移動。SDK_MouseGrabController
にリネームする。
中身のSim, Simulator等を適当に置き換える。
Input用のMonoBehaviourを作る
Simulator/SDK_InputSimulator
を Control-D
で複製して MouseGrab
フォルダに移動。SDK_InputMouseGrab
にリネームする。
中身のSim, Simulator等を適当に置き換える。
hintCanvas 削除。使っているところも削除。
hintText 削除。使っているところも削除。
showControlHints 削除。使っているところも削除。
crossHairPanel 削除。使っているところも削除。
Boundariesを作る
Simulator/SDK_BoundariesSimulator
を Control-D
で複製して MouseGrab
フォルダに移動。SDK_BoundariesMouseGrab
にリネームする。
中身のSim, Simulator等を適当に置き換える。
Headsetを作る
Simulator/SDK_HeadsetSimulator
を Control-D
で複製して MouseGrab
フォルダに移動。SDK_HeadsetMouseGrab
にリネームする。
中身のSim, Simulator等を適当に置き換える。
Prefabを作る
セットアップ済みのprefabを作る。
Simulatorから改造するのでシーンにVRSimulatorCameraRigをインスタンス化する。
MouseGrabに名前を変える。
MouseGrabを SDK/MouseGrab
フォルダにドラッグして新しくPrefab化する。
改造する。
MouseGrabの SDK_Selection
をMouseGrabに変更する。
VRSimulatorCameraRigの SDK_InputSimulator
を SDK_InputMouseGrab
に置き換える
Canvas削除
LeftHandとRightHandの SDK_ControllerSim
を SDK_ControllerMouseGrab
に置き換える
Prefabをapplyする。
使ってみる
新規シーン。
MainCamera削除。
CreateEmpty。VRTK_SDK
にリネーム。
MouseGrab prefab を VRTK_SDK の子にする。
VRTK_SDKに VRTK_SDK Manager
をアタッチ。AutoPopulateを押す。
実行してみる。
エラーが無いことを確認。
では、本題に入ろう。
改造して動きを変える
キーアサイン
- WASD 前後左右に移動(元から)
- 矢印キーでHeadの向き変更
- マウスカーソルでHeadの向き変更をしない。マウスカーソルのスクリーン位置に手を動かす。
- 左クリックでトリガー(元から)
- 右クリックでグリップ(元から)
こんな感じで
SDK_InputMouseDragを改造
Headの向き
neckじゃなくてtransformを回転することにした。
const float _rotDegrees = 15.0f;
Vector3 _rot;
private void UpdateRotation()
{
if (Input.GetKeyDown(KeyCode.DownArrow))
{
_rot.x += _rotDegrees;
}
if (Input.GetKeyDown(KeyCode.UpArrow))
{
_rot.x -= _rotDegrees;
}
if (Input.GetKeyDown(KeyCode.LeftArrow))
{
_rot.y -= _rotDegrees;
}
if (Input.GetKeyDown(KeyCode.RightArrow))
{
_rot.y += _rotDegrees;
}
transform.rotation = Quaternion.Euler(_rot);
}
スクリーン位置に手を移動
深度決め打ちで。
float _distance = 2.0f;
private void UpdateHands()
{
var c = Camera.main;
Ray ray = c.ScreenPointToRay(Input.mousePosition);
currentHand.position = c.transform.position + ray.direction * _distance;
}
モード無用
isHandを削除して使っているところを適当に修正。
// 毎フレーム
UpdateHands();
UpdateRotation();
Gizmo
カメラ位置とレイを描画
private void OnDrawGizmos()
{
var c = Camera.main;
Gizmos.color = Color.green;
Gizmos.matrix = c.transform.localToWorldMatrix;
Gizmos.DrawFrustum(Vector3.zero,
Camera.main.fieldOfView,
Camera.main.farClipPlane,
Camera.main.nearClipPlane,
Camera.main.aspect);
Gizmos.matrix = Matrix4x4.identity;
Gizmos.color = Color.red;
Gizmos.DrawLine(c.transform.position, currentHand.position);
}
fovを40にして、farを20にしてみた。
完成
左クリックでGrabできて横に投げることができた。