Web3D 從入門到跑路 · 3D 初體驗

本文整理自老馮於 凹凸 2022 年技術分享,帶領大家從案例、應用、技術生態出發,讓大家瞭解一下 3D 在 Web 端的現狀。

3D初體驗

Hey 3D what's up,最近在 Web 圈混得怎樣

在“元宇宙”概念越來越火熱的背景下,我們準備了一系列的 3D 元宇宙公開課及教學文章,教大家如何從 0 到 1 快速搭建一個 3D 項目,從中可以學習到 WebGL 底層原理、圖形學、熱門引擎的使用方法等。在入門前,我們先從案例、應用、技術生態出發,讓大家瞭解一下 3D 在 Web 端的現狀。


一、案例展示

1.1 組成部分

先從一個基礎的 DEMO 出發,一個基礎的 3D 一般會有以下模塊組成:

(1)渲染

打開一個 3D 頁面,首先會下載模型文件,然後渲染到頁面中

(2)動畫

逐幀渲染動畫

(3)事件綁定

通過 js 的事件綁定,觸發對應的渲染。比如點擊地面人物移動

(4)場景切換

衆所周知,遊戲裏有很多場景,比如遊戲加載、遊戲開始、遊戲結束,就是三個不同的場景。如圖就是從主玩法到編輯場景


1.2 完整案例

(1)PC 端

下面來看一些有趣的例子,先從PC端開始這是一名開發者博客,他從開始場景切換成主場景,然後渲染一些樹、車 3D 模型,用鍵盤控制模型的方向,碰撞後將模型旋轉,並同時播放對應的音頻等。點擊體驗一下 👉 https://bruno-simon.com/[1]

這是 playcanvas 官網上的寶馬 demo,它渲染了動畫,點擊下面的圖片,可以更換這個模型的紋理。點擊體驗一下 👉 https://playcanv.as/p/RqJJ9oU9[2]

(2)H5端

再看看移動端的案例上面的賽車遊戲,也是從開始場景切到主玩法,之後通過下方的 touch bar 對車/地圖的進行位移和其他物體碰撞後,檢測觸發加速等事件。掃碼或點擊體驗一下👉 Mercedes-EQ Formula E Team - Speedboard Game[3]

然後是大家熟知的例子,神廟逃亡,也可以看到很明顯的場景切換、碰撞檢測等。掃碼或點擊體驗一下👉 Play Temple Run 2 on Poki[4]


二、應用場景

再來看看 3D 在國內一些正式的應用場景。

2.1 App 端

比如 VR 看房,VR 線上看房可以沒有導購員的干擾,節省帶看成本,用戶操作上也爲該房產留下了大量的數據留存;

還有如果在一些購物 App 上看鞋,它會有鞋 3D 模型預覽,以及 AR 試穿,可以看清鞋子的細節以及個人試穿後的樣子。

2.2 H5 端

一些互動小遊戲中,也有 3D 的部分

微信小遊戲中,也有 3D 的小遊戲


三、技術生態

3.1 遊戲引擎的定義

首先,想要“快速”實現一個 3D 遊戲,需要 3D 的遊戲引擎,那麼到底什麼是遊戲引擎呢?

(1)已編寫好的可編輯電腦遊戲系統(2)交互式實時圖像應用程序的核心組件(3)能容易和快速地做出遊戲程式


3.2 遊戲引擎的組成

大多數遊戲引擎包含以下系統:(1)渲染引擎即“渲染器”,繪製圖像,並向外部表達圖像的系統,含二維圖像引擎和三維圖像引擎

(2)物理引擎通過爲剛性物體賦予真實的物理屬性的方式來計算運動、旋轉和碰撞反映

(3)腳本引擎提供腳本接口,讓開發者通過腳本設計遊戲,使遊戲的開發更加靈活

(4)網絡引擎數據交換的模塊,在開發多人在線遊戲時使用

(5)人工智能代替遊戲開發中部分勞動密集型內容的生成,如道路檢測


3.3 如何選擇合適的遊戲引擎

如何選擇適合遊戲引擎,我們一般從以下三個方面考慮:

(1)入門

  • 開發語言
  • 學習資源與技術支持能力
  • 工作流支持力度

如果是剛入門的先要考慮是否是自己熟悉的開發語言,考察該引擎的官方的資源文檔、團隊的問題修復能力、社區活躍度,以及引擎的工作流支持力度,如是否有 playground 等。

(2)參考

  • 商業化成熟案例
  • 應用廣度

從參考實例上考慮,該引擎是否有現實的有名的項目正在使用,使用的廣度;

(3)設計

  • 設計理念
  • 性能

從設計上面考慮,引擎的設計理念是否容易理解、方便第三方介入接入。以及需要結合項目的規模及功能要求,需要選擇符合要求的性能優化、內存管理、資源管理的引擎。


3.4 技術棧

選取了 Github 上 star 數最多的遊戲引擎,選幾個來分析一下其優點及不足:

(1)Three.js

Three.js 是最流行的 JavaScript 庫之一,用於使用 WebGL 在 Web 瀏覽器中創建和動畫化 3D 計算機圖形。

A. 優點:

  • 易於學習:非常容易上手,同樣適合新手
  • 大型社區:示例多,用戶多,社區豐富
  • 好的文檔:強大的文檔通常是一個強大的庫的一個很好的指標,而 Three.js 具有出色的文檔
  • 性能優勢:出色的性能,能很好地執行復雜的渲染功能
  • PBR 渲染:具有內置的 PBR 渲染,這使得渲染圖形更加準確

B. 不足:

  • 不算是遊戲引擎:渲染以外的功能很少
  • 面向新手:由於 API 面向新手,因此隱藏了許多高級功能

(2)Babylon.js

Babylon.js 是一個強大的、簡單的、開放的遊戲和渲染引擎。

A. 優點:

  • 出色的測試工具:Playground 是在進行全面開發之前對事物進行測試的出色工具,並且具有出色的啓動文檔
  • 強大的社區支持:社區活躍和豐富
  • 更新迭代頻繁:該框架擁有頻繁更新的代碼庫,並且第三方工具正在積極開發中
  • PBR渲染:對PBR渲染的支持非常出色
  • 大牌支持:Babylon 得到 Adobe,Microsoft 等大型品牌的使用和支持
  • 問題修復:BUG 修復很快,問題很快能得到解決

B. 不足:

  • 成熟度:2013 年的第一個版本,與許多競爭對手相比,它還算年輕;
  • 文檔:API 文檔部分參數字段描述不夠清晰;
  • 規模:不適合較小的項目

(3)Aframe

  • 使用簡單,聲明性 HTML:A-Frame 只需插入 <a-scene>
  • 實體組件體系結構:A-Frame 是 Three.js 之上的強大框架,爲 Three.js 提供了聲明性,可組合且可重用的實體組件結構
  • 性能:一個框架是在 Three.js 之上的一個瘦框架
  • 跨平臺,有視覺檢查器,功能豐富
  • 設計理念:由於設計理念與其他引擎不同,接入第三方物理引擎的時候,不太方便做適配

(4)Playcanvas

側重於遊戲引擎而不是渲染引擎,是一款優秀的全功能遊戲引擎。但是私有項目收費,沒有碰撞偏移,缺少示例。

(5)Whs

  • 使用簡單,集成 Three.js 渲染引擎,rendering 渲染自動化,加速 3D 場景原型製作,based 基於組件的場景圖
  • 即使使用 Worker(多線程),也可以輕鬆集成任何高性能物理
  • 基於 ES2015+,pack Webpack 友好

(6)其他

A. Egret 白鷺、LayaAir 還有國內的一些引擎,當我們用中文搜索“遊戲引擎”,一般都會推薦白鷺、LayaAir 這兩個,它們的優點就是有專門的企業進行開發和維護,也可以花錢讓其做定製化需求,並且支持多端開發。白鷺的話比較偏向於 2D,3D 是近幾年開始在 2D 基礎上迭代的。而 Laya 比較多的人用來做微信小遊戲。不足的是,他們的社區不夠活躍,文檔更新不及時,對於開發者來說,開發體驗不是非常友好。

B. oasis 去年淘寶開源 oasis,用於支付寶的螞蟻莊園以及其他的一些互動遊戲。現在已經有 3500 個 star 了,從它的官方文檔上看,使用方式與 three 類似,API 比較簡單,也具有基礎的物理相關示例,還是比較實用小型、功能小的項目的。

7. 小程序

如果想要兼容微信小程序端,微信官方有Adapter的示例: Adapter | 微信開放文檔[5]

有以下開源倉庫,可供大家參考一下:

  • weapp-adapter 倉庫 [6]
  • three-platformize 倉庫 [7]
  • threejs-miniprogram 倉庫 [8]

參考資料

[1]

https://bruno-simon.com/: https://bruno-simon.com/

[2]

https://playcanv.as/p/RqJJ9oU9: https://playcanv.as/p/RqJJ9oU9

[3]

Mercedes-EQ Formula E Team - Speedboard Game: https://www.mercedes-benz.com/storage/formula-e/2021-eq-house-digital-showroom/speedboard/20211129-v2.html

[4]

Play Temple Run 2 on Poki: https://poki.com/en/g/temple-run-2#

[5]

Adapter | 微信開放文檔: https://developers.weixin.qq.com/minigame/dev/guide/best-practice/adapter.html

[6]

weapp-adapter 倉庫: https://github.com/finscn/weapp-adapter

[7]

three-platformize 倉庫: https://github.com/deepkolos/three-platformize

[8]

threejs-miniprogram 倉庫: https://github.com/wechat-miniprogram/threejs-miniprogram

[9]

遊戲引擎 - 維基百科: https://zh.wikipedia.org/wiki/%E6%B8%B8%E6%88%8F%E5%BC%95%E6%93%8E

[10]

XR地產:VR、AR看房場景: https://zhuanlan.zhihu.com/p/370788498

[11]

Choosing the right game engine: https://www.gdquest.com/tutorial/getting-started/learn-to/choosing-a-game-engine

[12]

如何選擇H5遊戲引擎: https://cloud.tencent.com/developer/article/1073996

[13]

JavaScript Game Engines: https://github.com/collections/javascript-game-engines

[14]

HTML5 Game Engines: https://html5gameengine.com/

[15]

H5遊戲開發:遊戲引擎入門推薦: https://aotu.io/notes/2017/12/27/h5-game-engine-recommend/index.html

[16]

Top 6 JavaScript and HTML5 game engines: https://blog.logrocket.com/top-6-javascript-and-html5-game-engines/

[17]

Top JS Gaming Engines and Libraries for 2020: https://blog.bitsrc.io/9-1.top-js-gaming-engines-and-libraries-for-2020-81707d9f095


本文分享自微信公衆號 - 凹凸實驗室(AOTULabs)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

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