1. 程式人生 > >HTC VIVE開發教程(三)

HTC VIVE開發教程(三)

在這一節,我介紹的主要內容有

  • [CameraRig]預製體
  • [SteamVR]預製體
  • [Status]預製體

在SteamVR外掛的Prefabs資料夾下面有三個預製體,CameraRig是相機預製體,使用時直接將這個預製相機作為主相機拖入場景中,我們就能以第一人稱看到VR頭盔裡面的內容。Status是通過overlay顯示一些狀態資訊的預製體。SteamVR是渲染核心預製體,不需要手動新增,會自動建立。下面我就來詳細講解這三個預製體。

[Camerarig]

<div align="center">![這裡寫圖片描述](https://img-blog.csdn.net/20160926164717530)</div>

我們可以看到,在Camerarig下面有一個左右手柄的Controller和一個頭部的Camera

這裡寫圖片描述這裡寫圖片描述

在手柄Controller和頭部的Camera上都有一個Steam VR_Tracked Object指令碼,這是用來跟蹤裝置位置的指令碼。

void OnEnable()
    {
        var render = SteamVR_Render.instance;
        if (render == null)
        {
            enabled = false;
            return;
        }

        SteamVR_Utils.Event.Listen("new_poses"
, OnNewPoses); //監聽new_poses通知 }

我們在前面分析SteamVR渲染指令碼SteamVR_Render時提到過在渲染迴圈裡面有不斷獲取裝置位置,併發送通知的邏輯,SteamVR_Utils.Event.Send(“new_poses”, poses),可以看到在Steam VR_Tracked腳本里面有註冊這個監聽,所以這個指令碼可以不斷的獲取裝置位置,同時更新在顯示畫面中的位置。我們在來看看OnNewPoses這個方法

private void OnNewPoses(params object[] args)
    {
        if (index == EIndex.None
) //裝置的索引,頭顯預設為0 return; var i = (int)index; isValid = false; var poses = (Valve.VR.TrackedDevicePose_t[])args[0]; if (poses.Length <= i) return; if (!poses[i].bDeviceIsConnected) return; if (!poses[i].bPoseIsValid) return; isValid = true; var pose = new SteamVR_Utils.RigidTransform(poses[i].mDeviceToAbsoluteTracking); if (origin != null) { pose = new SteamVR_Utils.RigidTransform(origin) * pose; pose.pos.x *= origin.localScale.x; pose.pos.y *= origin.localScale.y; pose.pos.z *= origin.localScale.z; transform.position = pose.pos; transform.rotation = pose.rot; } else { transform.localPosition = pose.pos; transform.localRotation = pose.rot; } }

OnNewPoses的方法就是設定裝置的transform,使得裝置的實際空間中的位置與在頭顯畫面中看到的位置一致。
Camera上面還有一些指令碼,SteamVR_Camera.csSteamVR_CameraFlip.cs這兩個指令碼作用都是對相機渲染出來的影象進行一定的處理變換。SteamVR_GameView.cs是用來顯示執行VR時pc上面的伴隨視窗的。這裡面的程式碼都不是太複雜,就不一一介紹了。

[SteamVR]

這裡寫圖片描述

在SteamVR這個預製體只有Stean VR_Render這一個指令碼,這個指令碼在之前已經介紹了。這個預製體是必須在專案中新增的,即使不手動新增也會自動新增。
Pause Game When Dashboard Is Visible引數控制是否在顯示控制面板時暫停遊戲(在遊戲過程中按系統鍵就會彈出控制面板),實際做法是將Unity的Time.timeScale設為0,相當於時間暫停了。
Lock Physical Update Rate To Render Frequency引數鎖定物理更新頻率為(頭顯)渲染幀率。這個會根據頭顯的渲染幀率來計算Unity的更新頻率。
External Camera為外部相機,它的作用是製作那種將玩家的現實場景與虛擬的遊戲場景融合的視訊。
Tracking Space為跟蹤空間的型別,可以設為坐姿和站姿,坐姿和站姿的區別是視角的高度。

[status]

這裡寫圖片描述

status預製體的用處並不是很大,它的下面有6個元件,我來分別說一說這6個元件的作用

Calibration:這個元件用在Vive進行房間設定時進行相應的提示

這裡寫圖片描述

_Stats:這個是顯示統計資訊的一個元件(目前僅顯示幀率和丟幀數)。它上面還有一個Camera,通過它將GUIText渲染到overlay的紋理上,通過overlay將文字資訊顯示出來。它的顯示效果如下圖

這裡寫圖片描述

TrackingLost:這個是失去頭顯定位後給的文字提示

TrackingRestored:這個是恢復頭顯定位後的提示資訊

SteamInitFailure:這個是Steam初始化失敗後的文字提示

Overlay:這個控制元件的作用是是一個2D的UI介面疊加到場景上面顯示出來