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
にー兄さん
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
440
ついにAuraも登場したのでJetpack XR SDKについて今一度語りたい / i wanna talk about xreal aura
drumath2237
0
44
『Ground Truth: How We Create Geometrically Accurate Reconstructions (Niantic Spatial Blog)』 を読む / read Ground Truth: How We Create Geometrically Accurate Reconstructions
drumath2237
0
80
この時代にOSS開発に向き合ってみる / face the oss development in this era
drumath2237
0
64
プログラマの職能が代替可能になりつつあるこの時代でプログラムと向き合う修行を積む / dedicating myself to the discipline of programming
drumath2237
0
110
個人的3D Gaussian Splattingニュースをご紹介 / sharing 3d gaussian splatting news
drumath2237
0
660
Jetpack XR SDKから紐解くAndroid XR開発と技術選定のヒント / about-androidxr-and-jetpack-xr-sdk
drumath2237
1
890
XRエンジニアの視点から XRのイマと社会実装の実現について考える / thinking-about-xr-popularization
drumath2237
0
98
軽率にプログラミング言語のシンタックスについて考えてみよう / lets-think-about-programming-lang-syntax
drumath2237
0
150
Other Decks in Technology
See All in Technology
spanner-autoscalerに学ぶ CRD設計パターン 〜自動化と緊急時対応を両立する Kubernetesコントローラーの作り方〜
tkuchiki
0
190
AIに会社の文脈を理解させる技術~上流工程・非エンジニアにも広げるハーネスエンジニアリング実践~
ochtum
0
140
LT:「このままでいいのかな?」から一歩踏み出した私のデータキャリア選択〜社会人3年目に上京を決意したリアル〜Snowflake女子会 vol.8
snowwmn0824
0
110
2026-09-08 そのJavaモダナイゼーション、AIに丸投げで大丈夫?IBM Bobで変わる品質と効率
yutanonaka
1
210
認知負荷を吸収し、プロダクトをまたぐPR Preview基盤の設計事例
taiki45
2
460
Account Factory for Terraformによる 標準化されたアカウント発行の自動化
pensuke628
0
110
HacobuにおけるFDEとは/登壇資料(戸井田 裕貴)
hacobu
PRO
1
130
AWS DevOps Agent スキルをつかいこなそう / Master AWS DevOps Agent Skills
kinunori
2
580
地方移住と都心キャリアの両立は「金・時間・人」のリソースをフル活用すれば実現できる!〜Snowflake女子会 vol.8
snowwmn0824
0
130
Antigravity SDK for the Java Developer
glaforge
0
220
AIエージェントの権限管理 3: Agentic RAG の Fine grained access control 編
ren8k
1
290
作って終わりじゃないサーバーレス 〜9年運用する大規模EC物流API基盤の設計・運用のリアル〜
zozotech
PRO
0
560
Featured
See All Featured
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
350
The untapped power of vector embeddings
frankvandijk
2
1.9k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.8k
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
510
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.7k
AI: The stuff that nobody shows you
jnunemaker
PRO
10
1.1k
Building an army of robots
kneath
307
46k
Build your cross-platform service in a week with App Engine
jlugia
234
19k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
Testing 201, or: Great Expectations
jmmastey
46
8.3k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.9k
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