Renderowanie tekstu w WebVR

W ramach szczegółów

Wyświetl stronę

Wewnątrz (https://with.in/) to platforma do marketingu narracyjnego: do rzeczywistości wirtualnej. Gdy zespół usłyszał o WebVR Rok 2015 od razu interesował nas jego potencjał. Dzisiaj to zainteresowanie pojawia się w unikalnej subdomenie naszej platformy internetowej, https://vr.with.in/. Każda osoba z przeglądarką z obsługą rzeczywistości wirtualnej może aby wejść na stronę, kliknąć przycisk i założyć zestaw słuchawkowy, aby poznać z serii filmów VR.

Dziś jest to m.in. Chrome w Daydream View. Dla: informacje o urządzeniu i wyświetlaczu zamontowanym na głowie, https://webvr.info/.

Podobnie jak w przypadku innych środowisk renderowania stron internetowych, polega głównie na trójwymiarowym odzwierciedleniu sceny. Ten może mieć aparat, perspektywę i dowolną liczbę obiektów. Aby ułatwić zarządzanie tę scenę, aparat i obiekty, których używamy, Three.js, który wykorzystuje element <canvas> do wywołania. i renderowanie na GPU komputera. Jest wiele przydatnych dodatków Three.js do udostępnić swoją scenę za pomocą WebVR. 2 główne – THREE.VREffect tworząc widoczny obszar dla każdego oka. THREE.VRControls do tłumaczenia perspektywy (np.do obrotu i położenia zamontowany na głowie), Istnieje wiele przykładów jak to wdrożyć. Zobacz Przykłady WebVR w środowisku Three.js , aby dowiedzieć się, jak zacząć.

Gdy zaczęliśmy korzystać z WebVR, natrafiliśmy na problem. Jeśli spojrzymy na w sieci reklamowej, tekst jest ich integralną częścią. Chociaż większość naszych treści są oparte na filmach, w witrynie znajduje się tekst, który otacza treść; interfejs oraz dodatkowe informacje na temat filmu lub powiązanych filmów są złożone z tekstu. Ponadto cały ten tekst jest tworzony w DOM. Nasze Eksploracje WebVR i strona https://vr.with.in/ są już dostępne <canvas>

Tekst używany w WebVR Tekst używany w WebVR
. Tekst używany w WebVR dla vr.with.in

Jakie mam opcje?

Na szczęście pracujemy nad tym. Nasze badania znaleźliśmy kilka skutecznych sposobów renderowania tekstu w trójwymiarowym w elemencie <canvas>. Poniżej znajduje się macierz kilku znalezionych przez nas połączeń, zawiera wady i zalety poszczególnych rozwiązań:

Niezależne od rozwiązania Cechy typograficzne Wyniki Łatwość implementacji
Tekst obszaru roboczego 2D Tak Tak Tak
Tekst wektorowy triangulowany Tak Tak
Wyciągnięty tekst 3D Tak
Podpisany tekst mapy bitowej pola odległości Tak Tak Tak

Nasza decyzja: czcionka mapy bitowej SDF

Obszar roboczy 2D w ctx.fillText() umożliwia zawijanie tekstu, korzystanie z odstępów między literami i liniami wysokość, ale przepełnienie zostanie obcięte i tekst będzie rozmyty po powiększeniu jak daleko. Możesz zwiększyć rozmiar tekstury płótna, ale możesz trafić jeśli tekstura jest zbyt duża, może to negatywnie wpłynąć na rozmiar lub wydajność tekstury.

Wyciągnięty tekst 3D jest zasadniczo taki sam jak tekst triangulowany wektorowy, ale i wierzchołki, aby geometria była co najmniej dwa razy większa. Jedna z tych wartości: w małych dawkach w tytułach czy logo, ale nie będą dobrze się sprawdza w dużych ilościach tekstu, a w obu przypadkach nie ma funkcji typograficznych.

Przepływ pracy jako czcionki do mapy bitowej SDF
Proces tworzenia czcionki jako mapy bitowej SDF

Czcionki bitmapowe korzystają z jednego czworokąta (2 trójkąty) na znak, więc używają mniej i ma lepsze wyniki niż wektory triangulacyjne. Są w dalszym ciągu oparte na rastrach, ponieważ używają sprite’a mapy tekstur, ale korzystają z plików SDF cienienie są w zasadzie niezależne od rozdzielczości, więc wyglądają lepiej niż dwuwymiarowe modele. tekstury odbitki na płótnie. Matt DesLauriers 3-bmfont-text zawiera też niezawodne funkcje typograficzne do zawijania tekstu, odstępy między literami, wysokość wierszy i wyrównanie. Przepełnienie nie zostaje ucięte. Czcionka jest ustalana za pomocą skali. Wybraliśmy tę trasę, ponieważ dała nam i zadbać o wydajność. Okazało się, że nie tak, jest łatwe do wdrożenia, więc omówię kroki, mając nadzieję, że uda nam się dla deweloperów pracujących w WebVR.

1. Wygeneruj czcionkę bitmapową (.png + .fnt)

Interfejs Hiero
Interfejs Hiero
Dane wyjściowe Hiero (plik Bitmap PNG i .fnt) Dane wyjściowe Hiero (plik Bitmap PNG i .fnt)
Dane wyjściowe Hiero (plik Bitmap PNG i .fnt)

Hiero to pakiet znaków bitmapowych. które działa w języku Java. Dokumentacja Hiero nie wyjaśnia dokładnie, go uruchomić bez przechodzenia skomplikowanego procesu kompilacji. Najpierw zainstaluj Javę, jeśli z którego już nie korzystasz. Jeśli dwukrotne kliknięcie pliku runnable-hiero.jar nie otwórz Hiero, spróbuj go uruchomić za pomocą tego polecenia w konsoli:

java -jar runnable-hiero.jar

Po uruchomieniu Hiero otwórz czcionkę w formacie .ttf lub .otf i wpisz dodatkowe które chcesz uwzględnić, zmień renderowanie na Java, aby włączyć efekty. zwiększ rozmiar, aby znaki zapełniły cały kwadrat pamięci podręcznej glifów, dodać efekt pola odległości, dostosować skalę pola odległości i rozsunąć obiekt. jest jak rozdzielczość. Im większa wartość, tym mniej rozmyte ale tym więcej czasu zajmie renderowanie podglądu przez Hiero. Następnie zapisz czcionka bitmapy. Generuje czcionkę bitmapową składającą się z obrazu .png i Plik z opisem czcionki AngelCode .fnt.

2. Konwertuj AngelCode na format JSON

Po wygenerowaniu czcionki bitmapy musimy wczytać ją aplikacja JavaScript z Mattem DesLauriersem load-bmfont npm package.

Moglibyśmy przeprowadzić przeglądarkę load-bmfont i użyć go w interfejsie, ale będę biec load-bmfont.js z Węzeł do przekonwertowania i zapisania pliku AngelCode .fnt Hiero Plik.json:

npm install
node load-bmfont.js
. Przykład wyjściowego kodu JSON
Przykład wyjściowego kodu JSON

Teraz możemy ominąć komponent load-bmfont i wysłać żądanie XHR (XMLHttpRequest) do .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 – czcionka z 3-tekstowym tekstem

Gdy wczytamy czcionkę, tekst Matta 3 czcionki w kolorze czcionki odpoczynek. Ponieważ nie używamy Node we własnej aplikacji, browserify three-bmfont-text.js w użyteczny plik three-bmfont-text-bundle.js

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

4. Program do cieniowania SDF

Ustaw suwaki afwidth i thshold na vr.with.in/archive/text-sdf-bitmap/ aby sprawdzić wpływ cieniowania pola ze znakiem odległości.

5. Wykorzystanie

Dla wygody przygotowałam Klasa kodu TextBitmap dla redagowanego tekstu (3-bmfont-text).

Text-sdf-bitmap w akcji
Text-sdf-bitmap w akcji
<script src="three-bmfont-text-bundle.js"></script>
<script src="sdf-shader.js"></script>
<script src="text-bitmap.js"></script>

Utwórz żądanie XHR dla pliku czcionek .json i utwórz obiekt tekstowy w pliku wywołanie zwrotne:

var bmtext = new TextBitmap({ options });

Aby zmienić tekst:

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

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

Plik .png czcionki bitmapy jest wczytywany za pomocą komponentu THREE.TextureLoader w pliku text-bitmap.js

TextBitmap zawiera też niewidoczne pole trafienia do interakcji z raycastem 3.js. za pomocą myszy, aparatu lub kontrolerów ruchu z ręcznym śledzeniem, takich jak Oculus Touch jak kontrolery Vive. Rozmiar pola działania jest aktualizowany automatycznie, gdy zmienisz tekst .

Do sceny 3.js dodano tekst bmtext.group. Jeśli chcesz uzyskać dostęp do kont podrzędnych / Object3D, wykres sceny dla tekstu wygląda tak:

Diagram systemu plików

6. Wyłącz minimalizację pliku json i zmodyfikuj xoffsety

W tekście GIF

Jeśli kerning wygląda nieprawidłowo, konieczna może być edycja xoffset w pliku JSON. Wklej za pomocą json w Jsbeautifier.org, aby uzyskać niezminimalizowaną wersję pliku.

xoffset to zasadniczo globalny kerning dla 1 znaku. Kerning jest dla dwojga znaków, które pojawiają się obok siebie. Domyślne wartości w kolumnach nie mają żadnego znaczenia, a byłoby zbyt pracochłonne Edit (Edytuj), więc możesz opróżnić tę tablicę i zmniejszyć rozmiar pliku JSON. Potem dla kerningu.

Najpierw musisz ustalić, które znaki pasują do poszczególnych identyfikatorów JSON. W pliku three-bmfont-text-bundle.js wstaw console.log po wierszu 240:

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

Następnie wpisz w polu tekstowym dat.gui https://vr.with.in/archive/text-sdf-bitmap/ i sprawdź w konsoli odpowiedni identyfikator znaku.

Na przykład w czcionki bitmapowej „j” jest stale za bardzo w prawo. To identyfikator znaku to 106. Znajdź więc "id": 106 w pliku json i zmień jego wartość xoffset z -1 do -10.

7. Układ

Jeśli masz kilka bloków tekstu i chcesz, żeby przesuwał się on od góry do dołu, w HTML, wszystko musi być pozycjonowane ręcznie, podobnie jak w przypadku pozycjonowania bezwzględnego każdego elementu DOM za pomocą CSS. Czy wyobrażasz sobie, że możesz to zrobić w CSS?

    * { position: absolute; }

Właśnie tak działa układ tekstu w 3D. W widoku szczegółowym: tytuł, autor, opisu i czasu trwania to nowy obiekt TextBitmap z własnym style, kolor, skala itp.:

Układ 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;

Zakładamy, że lokalne źródło każdej grupy TextBitmap jest pionowe wyrównane z górną krawędzią siatki TextBitmap (patrz wyśrodkowanie text-bitmap.js ). Jeśli później zmienisz tekst któregokolwiek z tych obiektów, a wysokość tych zmian obiektu, konieczne będzie również ponowne obliczenie tych pozycji. Tutaj zmodyfikowano tylko pozycję y tekstu, ale można też pracować W 3D możemy wypychać i pociągnąć tekst w kierunku Z, a także obracać go wokół osi x, y i z.

Podsumowanie

Zanim tekst i układ w WebVR są tak proste, powszechnie używanych jako HTML i CSS. Istnieją jednak aktywne rozwiązania i możesz zrobić o wiele więcej w WebVR niż na tradycyjnej stronie HTML. WebVR jest obecnie dostępny. Jutro prawdopodobnie istnieją lepsze narzędzia. Do tego czasu wypróbuj je i eksperymentu. Rozwój bez powszechnego stosowania sprawia, że To bardzo ekscytujące.