Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
軽率にWebARアプリでImmersalによるVPSを実装する / localization ...
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
にー兄さん
August 20, 2022
Technology
2.7k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
軽率にWebARアプリでImmersalによるVPSを実装する / localization using immersal in a webar application
VPS座談会でのLT資料です
にー兄さん
August 20, 2022
More Decks by にー兄さん
See All by にー兄さん
UnityでSystem.Net.WebSocketsなWebSocketサーバが動かないのでUnity Monoのコードを覗いてみた / about implementing websocket server with unity mono
drumath2237
1
610
ついにAuraも登場したのでJetpack XR SDKについて今一度語りたい / i wanna talk about xreal aura
drumath2237
0
48
『Ground Truth: How We Create Geometrically Accurate Reconstructions (Niantic Spatial Blog)』 を読む / read Ground Truth: How We Create Geometrically Accurate Reconstructions
drumath2237
0
86
この時代にOSS開発に向き合ってみる / face the oss development in this era
drumath2237
0
69
プログラマの職能が代替可能になりつつあるこの時代でプログラムと向き合う修行を積む / dedicating myself to the discipline of programming
drumath2237
0
140
個人的3D Gaussian Splattingニュースをご紹介 / sharing 3d gaussian splatting news
drumath2237
0
680
Jetpack XR SDKから紐解くAndroid XR開発と技術選定のヒント / about-androidxr-and-jetpack-xr-sdk
drumath2237
1
930
XRエンジニアの視点から XRのイマと社会実装の実現について考える / thinking-about-xr-popularization
drumath2237
0
100
軽率にプログラミング言語のシンタックスについて考えてみよう / lets-think-about-programming-lang-syntax
drumath2237
0
150
Other Decks in Technology
See All in Technology
OptunaHub: ブラックボックス最適化のためのプラットフォーム
pfn
PRO
0
140
継続的なAIコスト最適化
bgpat
1
340
二歩目のフロントエンド・ウェブアクセシビリティ
camiha
2
590
NDIでApple Vision Proにリアルタイム映像送信
jyouryuusui
0
120
Persisting Massive Data with Rails ~Designing for 60 billion rows, and fighting the bottlenecks~ Railsで挑む大量データ永続化 〜600億件を永続化するための設計とボトルネックとの戦い〜
occhi
0
730
Optunaの最新リリースv5.0について
pfn
PRO
0
120
Conditional PED-ANOVA: Hyperparameter Importance in Hierarchical & Dynamic Search Spaces
pfn
PRO
0
130
Rust で関数型ドメインモデリング
takonda
0
140
TinyGoでオブザーバビリティ?OpenTelemetryはTinyGoで使えるのか / Is OpenTelemetry available in TinyGo environment?
ymotongpoo
2
140
go-sqletch
moznion
0
140
Post AI時代のリファクタリング実践記 / Refactoring in the post AI era
kaminashi
1
230
会社説明資料
persolserverworks
0
9.8k
Featured
See All Featured
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.7k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6.1k
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
69
67k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
33
5.2k
エンジニアに許された特別な時間の終わり
watany
109
250k
Amusing Abliteration
ianozsvald
1
350
Skip the Path - Find Your Career Trail
mkilby
1
260
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
2
410
Being A Developer After 40
akosma
92
590k
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
360
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
Transcript
軽率にWebARアプリでImmersal によるVPSを実装する にー兄さん(@ninisan_drumath) VPS開発座談会
発表資料は公開します 内容はすべてSNS共有OK!
にー兄さん(@ninisan_drumath) - 筑波大学 情報科学類 - HoloLab inc.アルバイト - Microsoft学生アンバサダー -
Iwaken Lab. Unity・WebAR・VPSが興味領域 Project TSUin-MI: 「つくば市をARネイティブな街にする」が目標 愛猫→
アジェンダ 1. 開発したもの 2. 実現プロセス 3. おわりに
開発したもの
WebAR×Immersalの試行 WebブラウザからWebARアプリを起動して Immersalによる位置合わせを実行 サーバーサイド位置合わせによって実現 WebARはBabylon.jsというライブラリで実装 GitHubで公開してます https://github.com/drumath2237/immersal-babylon-webxr
経緯やモチベーション (2021年HoloLens Edge上での動作を確認) 2021年10月頃に調査を開始 色々進展があったが最後まで実装しきれず中断 2022/7/1にImmersalのdiscordでひっそりアナウンス The WebAR mode has
now been fixed on the Dev Portal. Works on Android Chrome, and you should have the chrome://flags/#webxr-incubations set to 'enabled'. Sample code: view page source for view.html 再チャレンジするか......→できた
開発環境 - Immersal REST API(v1.16.1) - Babylon.js 5.x - Vite
- TypeScript - Chrome for Android (Google Pixel 4a 5G)
位置合わせをする手順 1. カメラ画像などの情報を取得 2. REST APIの仕様に沿ってデータ変換 3. REST APIへのリクエスト 4.
レスポンスに沿って座標変換
情報を取得する
位置合わせに必要な情報 Immersal REST API(後述) のLocalize Imageで必要な情報 • カメラ画像 • カメラ内部パラメータ
• Immersal開発者トークン • マップID配列 https://immersal.gitbook.io/sdk/api-documentation/rest-api#localize-image-1
位置合わせに必要な情報 Immersal REST API(後述) のLocalize Imageで必要な情報 • カメラ画像 • カメラ内部パラメータ
• Immersal開発者トークン • マップID配列 ブラウザ上で取得するのが難しかった (セキュリティ上の問題)
Raw Camera Access WebXR Device APIに含まれる機能の一つ カメラ画像の取得が可能 現在実験的機能なので、 ARCoreが対応したデバイスの Chrome
for Androidでしか動作しない 加えてWebXR Incubationが有効である必要が ある 詳しくはZennにまとめました https://zenn.dev/drumath2237/articles/52d62638c7d06f
画像データと内部パラメータの取得 カメラ画像の取得は そのままAPIが利用できる WebGLTextureとして取得できる 内部パラメータは右のような計算式で 取得 let viewerPose = xrFrame.getViewerPose(xrRefSpace);
for (const view of viewerPose.views) { if (view.camera) { const cameraTexture = binding.getCameraImage(view.camera); } } function getCameraIntrinsics(projectionMatrix, viewport) { const p = projectionMatrix; let u0 = (1 - p[8]) * viewport.width / 2 + viewport.x; let v0 = (1 - p[9]) * viewport.height / 2 + viewport.y; let ax = viewport.width / 2 * p[0]; let ay = viewport.height / 2 * p[5]; let gamma = viewport.width / 2 * p[4]; }
画像データの変換
現状整理 Raw Camera Accessで 取得できる画像はWebGLTexture REST APIへのリクエストには Base64エンコードされたPNG画像が欲しい
逆算して考える Base64エンコードされたPNG画像にはPNG画像が必要 PNG画像を生成するにはピクセル情報が必要 ピクセル情報を取得るするにはWebGLでなんとかしなきゃ(雑
Immersal本家の実装 1. three.jsのエンジンからWebGLコンテキストを取得 2. WebGLコンテキストにWebGLTextureとFrameBufferをバインド 3. FrameBufferにテクスチャを紐づける 4. この状態でreadPixels 5.
RGBA値が格納されたUint8Arrayを取得 6. WebWorker上でpngエンコード(UPNGというライブラリを使用)
自分の実装 WebGL APIにぎょっとしたので別の方法で試す 1. Babylon.jsのRawTextureを生成 2. RawTextureのフィールドに(強引に)WebGLTextureを代入 3. RawTexture.readPixelでUint8ClampedArrayを生成 4.
ImageDataへ変換 5. canvasへ描画してPNG・Base64エンコード 本家のほうがスマートかも
REST APIへのリクエスト
API仕様に基づいてリクエストするだけ ドキュメントを見ながら必要情報を揃える エンドポイントへPOST https://api.immersal.com/localizeb64
レスポンス - マップID - 位置 - 回転行列 が返ってくる リクエストが不適切な場合はerrorだけ 適切なリクエストだけど位置合わせに失敗したら
successがfalse ゼロベクトルと単位行列が返ってくる
無事リクエストが通った
座標変換
2種類の座標変換 - Immersal座標系 to Babylon.jsの座標系 - マップ座標系 to ワールド座標系
ImmersalとBabylon.js Immersal Babylon.js https://immersal.gitbook.io/sdk/tutorials/how-to-map/custom-im ages#rotation v1.14→v1.15の間で破壊的変更
マップ座標 to ワールド座標 Immersal マップ座標系の カメラの姿勢 カメラ座標系の マップの姿勢 ワールド座標系の マップの姿勢
レスポンスから変換行列を作成 逆変換を計算 リクエスト時のカメラの姿勢を適用 Map Physical World
座標系変換の手動テストツール
座標系変換の手動テストツール スマホを使わずにテストできるツール レスポンスデータをとっておく 姿勢行列の変換処理を実装して その挙動をビジュアルで確認 Babylon.jsのDebugLayerで 実際の数値も確認 トライアンドエラーの敷居を 下げる工夫
位置合わせができた
おわりに
展望・まとめ - WebARでImmersal位置合わせができた - もっといろいろ実験したい - WebARでPlaybackできる機能 - 他のVPSでの検証(PretiaとかGeospatial APIとか)
- 一般的な環境でも動作してほしい - WebXR Device API以外のWebAR VPSに劣る点
参考文献 Raw Camera Accessのexplaner https://github.com/immersive-web/raw-camera-access/blob/main/explainer.md Raw Camera Accessについての記事 https://zenn.dev/drumath2237/articles/52d62638c7d06f Immersal座標系に関するドキュメント
https://immersal.gitbook.io/sdk/tutorials/how-to-map/custom-images デモプロジェクト https://github.com/drumath2237/immersal-babylon-webxr