為什麼JavaScript也將征服VR世界
這篇文章本應該在 2 個月前就出現了,但是一直都沒有足夠的動力去寫。直到,我最近在玩知乎,也看到了一個類似的問題。加上這是一個無聊的小長假,就把這篇文章寫出來。
這篇文章分成四部分:
- 基礎知識:3D 世界與四元數
- 一個 Hello, World
- 應用篇——高階示例
因為我只玩過公司的 Oculus DK2,所以這裡是以 DK2 為內容而展開的。
實際上,要用 JavaScript 來用 VR 程式是很簡單的一件事:
- 使用 Node.js 來讀取 Oculus 上的感測器的資料,將這些資料用 WebSocket 協議來提供一個服務。
- 尋找一個 3D 遊戲引擎,如 Three.js 來建立一個 3D 世界。
- 讀取感測器的值將其表示在 3D 世界中。
這點也可以用在混合應用上,你只需要有一個 CardBoard 即可。使用 Cordova 讀取手機感測器的資料,再通過這些資料來改變 WebView 的狀態——除了發熱會比較嚴重,應該沒有別的影響。
基礎知識:3D 世界與四元數
在我們所熟知的 3D 遊戲裡,點的位置由三個座標決定的(x,y,z),如下圖所示:
這三個座標只能表示我們在這個世界的位置,而不能上下的看這個世界。
Oculus DK2 用的是 MPU (Motion Processing Unit)晶片是 MPU6500,是第二個整合性 6 軸運動處理元件(第一個是 MPU6050)。它可以數字輸出 6 軸或 9 軸的旋轉矩陣、四元數(quaternion)、尤拉角格式(Euler Angle forma)的融合演算資料。
這時候,我們就需要尤拉角以及四元數來表示物體在虛擬世界的狀態。(PS:原諒我只能簡單地提一下)
尤拉角是一組用於描述剛體姿態的角度,尤拉提出,剛體在三維歐氏空間中的任意朝向可以由繞三個軸的轉動複合生成。通常情況下,三個軸是相互正交的。
其對應的三個角度又分別成為 roll(橫滾角),pitch(俯仰角)和 yaw(偏航角)。
而四元數則是:
四元數可以用於表示三維空間裡的旋轉。它常用的另外兩種表示方式(三維正交矩陣和尤拉角)是等價的。人們用四元數來表示旋轉要解決兩個問題,一是如何用四元數表示三維空間裡的點,二是如何用四元數表示三維空間的旋轉。
之前玩過的 6050 出來大概就是這樣子的,如果你玩四軸飛行器的話,你也應該這樣玩過:
Copy/Paste 完上面的內容後,你可能沒有啥概念,還是舉個 hello,world 的例子。
例子: 一個 hello,world
讓我們在回到一開始說的那三步,我們將需要做三件事:
- 尋找一個 Node 的 Oculus 擴充——不過,這件事現在可以交給 WebVR。
- 尋找一個 Web 的 3D 庫,及其對應的 Oculus 展示外掛。
- 讀取感測器資料,顯示到虛擬世界中。
如下圖所示:
於是找至了對應的 Node 庫有:Node-HMD,它可以讀取感測器的資料。
還有 Three.js 和 Oculus Effect 外掛,可以顯示出下面的檢視:
這樣,我們 DK2 Control 讀取感測器的資料,就可以到這個虛擬世界玩了~~。
更詳細的介紹可以見: https://github.com/phodal/oculus-nodejs-threejs-example
高階應用: 火星漫遊者
上面的應用示例還是太簡單了,讓我們來看一個高階應用——這是我們在兩個月前做的另外一個 Hackday Idea,這是另外一個“火星漫遊者”:
想象一下你想去看看火星,但是你又沒有錢去。而你可以租用這樣的一個機器人,然後你就可以在火星漫遊了。
因此,首先我們需要一個實時視訊通訊,這裡我們就用到了 WebRTC:
通過 WebRTC 我們就可以在計算機瀏覽器上實現實時通訊,再通過 Three.js 就可以將這個視訊轉為一個近似 3D 的視角。而捕獲這個視訊即可以通過手機上的瀏覽器,也可以在手機上編寫相應的 Web 應用。
這裡有一個線上的 Demo:http://laht.info/WebGL/DK2Demo.html
架構大致如下圖所示:
這樣我們就解決了實時視訊這個問題,然後我們還需要去控制硬體:
- 用 WebSocket 協議來提供 Oculus 的上、下、左、右運動的資料
- 在手機上讀取這個感測器資料,並將這個資料通過 BLE 傳送到小車上。
- 小車以通過指令來做相應的運動。
關於這部分內容的可以看我之前的那篇文章《我是如何 Hack 一個機器人的?》
總結: All in JavaScript
與C坑坑(C++)相比,JavaScript 更適合搭建原型——快速、直接、有效,畢竟 C++ 編譯需要時間的。執行起來的效果也如預期的一樣,電腦風扇各種轉,不知道是不是 Mac 專有的。不過,我想這個效能問題是一直都有的。
相關文章
- 什麼是 JavaScript 世界的 UMDJavaScript
- 為什麼MCU也需要AI?AI
- LeCun最新專訪:為什麼物理世界終將成為LLM的「死穴」?LeCun
- javascript:建構函式模式(為什麼這種方式也可以建立物件)JavaScript函式模式物件
- IT人為什麼也需要懂點FMEA?
- vr全景技術是指什麼?什麼是vr全景技術?VR
- iOS應用加固為什麼也那麼重要?iOS
- 為什麼 JavaScript 的 this 要這麼用?JavaScript
- 為什麼說區塊鏈也不是什麼好東西?區塊鏈
- 大海航行靠舵手 華為雲靠什麼征服K8S?K8S
- 3 * 0.1 == 0.3將會返回什麼?為什麼?
- 為什麼超級簽名也會掉?
- 為什麼零基礎也可以學
- JavaScript 為什麼能活到現在?JavaScript
- 為什麼 JavaScript 會無處不在?JavaScript
- 為什麼Web前端語言只有JavaScript?Web前端JavaScript
- 為什麼 JavaScript 是 TypeScript 的基礎JavaScriptTypeScript
- 幽默:Javascript為什麼算術沒算好?JavaScript
- 《新世界》遊戲體驗:既不怎麼「新」,也不怎麼「世界」遊戲
- 為什麼 JavaScript 要設計原型模式JavaScript原型模式
- 為什麼我喜歡JavaScript的Optional ChainingJavaScriptAI
- 為什麼JavaScript需要模組化開發?JavaScript
- 為什麼 JavaScript 需要非同步程式設計JavaScript非同步程式設計
- 世界這麼大,Python 也想去看看Python
- 淺析 C# Console 控制檯為什麼也會卡死C#
- 伺服器當機,我為什麼一點也不慌?伺服器
- 為什麼說BAT也容不下甲骨文員工?BAT
- 世界那麼卷?為什麼還要學精益生產
- 為什麼 JavaScript 的私有屬性使用 # 符號JavaScript符號
- [譯] JavaScript 中為什麼會有 Symbol 型別?JavaScriptSymbol型別
- 為什麼 JavaScript 中 0.1+0.2 不等於 0.3 ?JavaScript
- [譯] 為什麼我用 JavaScript 來編寫 CSSJavaScriptCSS
- 為什麼世界各地的人搶購衛生紙?
- 世界電信日,為什麼是5月17日?
- 旅行者,你為什麼來到原神世界
- 什麼是JavaScript?JavaScript
- 引領步入未來智慧世界,華為雲將怎麼做?
- 什麼是程式設計?大道之行也,“程式設計”為公程式設計
- 為什麼開源?curl作者:讓世界變得更美好