使用Kinect2作爲Oculus遊戲應用的輸入設備

注: 文章寫於2015年8月, 目前VR遊戲Demo已經完結, 所以把上一次預研的一些經驗分享出來, 希望對大家有所幫助

背景

初接觸Oculus時, 從網上下載了一大堆的Demo來體驗, 但是, 操作體驗大都比較差, 特別是FPS類. 這也讓我們意識到, 對於VR遊戲, 最大的挑戰還不是顯示方式的變化, 而是交互方式. 在一個沉浸式的環境中, 最自然的交互就是最完美的方式. 其中基本的需求, 就是可以使用雙手跟VR中的虛擬環境進行交互. 這麼一來, 首先鍵鼠或手柄就被排除掉了, 我們只好針對市面上的一些輸入設備, 挨個進行評估實驗:
- Wiimote: 只能檢測運動和方向, 無法準確定位雙手的位置
- Leap Motion: 粘在Oculus上可以模擬出雙手, 但是識別範圍太小, 骨骼的穩定性比較差, 嚴重影響體驗
- Razer Hydra: 可以獲取雙手的空間位置和旋轉, 加上兩個手柄上的按鍵也能觸發一些狀態切換, 算是看起來還不錯的方案. 缺點是位置偏差比較大, 可能是磁場受干擾的問題
- RealSense: 類似LeapMotion, 但是精度比較低, 導致識別出的骨骼位置抖動嚴重, 無法用於雙手的骨骼映射

試來試去, 好像目前市面上除了高成本的動作捕捉設備, 還沒有比較完美的VR輸入設備可以用. 最後, 把目光轉向了旁邊XboxOne開發機配的Kinect2.
因爲我們組去年進行了XboxOne體感遊戲的研發, 積累了一些Kinect2體感操作的經驗, 就把Kinect2連接到了PC上, 看看能不能把體感操作與Oculus的VR顯示結合到一起.

需求分析

前面也提到了, 儘量達到接近自然的交互方式, 那就需要實現這幾個關鍵點:

  • 可以在虛擬世界中顯示出雙手, 最好能有肢體軀幹
  • 虛擬空間中的雙手位置與現實空間中跟頭部的相對位置(包括旋轉)保持一致
  • 可以使用雙手對虛擬世界中的物體產生影響
  • 能夠識別一些簡單的手勢, 如抓, 推, 拉, 按, 摸等等

那Kinect2提供的數據或者功能有哪些呢?

  • 30幀/s的Color/Depth/BodyIndex/IR數據
  • 身體骨骼位置和朝向(比較不穩定, 會抖動)
  • 雙手的三種狀態識別, 正好對應 石頭 剪刀 布(誤識別率較高)
  • 其它諸如語音之類的功能暫時用不上

像LeapMotion那樣每根手指單獨識別是做不到了, 退而求其次, 只能在交互設計上就去規避過小元素, 使用整個手掌做爲交互
雙手的骨骼位置可以爲我們提供雙手的空間定位, 而三種狀態可以參考我們在XboxOne體感遊戲中的UI交互經驗, 把抓住拖動之類的手勢利用起來

實現細節

雙手肢體的繪製

因爲Kinect API已經提供了人體骨骼的變換信息, 那自然而然的我們就想在遊戲中綁定到一個蒙皮模型上
這裏寫圖片描述

最終我們也在UE4中實現了, 但是體驗下來非常不滿意, 爲什麼呢?

  • Kinect中獲取的骨骼變換信息會頻繁抖動, 如果不進行處理, 會像抽風一樣
  • 如果對骨骼變換數據進行穩定性的過濾處理, 會增加響應延遲, 導致虛擬肢體的動作比實際總是慢半拍
  • 不同體形的的人的映射到同一模型的效果會有問題, 比如想象一下一個身材高大的人在Oculus中看到自己胳膊變短了是什麼感覺. 這會影響基於直覺和經驗的空間位置判斷

那還有什麼別的方法去實現雙手肢體的繪製嗎? 在使用KinectStudio調試時, 發現3D視圖下的深度呈現比較有意思:
這裏寫圖片描述

其實這就是深度數據(DepthBuffer)映射到3D空間裏的離散的點, 這裏我把這種表示方式稱之爲 “點雲(PointCloud)”
這裏寫圖片描述

於是突發奇想, 在虛擬空間使用點雲表現自己的軀體, 雙手手指的動作也可以精確地映射過去. 那麼, 這可行嗎?

  • 延遲: 由於DepthBuffer是硬件採集的原始數據, 是沒有經過處理的, 不存在中間的數據處理時間(延遲), 所以在響應速度上肯定是非常理想的, 可以控制在70ms左右(Kinect2硬件固定60ms)
  • 數據量: DepthBuffer的分辨率是512x424, 也就是需要映射到21萬多個頂點, 雖說有點多, 但也在可接受範圍內, 實在不行可以隔行取點, 以最終效果需求爲準
  • UE4點雲渲染: 每幀根據DepthBuffer計算出對應的VertexBuffer, 構建DynamicMesh進行繪製, PrimitiveType使用PointList
    這裏寫圖片描述

然後再根據BodyIndex數據剔除掉周圍環境和其它人的點, 就完美的把自己映射到UE4的3D場景中了. 下圖加了個簡單的材質, 頂點法線使用地形中常用的SlopeBased方法計算
這裏寫圖片描述

點雲座標系對齊

有了點雲的軀體了, 怎麼把它 “裝”在虛擬世界中的頭下面呢?
由於Kinect, Oculus, UE4相當於是三個不同的座標系, 如果要把點雲映射到Oculus視角下身體的位置, 需要一些座標映射和轉換.

  • UE4已經默認集成了Oculus的支持, 所以這兩個座標系的處理不用我們操心了, 默認Oculus頭戴顯示器的座標就是UE4攝像機的位置加上PostionTracking的Offset
  • 而Oculus頭戴顯示器的位置來源於Oculus DK2中帶的CameraSensor, 這纔是Oculus虛擬座標的基準點, 只不過UE4做了變換, 把Oculus初始位置映射到了攝像機的位置上
  • Kinect中的DepthBuffer映射成頂點後, 全都是CameraSpacePoint, 即Kinect設備本身就是原點. 需要注意的是, Kinect座標與UE4座標需要做一下轉換, 對應關係爲 UE4Vector = FVector(-V.Z * 100, V.X * 100, V.Y * 100)

那找到Oculus和Kinect座標系中分別固定不動的基準點後, 把它們進行對齊, 兩邊的座標系不就可以重合了? 方法很簡單, 把Kinect和Oculus的CameraSensor”合體”:
這裏寫圖片描述

遊戲中可以通過CameraComponent位置和Oculus的CameraOrigin計算出Sensor的世界座標, 然後把點雲對齊到這個位置即可, 通過一個可以保存配置的Offset進行偏移校正
這裏寫圖片描述

交互設計

整個交互靈感其實來源於鋼鐵俠電影裏的全息投影的交互片段, 我們的目標就是把這種科幻片中常常出現的鏡頭變成現實
這裏寫圖片描述

以全息投影的感覺做爲美術風格的指導方向, 結合我們日常接觸最多的功能, 我們實現了5種交互控件:

  • 圖片查看器: 只有一個翻頁操作
    這裏寫圖片描述

  • 視頻播放器, 可以操作播放/暫停, 放大後有電影院看電影的感覺, 這也是目前VR視頻應用比較常用的方式
    這裏寫圖片描述

  • 網頁瀏覽器: 我們集成了CEF, 相當於內嵌了一個chrome, 支持HTML5的遊戲. 下面的視頻中我們選擇了一個H5的猜單詞小遊戲, 支持網頁上的點擊操作
    這裏寫圖片描述

  • 打飛機小遊戲: 這個是使用體感操作的, 雖然是一個2D平面的遊戲, 但是爆炸後的碎片會落到地板上, 視覺效果還不錯
    這裏寫圖片描述

  • 模型查看器: 主要是用於演示在3D空間怎麼用雙手比較直觀地觀察一個三維物體, 可以說這纔是VR交互的亮點所在, 你可以從各個角度和任意大小去觀察一個物體的每一個細節
    這裏寫圖片描述

每個控件我們還做了統一的Tooltips的彈出動畫提示, 這種3D空間的信息顯示也是AR應用場景中比較常見的
這裏寫圖片描述

爲了更好地展示每個控件的功能, 我們把整個全息交互場景分成了前後兩”層”

  • 遠景: 只能同時存在一個控件, 可以抓住進行拖動和縮放操作, 並進行每個控件特定的功能操作, 如網頁的點擊, 小遊戲的手勢移動等等.
  • 近景: 擺放各個功能控件, 相當於任務欄圖標, 可以通過手勢把它”扔”到遠景的那一層上去, 相當於窗口最大化/Active狀態

對遠景的控件進行操作時, 雙手各加了一根閃電特效, 如同釋放魔法一樣, 在遠處控件上模擬出類似iPad的操作體驗

PS: 爲了不對第一人稱的VR顯示產生干擾, 已經把點雲的頭”砍”掉了
這裏寫圖片描述
近景的交互是基於雙手的”Touch”操作, 通過Kinect獲取雙手骨骼位置, 掛了兩個碰撞體用於檢測與控件之間的Overlap狀態
這裏寫圖片描述

效果展示

點擊播放視頻(略)

優化

基於VertexBuffer的點雲由於要進行頂點座標計算, 十分消耗CPU, 爲了節省時間, 可以把頂點計算轉移到GPU, 使用靜態VertexBuffer+動態VertexTexture進行Mesh的構建, 而同時帶來的好處是點雲不再限於Point渲染, 可以做成Particle的樣子
這裏寫圖片描述
這裏寫圖片描述

總結

在做VR技術預研的過程中, 我們也發現三大VR設備(Oculus, Steam VR, PS VR)的發佈的操作設備已經趨於一致: 雙持控制器, 每個控制器都可以獲取位置和旋轉, 並且帶有傳統的按鈕和搖桿. 這雖然不是最自然的交互方式, 但是也是目前在成本和功能之間的一種平衡, 後續的VR遊戲開發, 操作上就可以基於這些設備做統一的設計.

有了這個VR交互Demo的成功經驗, 我們把這種交互方式也帶入了正在開發的一個VR遊戲Demo, 在Oculus Touch沒上市之前, 這是目前我們能在VR中實現的比較好的操作體驗. 個人以爲, 只是顯示方式的變化並不能帶來遊戲性上的太大變化, 雙手控制器纔可以讓VR遊戲玩法產生更多創意, 從根本上推動產生新的遊戲類型和全新體驗.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章