読者です 読者をやめる 読者になる 読者になる

MEBIUSTOSのブログ

主にUnityに関する技術的な事を書いていきます。 Twitter @xflutexx

OVRPlayerControllerのカメラの高さを操作する

そろそろOculus DK2を被っても快適な季節になってきたので、Oculusについて。

頭の高さを操作したい

まぁ、色々とあると思うんですよ。片手で頭の高さを操作したいシチュエーション。たとえば、ソファに座ってシャム猫を撫でつつも仮想世界でパンツ覗きたい時とか。

本来であれば、床に頭をこすりつけ無様な格好で覗くのが正しいVR作法な気もしますが……。でも、ほらあれですよ!小人になったシチュエーションとかにも使えるじゃないですか!!(適当)

コード

このコードをOVRPlayerControllerにアタッチすればオッケーです。UnityOculusUtilities_0_1_0_betaで動作確認しています。仕組みはTrackingSpaceのローカルポジションを弄っているだけです。

using UnityEngine;

public class OVRHeightController : MonoBehaviour {

    public float InitialAdjustment;

    public string UpKeyKeybord = "2";
    public KeyCode UpKeyCode = KeyCode.JoystickButton3;
    public string DownKeyKeybord = "1";
    public KeyCode DownKeyCode = KeyCode.JoystickButton0;
    public string RecenterKeybord = "r";
    public KeyCode RecenterCode = KeyCode.JoystickButton6;

    Transform TrackingSpaceTransform = null;

    void Start() {
        OVRCameraRig[] rigs;
        rigs = gameObject.GetComponentsInChildren<OVRCameraRig>();

        if (rigs.Length == 0)
            Debug.LogWarning("OVRCameraRig not found.");
        else if (rigs.Length > 1)
            Debug.LogWarning("OVRCameraRig some found.");
        else {
            this.TrackingSpaceTransform = rigs[0].transform.FindChild("TrackingSpace");
            var p = this.TrackingSpaceTransform.transform.localPosition;
            p.y += InitialAdjustment;
            this.TrackingSpaceTransform.transform.localPosition = p;
        }
    }

    void LateUpdate() {
        if (this.TrackingSpaceTransform) {
            var p = this.TrackingSpaceTransform.transform.localPosition;
            if (Input.GetKey(UpKeyKeybord) || Input.GetKey(UpKeyCode)) {
                p.y += 0.01f;
            } else if (Input.GetKey(DownKeyKeybord) || Input.GetKey(DownKeyCode)) {
                p.y -= 0.01f;
            }
            this.TrackingSpaceTransform.transform.localPosition = p;

            // Recenter Pose
            if (Input.GetKeyDown(RecenterKeybord) || Input.GetKeyDown(RecenterCode)) {
                OVRManager.display.RecenterPose();
            }
        }
    }
}

操作方法(初期設定の場合)

カメラ上昇 … 2キー or ジョイスティック ボタン3
カメラ下降 … 1キー or ジョイスティック ボタン0
カメラ中央位置再設定 … rキー or ジョイスティック ボタン6