WebVR和WebGL應用程序接口使得我們已經可以在瀏覽器上創建虛擬現實(VR)體驗,但從工程化的角度而言,開發社區還需要更多方便強大的開發庫來簡化編程,Mozilla的 A-Frame 框架就是這樣一個工具,提供了一個Web開發者所熟悉的標記語言來快速構建3D VR場景動畫原型,而不需要編寫過多的JavaScript和GLSL語句。本文將介紹如何使用A-Frame構建一個簡單的在線可運行實例。
參考文檔:A-Frame中文教程
概覽
當前A-Frame版本是0.5.0,由於WebVR標準乃至WebGL標準都還在快速發展演進中,因此A-Frame仍然處於高度技術實驗的狀態,遠未達成商業成熟。但是對於開啟了相應設置的最新瀏覽器而言,A-Frame是可以正常工作的。它可以在桌面、移動設備(iOS和Android)、Oculus Rift, Gear VR 和 HTC Vive上運行。
A-Frame 構建在WebGL接口之上(事實上其內置了Three.js開發框架),併為應用程序提供了一些預裝基礎組件如 - 模型、視頻播放器、天空環境、幾何模型、控制器、動畫和鼠標等。A-Frame 基於遊戲領域常用的實體組件系統(entity component system),但定位於Web開發,使用標記語言以及使用JavaScript語言來進行操作,最終達到在網頁中獲得3D虛擬現實體驗的設計目標。
搭建開發環境
我們首先需要搭建A-Frame的開發環境,這裡和以往一樣我們藉助踏得網在線開發平臺:
- 首先要有一個現代瀏覽器,支持WebGL和WebVR,比如最新版本的Firefox(Firefox Nightly)或Chrome(v54+)。
- (可選)設置一個VR設備如Oculus Rift、HTC Vive或者 Google Cardboard。
- 在踏得網在線開發平臺上新建作品(從菜單中選擇新建或按快捷鍵Ctrl+M)。
- 在左側“第三方庫”標籤欄中選擇A-Frame 0.5.0,
![A-FRAME WEBVR(網頁虛擬現實)快速開發入門教程](http://p2.ttnews.xyz/loading.gif)
- 這將在作品中自動引入A-Frame的最新JS腳本庫。
HTML代碼結構
第一步我們先創建一個空HTML文檔,在HTML面板中編寫如下代碼:
(如果你使用了踏得網在線開發平臺,此步驟可跳過,因為平臺會自動為您生成這些重複性代碼但並不顯示。)
初始化場景
場景(scene)是所有VR內容的容器,當創建新的對象後,我們只有把這些對象加到場景中,才能真正在屏幕上被看到。在 A-Frame 中,場景通過一個 場景實體(Scene entity)元素來表達。
注意:一個實體(Entity)可以是任意元素 - 可以是盒子、圓柱、圓錐對象,也可以是一個相機(camera)、光源(light)或者聲源(sound)。
我們通過在
元素中添加一個
添加幾何模型
接著我們在
上述代碼中,該立方體對象包含一些已定義屬性:顏色(color), 位置(position)和角度(rotation)。
注意:這裡的距離數值(比如立方體的y座標位置)是無單位的,也可以是任何適用於你的場景的單位 - 毫米,米,英尺或英里 - 由你自己來定。
我們還可以添加一些其他基礎模型如圓柱體等,這裡代碼略過,我們在文章最後會給出完整的在線實例。
添加一個背景:天空盒(Sky box)
一個天空盒(skybox)是三維世界的背景,通過一個
到這裡,如果你點擊菜單中的“運行”按鈕(或者按CTRL+R快捷鍵),我們將看到一個帶背景的立方體,並且可以通過鼠標(如果是通過電腦屏幕查閱該作品)操控它:
![A-FRAME WEBVR(網頁虛擬現實)快速開發入門教程](http://p2.ttnews.xyz/loading.gif)
我們很容易就完成了一個VR小應用,這是因為 A-Frame 幫我們做了很多事情:
- 該應用程序包含了一個缺省的光源和相機,所以我們能看到場景中的模型。
- 有現成可用的操作控制器:可以360°瀏覽,可以通過鍵盤上的WASD按鍵來行走。
- 屏幕右下角還有一個"Enter VR mode"按鈕(眼鏡形狀的圖標),可以切換到全屏模式,如果你設置好了VR設備,那麼將可以進入虛擬現實模式。
指定一個相機
相機通過
position="0 1 4" cursor-visible="true" cursor-scale="2" cursor-color="#0095DD"
cursor-opacity="0.5">
上述代碼中,我們還通過 cursor-* 屬性給相機定義了遊標(cursor,缺省情況下不可見)- 我們設置了遊標的縮放因子(scale),這樣就更容易被看見,透明度設置為0.5,這樣不會完全擋住遊標後面的物體。
添加光源
A-Frame中的基礎光源類型是平行光(directional light)和環境光(ambient light)。平行光被放在場景某處而環境光是來自該平行光的反射,這樣光線看起來比較自然。光源元素的標籤為
type="directional" color="#FFF" intensity="0.5" position="-1 1 2">
type="ambient" color="#FFF">
這樣我們添加了一個白色平行光,光強為0.5,位置在 (-1, 1, 2) 。環境光也是白色。
添加高級模型
前面我們通過
geometry=" primitive: torus; radius: 1; radiusTubular: 0.1; segmentsTubular: 12;" rotation="10 0 0" position="-3 1 0">
這裡的實體其幾何模型基於一個麻花原型(torus primitive),其他的一些參數用來定製該模型的外形:torus的外邊界半徑、管道半徑和管道分段數,位置和角度的設置和前述的立方體類似。
定義材料
現在我們已經在場景中可以看到 torus 模型,但顏色看起來不太好,因為該模型還缺少定義其表面屬性的材質(material ),我們需要創建一個材料來定義實體表面的外觀,修改上述代碼為如下所示:
geometry=" primitive: torus; radius: 1; radiusTubular: 0.1; segmentsTubular: 12;" material=" color: #EAEFF2; roughness: 0.1; metalness: 0.5;" rotation="10 0 0" position="-3 1 0">
上述代碼中,我們給 entity 添加了一個新的 material 屬性,並給定了該 material 的顏色(color)、粗糙度(roughness,越粗糙的物體散射越均勻)和金屬性(metalness)。
通過JS來動態創建模型對象
我們當然可以通過JavaScript來添加物體,下面的代碼將動態創建一個圓柱體對象並加入場景中,當然JS代碼需要被放在一個
閱讀更多 新無止競 的文章