在 WebVR 中轉譯文字

詳細內容

查看網站

其中 (https://with.in/) 是一個媒體報導平台 甚至還能透過現實生活中的影片當 Google Play 團隊得知 WebVR 的 2015 年我們立刻對這項技術的潛力感興趣,目前這個興趣 新增至我們 Web 平台的獨特子網域 https://vr.with.in/.只要使用者使用支援 VR 的瀏覽器,就可以 造訪網站後,點選按鈕並拋出頭戴式耳機,即可沉浸在我們的遊戲中 VR 影片系列。

這包括但不限於 Daydream View 上的 Chrome。適用對象 請參閱 https://webvr.info/.

如同其他虛擬實境專屬的顯示環境 主要採用 3D 畫面呈現場景。這個 每個場景都有相機、您的視角和任意數量的物件協助管理 這項場景、相機和物件,我們使用稱為 Three.js,會運用 <canvas> 元素擲回 複製到電腦的 GPU 上有許多實用的 Three.js 外掛程式 如何在 WebVR 中檢視場景。主要二是 THREE.VREffect 可為每種眼前建立可視區域 THREE.VRControls 以便翻譯視角 (例如旋轉視角 頭戴式螢幕) 可完美融入整個場景。在 Compute Engine 中 如何實作這項功能查看 Three.js WebVR 範例 瞭解如何踏出第一步

隨著我們深入研究 WebVR 時發現問題,如果我們要 所以網頁內容是網頁不可或缺的一環。絕大多數的觀眾 我們的內容是以影片為依據 網站內文字環繞。 使用者介面以及電影或相關影片的其他資訊 由文字建構而成此外,所有這段文字都是在 DOM 中建立。我們的 WebVR 探索和 https://vr.with.in/ 都位於 <canvas>

在 WebVR 中使用的文字 在 WebVR 中使用的文字
在 WebVR 中使用的文字,適用於 vr.with.in

有什麼選項?

幸好,我們正努力做到最好事實上,根據 Google 的研究結果 我們發現,以 3D 形式呈現文字的 安裝在 <canvas> 元素上下方是我們所發現的幾個矩陣 每個項目都標有優缺點:

解析度無關 字體排版功能 成效 導入難易度
2D 畫布文字
分類向量文字
延伸 3D 文字
已簽署的距離欄位點陣圖文字

我們的決定:SDF 點陣圖字型

搭配 ctx.fillText() 的 2D 畫布可以進行文字換行、字母間距和行 但溢位會遭到截斷,如果放大,文字就會模糊不清 。您可以增加畫布紋理的大小,但可能會達到上限 如果紋理太大,紋理大小或效能可能會受到影響。

延伸 3D 文字基本上與三角向量文字相同 可能是斜角,因此幾何圖形至少兩倍。以下任一項: 標題或標誌或許也能用在少量內容中,成效則不如 大量文字且沒有字體排版功能

SDF 點陣圖工作流程
結構化資料檔案點陣圖工作流程的字型

點陣圖字型會為每個字元使用一個四邊形 (兩個三角形),因此使用的字型也較少 而且成效優於 三角形向量。 由於他們使用紋理貼圖,但其中有結構化資料檔案,因此仍是光柵地圖 著色器基本上與解析度無關,因此看起來比 2D 美觀 畫布紋理。 Matt DesLauriers 3-bmfont-text 格式也包含可靠的字體排版功能,適合自動換行。 字母間距、行高和對齊方式。文字溢位功能無法截斷。字型 其大小取決於縮放設定我們選擇這條路線是因為它讓我們 以及提供最佳設計選項,同時維持高效能不幸的是 易於執行,因此我們會逐步說明 參與 WebVR 的開發人員

1. 產生點陣圖字型 (.png + .fnt)

Hiero 介面
Hiero 介面
Hiero 輸出 (點陣圖 PNG 和 .fnt 檔案) Hiero 輸出 (點陣圖 PNG 和 .fnt 檔案)
Hiero 輸出內容 (點陣圖 PNG 和 .fnt 檔案)

Hiero 是點陣圖字型封裝 我們可以透過 Java 執行Hiero 說明文件實際上並未說明 不必經過複雜的建構程序首先,請安裝 Java 接著,按兩下 runnable-hiero.jar 不會 請開啟 Hiero,在控制台中執行下列指令:

java -jar runnable-hiero.jar

Hiero 執行後,開啟 .ttf 或 .otf 桌面字型,然後輸入其他 輸入您想加入的字元、變更為 Java 以啟用效果 放大字元,讓字元填滿整個字符快取方格 加入距離欄位效果,調整距離欄位的比例並張開。 縮放值就像解析度畫面越大,模糊程度越低 但 Hiero 顯示預覽畫面所需的時間也較長。然後儲存 點陣圖字型它會產生點陣圖字型,由 .png 圖片和 AngelCode .fnt 字型說明檔案。

2. 將 AngelCode 轉換為 JSON

現在已經產生點陣圖字型,我們必須將其載入 這個 JavaScript 應用程式搭配 Matt DesLauriers load-bmfont npm 套件

我們可以將負載 -bm 調整成 ,並在前端使用該字型 即將執行 load-bmfont.js,其中包含 這個節點可用於轉換 Hiero 的 AngelCode .fnt 並儲存至 .json 檔案

npm install
node load-bmfont.js
敬上
輸出 JSON 範例
輸出 JSON 範例

現在可以略過 load-bmfont 並對其執行 XHR (XMLHttpRequest) 要求。 .json 字型檔案。

var r = new XMLHttpRequest();
r.open('GET', 'fonts/roboto/bitmap/roboto-bold.json');

r.onreadystatechange = function() {
    if (r.readyState === 4 && r.status === 200) {
    setup(JSON.parse(r.responseText));
    }
};

r.send();

function setup(font) {
    // pass font into TextBitmap object
}

3. Browserify 三字型文字

載入字型後,Matt 的 3-bmfont-text 就會處理 休息。我們並未在自家應用程式中使用 Node 瀏覽器 three-bmfont-text.js 轉換為可用的 three-bmfont-text-bundle.js

npm install -g browserify
browserify three-bmfont-text.js -o three-bmfont-text-bundle.js

4. SDF 著色器

將「afwidth」和「threshold」滑桿調整至開啟狀態 vr.with.in/archive/text-sdf-bitmap/ 來查看已簽署距離欄位著色器的影響。

5. 用量

為了方便起見,我建立了 TextBitmap 包裝函式類別 這是瀏覽器化的三 bmfont-text 版本

Text-sdf-bitmap 實際操作
Text-sdf-bitmap 實際使用
<script src="three-bmfont-text-bundle.js"></script>
<script src="sdf-shader.js"></script>
<script src="text-bitmap.js"></script>

建立 .json 字型檔案的 XHR 要求,然後在 回呼:

var bmtext = new TextBitmap({ options });

如何變更文字:

bmtext.text = 'The quick brown fox jumps over the lazy dog.';

scene.add( bmtext.group );
hitBoxes.push( bmtext.hitBox );

在 text-bitmap .js 中透過 THREE.TextureLoader 載入點陣圖字型的.png

TextBitmap 還包含可產生 3.js raycast 互動的隱藏框 透過滑鼠、相機,或 Oculus Touch 等手追蹤動作控制器 Vive 控制器當你變更文字時,Hboard 的大小自動更新 只要設定成「自動重新啟動」 和「在主機維護期間」選項即可

在 3.js 場景中加入 Bmtext.group。如需存取 / 物件 3D 之後,文字的場景圖看起來會像這樣:

檔案系統圖表

6. 統合 JSON 並修改 xoffset

在文字 GIF 中

如果您的核心看起來異常,就可能需要編輯 JSON 中的 xoffset。貼上 然後將 JSON 檔案上傳到 Jsbeautifier.org,才能取得 檔案。

Xoffset 本質上是全域通用的角色。小孩的兩個人 特定字元的排列組合預設值 核心陣列不會產生實質差異,而且會太繁瑣 編輯,這樣就能清空該陣列,縮減 JSON 的檔案大小。接著 編輯模型進行高度的 xoffset

首先,您必須知道哪些字元與哪個字元 ID 結合 json 檔案。在 three-bmfont-text-bundle.js 中, 在第 240 行後插入 console.log

    var id = text.charCodeAt(i)
    // console.log(id);

接著在「dat.gui」文字欄位中 https://vr.with.in/archive/text-sdf-bitmap/ ,然後查看控制台以找出該字元的對應 ID。

以點陣圖字型為例一直都太靠近右側結果 字元 ID 為 106。因此,請在 JSON 中找出 "id": 106,並將 xoffset 變更為 -1 -10。

7. 版面配置

如果您有多個文字區塊,並且希望文字由上到下排列 (例如 HTML,所有元素都必須手動定位,與絕對位置類似 自行導入所有 dom 元素您能想像在 CSS 中執行這項作業嗎?

    * { position: absolute; }

這就是 3D 的文字版面配置。在詳細資料檢視畫面中,標題、作者、 說明和時間長度指的是每個新的 TextBitmap 物件 樣式、顏色、縮放等:

3D 版面配置
author.group.position.y = title.group.position.y - title.height - padding;
description.group.position.y = author.group.position.y - author.height - padding;
duration.group.position.y = description.group.position.y - description.height - padding;

這裡的假設是每個 TextBitmap 群組的本機來源為垂直位置 對齊 TextBitmap 網格的頂端 (見見 text-bitmap.js 更新)。如果您在之後變更任何物件的文字和高度 您也必須重新計算這些物件的位置。在這裡 只修改文字的 y 位置,不過有個機會 我們 3D 模型可以按住 Z 向方向來提取文字 左右各軸的 X、Y 和 Z 軸

結論

WebVR 中的文字和版面配置有很長的用處,而且變得輕而易舉 在 HTML 和 CSS 中廣為使用但有了有用的解決方案,您可以達成更多目標 相較於傳統 HTML 網頁,使用 WebVR。WebVR 如今存在。 不過,明天也許會有更適合的工具。在此之前,不妨先試用一下 進行實驗。如果在開發時沒有無異的架構,開發出來的更具獨特性 而這是很有意思的事