1. 程式人生 > >VR入門筆記一

VR入門筆記一

去年是VR元年,本人也跟風搞過一段時間的VR,工作室資助買了一套Oculus CV1還攢了一臺主機,畢竟對於苦逼的在校大學生,動不動一兩萬的裝置錢還是貴的,不過我們老師馬上要申請一個VR實驗室,就可以有錢搞一波兒了大笑今天學弟問我VR程式怎麼做,所以就簡單的來說一下。

VR簡介

首先說一下什麼是VR

VR(Virtual Reality):虛擬現實技術,是一種可以建立和體驗虛擬世界的計算機模擬系統,它利用計算機生成一種模擬環境,是一種多源資訊融合的、互動式的三維動態視景和實體行為的系統模擬使使用者沉浸到該環境中。

與此相關的還有:

AR(Augmented Reality),增強現實,去年挺火的Pokemon Go就是一款AR遊戲
MR(Mix Reality),混合現實,嚴格意義上講HoloLens應該是一款MR產品而不是AR
CR(Cinematic Reality),影像現實,這個是Google投資的Magic Leap提出的概念,主要為了強調與VR和AR技術的不同,同樣,其自認為與MR也不同,實際上理念是類似的

第一個VR程式

這裡我開發VR用的是Unity3D引擎,其中Oculus使用VR開發的話只要在設定的時候配置一下就可以了,其中HTCVive的開發平臺雖然是SteamVR,但是可以在Unity3D配置外掛既可以使用,或者直接使用OpenVR(OpenVR 是由 Valve 公司開發的一套 VR 裝置通用 API ,換而言之,不管是 Oculus Rift 或 HTC Vive 甚至是其他 VR 裝置,都不再需要使用產商提供的 SDK 就可以進行開發,有種打算一統天下的範兒,使用新的OpenVR SDK將不必關注硬體裝置本身裝置造成的差異。),至於那些手機VR就更簡單了。

首先啟動Unity3D,新建一個專案,在場景中新增一個Cube,然後點選Edit->Project Setting->Player,在Inspector的Other Settings裡面選中Vrtual Reality Supported,選擇相應的SDK即可(我這裡用的Oculus的頭盔,所以選擇的Oculus的SDK)


然後連線好裝置,點選執行,即可在頭盔裡看到VR影像

網上很多教程到這裡就結束了,但是相信對於跟多初學者這有點糊弄人,只是設定一個引數而已,其他都沒說。

首先應該想到的是頭盔運動。怎樣可以進行360°的視線變換。現在個人的理解是VR的頭盔運動相當於滑鼠的運動,所以想要視線隨著頭盔運動只要攝像頭跟隨頭盔運動即可

新建一個C#指令碼,命名為CameraMove,新增如下程式碼

    public float sensitivityX = 10f;
    public float sensitivityY = 10f;

	// Use this for initialization
	void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {
        float CameraX = sensitivityX * Input.GetAxis("Mouse X");//滑鼠x方向運動
        float CameraY = sensitivityY * Input.GetAxis("Mouse Y");//滑鼠y方向運動
        this.transform.Rotate(-CameraY, CameraX, 0);//攝像頭旋轉
	}

將該指令碼新增到攝像機上,再次執行,你會發現你的視線將跟隨你的滑鼠轉動,帶上頭盔,將可以進行360°觀察

VR原理

首先大家應該明白人的左右眼看到的影像是不一樣的,而VR就是利用這個不一樣讓眼睛產生立體的觀感,所以無論是Oculus、HTC那些VR頭盔還是暴風魔鏡、Google眼鏡之類的都是利用的左右眼的視線偏差,所以大家會看到很多手機上的VR遊戲或者電影都是分成左右兩屏的,所以這個時候如果大家再使用VR眼鏡的時候如果出現左右無法重合的時候就會影響VR的體驗


同時由於人的眼睛的視野時100°,而平面的視線為90°,所以VR眼鏡的鏡片是凸面鏡。如下圖所示


眼睛通過左右眼關注到某點的直線交點確定空間中點的位置。正常人的視力範圍比視野要小,因為視力範圍是要求能迅速、清晰地看清目標細節的範圍,只能是視野中的一部分。簡單來說,VR頭盔的兩個鏡片可以看成兩個完全相同的放大鏡, VR頭盔強調的沉浸感,一方面取決於螢幕的大小,另一方面取決於鏡片彎折光線的能力。因此,就引出了視場角(FOV)的概念,這也是廣大VR廠商經常宣傳的一個引數。

所以我們可以根據這個原理來設計一下不用Oculus之類的頭盔的VR應用(用兩個攝像機分屏完成影象的顯示

首先新建一個場景,同樣新增一個Cube物體,將原來的Main Camera刪除,再新增一個GameObject命名為VRCamera,然後在VRCamera新增兩個Camera,分別命名為LiftCamera,RightCamera分別代表人的左右兩隻眼睛。


這個時候顯示出來的只有一個螢幕,所以我們需要設定LiftCamera,RightCamera的顯示引數,將Inspector->Camera->Viewport Rect中的x改為-0.5和0.5,這時你會發現Game視窗的影象分成了左右兩個部分(同樣的手機上執行時可以修改y值,使其分成上下兩個部分)。但是現在這個時候左右兩個影象的內容是完全一致的,像我上文說的人的左右眼觀察的影象是有略微差別的,如果直接這樣執行左右影象無法重合,感到眩暈,這裡就需要調整左右攝像頭的位置。這裡我是將Transform中的Position中的x值設定為了-0.03和0.03,相當於人的左右眼睛的距離(這裡我沒有太多的計算依據,如果大家有什麼方法歡迎交流)