【VR,OculusGo,Unity】素人がコントローラーの回転速度、加速度について調べてみた Part1
さて、レーザーポインターでオブジェクトを取得できるようになった。
リモコンの回転速度と加速度をTextで表示してどういう風になっているのか調べてみよう。
ものを気持ちよく投げるにはどうすればいいのか。
Virtual Virtual Reality(VVR)はタッチパッドでものと自分の距離を決めて、コントローラーの加速度で振り回すことができた。加速しているときにタッチパッドクリックで離すとうまく飛んで行く。
ただ、正直タッチパッドクリックは押しにくい。
VVRはものを投げることに重きを置いてないと思われるので、当然と言えば当然だ。
とりあえず。コントローラーの加速度、回転速度を調べよう。
コントローラーの回転速度
参考記事
Oculus Integrationで取得出来るOculus Goの主要な入力【Unity】【VR】【アセット】【Oculus Go】 - (:3[kanのメモ帳]
//コントローラの回転速度、加速度
Vector3 angVel = OVRInput.GetLocalControllerAngularVelocity(activeController);
Vector3 angAcc = OVRInput.GetLocalControllerAngularAcceleration(activeController);
回転速度と加速度があるようだ。どちらもVector3。違いがわからん。
実践
とりあえず、全ての復習を兼ねて新規プロジェクトで作って行く。
1.新規プロジェクト
- 3Dで新規プロジェクト
- SwitchPlatform
- unitypackageを入れる
- PlayerSettingいじる
- 新しいSceneを作る
- OVRCameraRig をSceneに追加。
2.コントローラーを取得
RightHandAnchorを取得するコード書いて、そこから加速度、回転速度をテキストに表示させるようにしたい。
- 空のオブジェクトからGameManagerを作成
- C#Script『GameManager』を作成
- 作ったScriptをGameManagerに入れる
- Canvas作ってText2つ作る
- CanvasのRenderModeをScreenSpaceでCenterEyeAnchor入れる
- Textをフォントサイズをいい感じに変える
- GameManager Scriptを書き換える
GameManager
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class GameManager : MonoBehaviour { public GameObject controller; public Text accText; public Text velText; // Update is called once per frame void Update () { } }
- InspectorからTextとControllerを入れる
- んで、Update()にこれ追加
GameManager 一部void Update () { Vector3 angVel = OVRInput.GetLocalControllerAngularVelocity(controller); Vector3 angAcc = OVRInput.GetLocalControllerAngularAcceleration(controller); accText.text = "" + angAcc; velText.text = "" + andVel; }
- でBuild
できると思ったらエラーがいっぱい出た。
Oculus公式のAssetのサンプルGearVrControllerTestのコントローラー入力関連Scriptみてみると
コントローラーは
OVRInput.Controller activeController = OVRInput.GetActiveController();
で取得する必要があるらしい。
んで書き換え。
3.エラーからのコード変更
- GameManager Script書き換え
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class GameManager : MonoBehaviour { public Text accText; public Text velText; // Update is called once per frame void Update () { OVRInput.Controller activeController = OVRInput.GetActiveController(); Vector3 angVel = OVRInput.GetLocalControllerAngularVelocity(activeController); Vector3 angAcc = OVRInput.GetLocalControllerAngularAcceleration(activeController); accText.text = "Acc : " + angAcc; velText.text = "Vel : " + angVel; } }
- Build
次はできた。ただ、全然Textで表示してもわからん。
3.四角を回してみる
参考記事
- Quaternion.Euler(X軸周りの回転角度, Y軸周りの回転角度, Z軸周りの回転角度)を使う
- cubeのRotationに色々代入してみた
// ちょっとしか動かない // cubeVel.transform.rotation = Quaternion.Euler(angVel.x, angVel.y, angVel.z); // できなかった Quaternionは + はできないらしい // cubeVel.transform.rotation += Quaternion.Euler(angVel.x, angVel.y, angVel.z); // 手と連動して動いたが何か違う // cubeVel.rotation *= Quaternion.Euler (angVel.x, angVel.y, angVel.z); // 参考記事はz軸の移動なかった // うーん、なんか反対? //cubeVel.rotation *= Quaternion.Euler (angVel.x, angVel.y, 0); cubeVel.rotation *= Quaternion.Euler (-angVel.x, -angVel.y, -angVel.z);
- 最後の全て-にしたらこんな感じでコントローラーと連動した動きになった
今までUnityで2Dばかりで3Dいじってなかったので、quaternionを使ったことなかったので、全然使い方がわからなかった。
なぜ全て-にするとコントローラーと連動するのか全然わかっていない。
追記
あとで気が付いたが、コントローラーのrotationをそのままcubeに突っ込めば、完全連動できる。
cubeAcc.transform.rotation = controller.rotation;
回転速度はオブジェクトを選択してから、そこからダイヤルを回すなどの現在のコントローラーの傾きからの相対的回転させる時に必須?
今の自分の知識じゃものを気持ちよく投げるプログラムが全く浮かばない。ってかquaternionがむずすぎる。