元宇宙趨勢(shì)下的前端,有哪些機(jī)會(huì)與挑戰(zhàn)
大廠技術(shù) 高級(jí)前端 前端架構(gòu)
點(diǎn)擊上方 全棧前端精選,關(guān)注公眾號(hào)
回復(fù)1,加入高級(jí)前端交流群
-
原文地址:https://juejin.cn/post/7001419484376350727 -
作者:
資本熱詞:Metaverse
-
7 月 28 日 扎克伯格表示,該公司正在組建一個(gè)產(chǎn)品團(tuán)隊(duì),致力于元宇宙(Metaverse)的開發(fā)。“未來五年內(nèi),將 Facebook 從社交媒體網(wǎng)絡(luò)轉(zhuǎn)變?yōu)橐粋€(gè)元宇宙公司?!? -
英偉達(dá)通過一部紀(jì)錄片自曝:“今年 4 月份那場(chǎng)發(fā)布會(huì),全部是合成的” -
今年3月初,“元宇宙第一股” 的美國多人在線 3D 創(chuàng)意社區(qū) Roblox(羅布樂思) 已在紐交所上市,而其當(dāng)天股價(jià)暴漲 54.4% -
騰訊拿下了 Roblox 中國區(qū)代理 -
2020 年 12 月,騰訊 CEO 馬化騰表示,移動(dòng)互聯(lián)網(wǎng)時(shí)代已經(jīng)過去,全真互聯(lián)網(wǎng)時(shí)代才是未來。 
-
游戲公司 Epic Games 在 4 月獲得 10 億美元投資用來構(gòu)建元宇宙 -
國內(nèi)方面號(hào)稱要打造全年齡段元宇宙世界的 MeteApp 公司,在 Roblox 上市后拿到了 SIG 海納亞洲資本領(lǐng)投的 1 億美元 C 輪融資 -
字節(jié)跳動(dòng)于 4 月被曝光已投資 “中國版 Roblox ” 代碼乾坤近億元 -
陌陌王力表示,未來隨著虛擬現(xiàn)實(shí)的進(jìn)一步發(fā)展,VR/AR 硬件的不斷成熟向家用普及以及人機(jī)交互模式的變化,必然會(huì)出現(xiàn)新的機(jī)會(huì),也就是一種直接將人背后的生活串聯(lián)起來的方式。 -
阿里前端委員會(huì)互動(dòng)技術(shù)方向重點(diǎn)也是“虛擬角色”和“ AR/VR ”
可以看到:“交互娛樂類資本瞄準(zhǔn)的互聯(lián)網(wǎng)未來 - 元宇宙”
何為元宇宙
-
首次出現(xiàn):1992 年尼爾·斯蒂芬森的科幻小說《雪崩》當(dāng)中,在這部小說中講述了大量有關(guān)虛擬化身、賽博朋克等場(chǎng)景。
-
維基百科:通過虛擬增強(qiáng)的物理現(xiàn)實(shí),呈現(xiàn)收斂性和物理持久性特征,基于未來互聯(lián)網(wǎng),具有鏈接感知和共享特征的3D虛擬空間。
-
簡(jiǎn)單點(diǎn)講就是:我們?cè)谔摂M世界中與一個(gè)全新的身份一一對(duì)應(yīng),并且不會(huì)間斷地“生活下去” -
Roblox 提出一個(gè)真正的元宇宙產(chǎn)品應(yīng)該具備八大要素,很容易就能讓人聯(lián)想到《頭號(hào)玩家》這部電影:
-
身份:擁有一個(gè)虛擬身份,無論與現(xiàn)實(shí)身份有沒有相關(guān)性。
-
朋友:在元宇宙當(dāng)中擁有朋友,可以社交,無論在現(xiàn)實(shí)中是否認(rèn)識(shí)。
-
沉浸感:能夠沉浸在元宇宙的體驗(yàn)當(dāng)中,忽略其他的一切。
-
低延遲:元宇宙中的一切都是同步發(fā)生的,沒有異步性或延遲性。
-
多元化:元宇宙提供多種豐富內(nèi)容,包括玩法、道具、美術(shù)素材等。
-
隨地:可以使用任何設(shè)備登錄元宇宙,隨時(shí)隨地沉浸其中。
-
經(jīng)濟(jì)系統(tǒng):與任何復(fù)雜的大型游戲一樣,元宇宙應(yīng)該有自己的經(jīng)濟(jì)系統(tǒng)。
-
文明:元宇宙應(yīng)該是一種虛擬的文明。
作為大家口中的“互聯(lián)網(wǎng)的最終形態(tài)”,需要如今大熱的包括 AR、VR、5G、云計(jì)算、區(qū)塊鏈等軟硬件技術(shù)的成熟。才能構(gòu)建出一個(gè)去中心化的、不受單一控制的、永續(xù)的、不會(huì)終止的世界。
上面提到的各項(xiàng)技術(shù),和目前前端關(guān)聯(lián)比較大的,便是 AR、VR。
AR 現(xiàn)狀
有種新瓶裝舊酒的感覺,VR、AR 概念大火的時(shí)候還是 17、18 年。幾年來,AR 被用來創(chuàng)建虛擬的地方游覽、設(shè)計(jì)和協(xié)作 3D 模型、游戲、娛樂、購物、營(yíng)銷、學(xué)習(xí)、可視化等等。從可用到易用,再到體驗(yàn)的升級(jí),這是用戶體驗(yàn) UX 上一輪的主要革新命題,新一輪的用戶體驗(yàn)革命會(huì)聚焦在如何真正提供體驗(yàn)的價(jià)值。目前 AR 在生活中發(fā)揮的就是這樣的作用。
案例:
-
AR + 旅游:導(dǎo)航、門店提示、廣告、優(yōu)惠活動(dòng)提示等等 -
購物:AR 試鞋、試衣、試妝 -
游戲:
WebXR
WebXR 是標(biāo)準(zhǔn)也是概念,指的基于 Web 實(shí)現(xiàn)虛擬現(xiàn)實(shí)和增強(qiáng)現(xiàn)實(shí)的能力。
其實(shí)就是在 Web 上開發(fā) AR(Augmented Reality)和 VR(Virtual Reality)應(yīng)用的 API, “X”代表沉浸式體驗(yàn)中的任何事物。
API
-
API 演進(jìn):主要是 google 在推進(jìn),從 2016 年開始提出的 WebVR 標(biāo)準(zhǔn),到由于缺了增強(qiáng)現(xiàn)實(shí)這一塊,2018 年改為 WebXR -
WebXR Depth API:獲取用戶的設(shè)備與現(xiàn)實(shí)環(huán)境中物體的距離 -
WebXR AR Lighting Estimation:獲取環(huán)境的光線情況 -
相關(guān) API 示例:https://immersive-web.github.io/webxr-samples/ -
最新動(dòng)態(tài):2021 年 4月13日 Chrome 的 90 版本增加新 WebXR API: -
示例代碼:
async function activateXR() {
// 創(chuàng)建 WebGL 上下文
const canvas = document.createElement("canvas");
document.body.appendChild(canvas);
const gl = canvas.getContext("webgl", { xrCompatible: true });
// 初始化three.js
const scene = new THREE.Scene();
// 創(chuàng)建一個(gè)有不同顏色面的立方體
const materials = [
new THREE.MeshBasicMaterial({ color: 0xff0000 }),
new THREE.MeshBasicMaterial({ color: 0x0000ff }),
new THREE.MeshBasicMaterial({ color: 0x00ff00 }),
new THREE.MeshBasicMaterial({ color: 0xff00ff }),
new THREE.MeshBasicMaterial({ color: 0x00ffff }),
new THREE.MeshBasicMaterial({ color: 0xffff00 })
];
// 將立方體添加到場(chǎng)景中
const cube = new THREE.Mesh(new THREE.BoxBufferGeometry(0.2, 0.2, 0.2), materials);
cube.position.set(1, 1, 1);
scene.add(cube);
// 使用three.js設(shè)置渲染:創(chuàng)建渲染器、掛載相機(jī)
const renderer = new THREE.WebGLRenderer({
alpha: true,
preserveDrawingBuffer: true,
canvas: canvas,
context: gl
});
renderer.autoClear = false;
// API 直接更新相機(jī)矩陣
// 禁用矩陣自動(dòng)更新
const camera = new THREE.PerspectiveCamera();
camera.matrixAutoUpdate = false;
// 使用“immersive-ar”初始化 WebXR 會(huì)話
const session = await navigator.xr.requestSession("immersive-ar");
session.updateRenderState({
baseLayer: new XRWebGLLayer(session, gl)
});
const referenceSpace = await session.requestReferenceSpace('local');
// 創(chuàng)建一個(gè)渲染循環(huán),允許我們?cè)?nbsp;AR 視圖上繪圖
const onXRFrame = (time, frame) => {
session.requestAnimationFrame(onXRFrame);
// 將圖形幀緩沖區(qū)綁定到 baseLayer 的幀緩沖區(qū)
gl.bindFramebuffer(gl.FRAMEBUFFER, session.renderState.baseLayer.framebuffer)
// 檢索設(shè)備的姿態(tài)
// XRFrame.getViewerPose 可以在會(huì)話嘗試建立跟蹤時(shí)返回 null
const pose = frame.getViewerPose(referenceSpace);
if (pose) {
// 在移動(dòng)端 AR 中,只有一個(gè)視圖
const view = pose.views[0];
const viewport = session.renderState.baseLayer.getViewport(view);
renderer.setSize(viewport.width, viewport.height)
// 使用視圖的變換矩陣和投影矩陣來配置 THREE.camera
camera.matrix.fromArray(view.transform.matrix)
camera.projectionMatrix.fromArray(view.projectionMatrix);
camera.updateMatrixWorld(true);
// 使用 THREE.WebGLRenderer 渲染場(chǎng)景
renderer.render(scene, camera)
}
}
session.requestAnimationFrame(onXRFrame);
}

-
兼容性:作為 W3C 的前沿標(biāo)準(zhǔn),目前主要是 Chrome 在推進(jìn)。市面上瀏覽器對(duì) WebXR 的支持整體較弱,后面會(huì)介紹相關(guān)的兼容庫和現(xiàn)成的解決方案。
模型觀察者:model-viewer
-
谷歌實(shí)現(xiàn)的一個(gè) web component,可用于查看 Web 上的 3D 模型并與之交互
<script type="module" src="https://unpkg.com/@google/model-viewer/dist/model-viewer.min.js"></script>
<model-viewer src="https://modelviewer.dev/shared-assets/models/Astronaut.glb"
ios-src="https://modelviewer.dev/shared-assets/models/Astronaut.usdz"
alt="A 3D model of an astronaut"
ar
auto-rotate
camera-controls></model-viewer>
-
實(shí)際效果:
Unity
作為知名的 3d 游戲引擎,也有相應(yīng)的 WebWR 支持庫
-
unity-webxr-export:https://github.com/De-Panther/unity-webxr-export
社區(qū)生態(tài)
-
XR Swim:為開發(fā)者提供了一個(gè)發(fā)布 WebXR 內(nèi)容的統(tǒng)一平臺(tái),相當(dāng)于網(wǎng)頁端 AR/VR 應(yīng)用領(lǐng)域的 Steam 平臺(tái)。
挑戰(zhàn)
-
如何保持低延遲、高精度的場(chǎng)景,以及快速處理數(shù)據(jù)進(jìn)行渲染和展示動(dòng)畫的能力。 -
傳統(tǒng)的通信方法速度不夠快。查看場(chǎng)景產(chǎn)生的大量數(shù)據(jù)可能超出渲染限制。
WebAR
優(yōu)缺點(diǎn)
和 WebXR 有相似的優(yōu)缺點(diǎn)。
-
優(yōu)點(diǎn):跨平臺(tái)、傳播方便( URL 的格式傳播) -
缺點(diǎn): -
各瀏覽器標(biāo)準(zhǔn)不統(tǒng)一 -
3D 內(nèi)容加載慢,無法實(shí)現(xiàn)復(fù)雜的內(nèi)容 -
渲染質(zhì)量低 -
無法實(shí)現(xiàn)復(fù)雜交互(受限于瀏覽器傳統(tǒng)交互方式)
WebAr 框架及關(guān)鍵原理
-
實(shí)現(xiàn) AR 需要:識(shí)別、追蹤和渲染 -
AR SDK:谷歌 AR 團(tuán)隊(duì)(Google AR)提供 WebARonARKit, WebARonARCore。均具備運(yùn)動(dòng)追蹤、環(huán)境感知和光線感應(yīng)等功能。 -
蘋果:WebARonARKit(源自移動(dòng)端 ARKit) -
安卓:WebARonARCore(源自移動(dòng)端 ARCore) -
主流AR 框架:目前維護(hù)和使用比較多的是 AR.js,另外還有一些其他的: -
three.ar.js:https://github.com/google-ar/three.ar.js -
ARToolKit:http://www.hitl.washington.edu/artoolkit/ -
JSARToolKit:https://github.com/kig/JSARToolKit -
argon.js:https://www.argonjs.io/ -
awe.js:https://awe.media/#main -
tracking.js:https://github.com/eduardolundgren/tracking.js -
AR.js:具備上述提到的從信息獲取到處理、渲染繪制的能力。 -
WebRTC:獲取視頻流(最關(guān)鍵的 API 方法是 getUserMedia() ,實(shí)時(shí)獲取攝像頭的視頻流) -
JSARToolKit:主要提供了識(shí)別和追蹤 marker 的功能。(1999 年發(fā)布,一直更新至今) -
Three.js、Babylon.js、A-Frame(這幾個(gè)都是基于 WebGL 的渲染庫) -
主要是封裝了: -
用十行 HTML 就實(shí)現(xiàn) AR:
<script src="https://aframe.io/releases/0.8.0/aframe.min.js"></script>
<script src="https://cdn.rawgit.com/jeromeetienne/AR.js/1.6.0/aframe/build/aframe-ar.js"></script>
<body style='margin : 0px; overflow: hidden;'>
<a-scene embedded arjs='sourceType: webcam;'>
<a-box position='0 0.5 0' material='opacity: 0.5;'></a-box>
<a-marker-camera preset='hiro'></a-marker-camera>
</a-scene>
</body>
-
效果如下:codepen 地址、識(shí)別圖片地址
-
還有一些獨(dú)立功能的框架:
-
A-Frame:基于 Three.js 的開源框架,可以在 HTML 中直接配置場(chǎng)景,適用于簡(jiǎn)單的 3D 場(chǎng)景搭建 -
方式一:在前端直接處理視頻流。在前端直接進(jìn)行圖像處理,可以用 Tracking.js 和 JSFeat。這兩個(gè)庫類似,都是在前端做計(jì)算機(jī)視覺的,包括提取特征點(diǎn)、人臉識(shí)別等。 -
方式二:前端傳輸視頻流給后端,后端處理完畢返回結(jié)果到前端,目前有一些云識(shí)別服務(wù)就是如此。 -
識(shí)別與追蹤:Tracking.js、JSFeat、ConvNetJS、deeplearn.js、keras.js 。獲取到視頻流之后的工作就是識(shí)別和追蹤。不管是對(duì)于 native AR 還是 WebAR,目前的識(shí)別算法與框架已經(jīng)非常成熟,難就難在識(shí)別之后如何跟蹤,如何更好更穩(wěn)定更高質(zhì)量的跟蹤。 -
渲染與交互:A-Frame、Three.js、Babylon.js、Pixi.js、WebGL -
框架庫實(shí)現(xiàn)原理:上面提到的 AR 框架實(shí)現(xiàn)原理大都如下圖所示:
性能方案
-
把純計(jì)算的代碼移到 WebGL 的 shader 或 Web Worker 里 -
適用于事先計(jì)算或?qū)崟r(shí)性要求不高的代碼,如布局算法 -
shader 可以用于加速只和渲染(重繪)有關(guān)的代碼,無關(guān)渲染的代碼放入 shader 中反而會(huì)造成重復(fù)計(jì)算 -
WebGL 調(diào)用 GPU 加速 -
Web Worker -
WebAssembly -
gpu.js -
將簡(jiǎn)單的 JavaScript 函數(shù)轉(zhuǎn)換為著色器語言并編譯它們,以便它們?cè)谀?GPU 上運(yùn)行。如果 GPU 不可用,函數(shù)仍將在常規(guī) JavaScript 中運(yùn)行。 -
用濾波算法(比如卡爾曼濾波)將卡頓降到更小,讓用戶從視覺感受上似乎更流暢
市場(chǎng)化解決方案
-
Kivicube:https://www.kivicube.com/ -
創(chuàng)建 AR、VR 與 3D 場(chǎng)景,并在通用的 Web 平臺(tái)上分享它們 -
AR Quick Look:https://www.kivicube.com/ar-quick-look -
示例:訪問地址、識(shí)別圖片地址 -
EasyAR:https://www.easyar.cn/ -
支持WebAR、小程序 AR、Sense 跟蹤能力,還提供云識(shí)別、姿態(tài)\手勢(shì)識(shí)別服務(wù) -
8th Wall:https://www.8thwall.com/ -
集創(chuàng)造、協(xié)作和發(fā)布增強(qiáng)現(xiàn)實(shí)項(xiàng)目于一體的平臺(tái),不需要第三方軟件,服務(wù)器設(shè)置或外部工具,只需登錄,編碼,然后點(diǎn)擊發(fā)布 -
創(chuàng)建了一個(gè)端到端云解決方案,用于創(chuàng)建、協(xié)作和即時(shí)發(fā)布基于瀏覽器的 WebAR 項(xiàng)目 -
示例:https://github.com/8thwall/web/tree/master/examples/threejs -
Apple AR Quick Look:https://www.kivicube.com/ar-quick-look -
給開發(fā)者提供了便捷的3D模型預(yù)覽和分享的工具 -
iPhone 和 iPad 的應(yīng)用程序或者網(wǎng)站中嵌入 Quick Look 視圖,以 3D 或 AR 形式顯示虛擬對(duì)象的 USDZ 文件
擴(kuò)展
-
企業(yè) AR:2021 年的 7 個(gè)實(shí)際用例:https://arvrjourney.com/enterprise-ar-7-real-world-use-cases-for-2021-81ea0319b8e5 -
主流領(lǐng)域:遠(yuǎn)程協(xié)助、醫(yī)療診斷、銷售、培訓(xùn)、物流、制造、原型設(shè)計(jì)
相關(guān)資料
-
Google AR: -
github:https://github.com/google-ar -
AR Core 站點(diǎn):https://developers.google.com/ar -
WebXR: -
google:https://developers.google.com/ar/develop/webxr -
w3c:https://www.w3.org/TR/webxr/ 2020.7.4 -
相關(guān) API 官方示例:https://immersive-web.github.io/webxr-samples/ -
MDN:https://developer.mozilla.org/zh-CN/docs/Web/API/WebXR_Device_API -
A Gentle Introduction To WebXR:https://arvrjourney.com/a-gentle-introduction-to-webxr-d5111304a870 -
WebAR與小程序AR極速入門教程:https://juejin.cn/post/6951588622566948901 -
萬字干貨介紹WebAR的實(shí)現(xiàn)與應(yīng)用:https://mp.weixin.qq.com/s?__biz=Mzg2ODUzMzEzMg==&mid=2247489647&idx=1&sn=6f28bf873da34dbcaeca59dacce5459c&source=41#wechat_redirect -
Web 前端中的增強(qiáng)現(xiàn)實(shí)(AR)開發(fā)技術(shù):https://segmentfault.com/a/1190000014891945 -
Augmented Reality in 10 Lines of HTML:https://medium.com/arjs/augmented-reality-in-10-lines-of-html-4e193ea9fdbf -
資源: -
Mixamo:https://www.mixamo.com/#/
