Upgrade to Pro — share decks privately, control downloads, hide ads and more …

VR空間で写真を取ってS3に保存する

 VR空間で写真を取ってS3に保存する

https://cluster-vr-meetup.connpass.com/event/124095/ の内容です。

「スタンドアロンVR開発者の集い」というDiscord作りましたので良かったら参加してみて下さい!
https://discord.gg/yr9urM

875e833b59a556723045ebb69c6b14d2?s=128

Marihuana

April 04, 2019
Tweet

Transcript

  1. VR空間で写真を取って S3に保存する 焼きそばメロンパン

  2. 自己紹介

  3. 自己紹介 • 焼きそばメロンパンです • clusterでGo書いてました • VR系の会社立ち上げました

  4. 今日話すこと

  5. 今日話すこと • 目的 • 手順・構成 • APIサーバの実装 (ざっくり) • OculusGoの実装

    • 問題点 • さいごに
  6. 目的

  7. clusterみたいなカメラ機能作りたい!

  8. それを OculusGo で動かしたい!

  9. でも仕組みが分からない...

  10. 試行錯誤しながら実装してみた!

  11. 手順・構成

  12. 全体の流れ 1. 撮影用カメラを配置 2. カメラの内容をJPEGに変換 3. 画像をサーバに送信

  13. これで良さそう?

  14. 参考記事を見つけた!

  15. 画像バイナリ取得のアーキテクチャを整理

  16. 写真をサーバに送るまでの流れ 1. UIPictureController でトリガー長押しを検知 2. ImageBinaryFetcher から写真バイナリを取得 3. PictureController に写真バイナリを渡す

    4. RestGateway 経由でAPIサーバに写真を送信
  17. 画像URLをDBに入れたいとか 色々あってS3直ではなくAPI経由

  18. 実装してみよう!

  19. APIサーバの実装

  20. Unityの勉強会なのでざっくりと

  21. APIサーバの実装 • Go + gin + aws-sdk-go • POST /v1/pictures

    に multipart/form-data で画像受け取り • ファイル名は github.com/google/uuid + 拡張子 • ACL は public-read にしてどこからでも読めるように
  22. Advanced REST client で検証 (Chrome拡張)

  23. 完成!

  24. OculusGoの実装

  25. OculusGoの実装手順 1. 撮影用カメラUIの用意

  26. OculusGoの実装手順 1. 撮影用カメラUIの用意 2. 表示/非表示, 反転, 撮影といった操作を実装

  27. OculusGoの実装手順 1. 撮影用カメラUIの用意 2. 表示/非表示, 反転, 撮影といった操作を実装 3. カメラに映ってる画像をJPGにして取得

  28. OculusGoの実装手順 1. 撮影用カメラUIの用意 2. 表示/非表示, 反転, 撮影といった操作を実装 3. カメラに映ってる画像をJPGにして取得 4.

    取得した画像をサーバサイドに送信する
  29. 1. 撮影用UIの用意

  30. OculusGoは細かな操作が出来ない

  31. OculusGoは細かな操作が出来ない 腕の動きでカメラが動くようにしよう!

  32. 写真UIを雑に実装

  33. 2. 表示/非表示, 反転, 撮影といった操作を実装

  34. 表示/非表示 (UIPictureController) 1. UIPictureController を撮影UIにアタッチ 2. Enable/Disable メソッドを public で実装

    3. 外部のUI操作によって Enable/Disable を call
  35. 反転 (UIPictureController) 1. コントローラのトリガー押し上げ検知 2. カメラの rotation の y を

    180° 回転させる
  36. 撮影 (UIPictureController) 1. コントローラのトリガー長押し検知 2. 長押しされていたら画像バイナリ取得 3. 取得した画像バイナリをAPIサーバへ ( UniRx

    を使用) ※ 雑なコードになったのでリファクタします
  37. 3. カメラに映ってる画像をJPGにして取得

  38. 画像バイナリ取得のアーキテクチャを整理

  39. ImageBinaryFetcherのコード

  40. new ImageBinaryFetcher.Fetch(camera) で画像バイナリが取得可能!

  41. 4. 取得した画像をサーバサイドに送信する

  42. 取得した画像をサーバサイドに送信する • MultipartFormFileSection に画像バイナリを追加 • UnityWebRequest を使用 • 成功, 失敗時のレスポンスが欲しいので

    UniRx を使用 • Observable.FromCoroutine
  43. Unity公式マニュアルを参考にした

  44. 完成!

  45. 準備できたので早速撮影してみると...

  46. S3にアップロード出来てた!

  47. 撮影出来た!

  48. 問題点

  49. 問題点 • Texture2D の ReadPixel めっちゃ重い

  50. 問題点 • Texture2D の ReadPixel めっちゃ重い • AsyncGPUReadback で高速化出来そうだが...

  51. 問題点 • Texture2D の ReadPixel めっちゃ重い • AsyncGPUReadback で高速化出来そうだが... •

    Android で AsyncGPUReadback を動かすには GraphicAPI を Vulkan にする必要があるが OculusGo では非対応
  52. 問題点 • Texture2D の ReadPixel めっちゃ重い • AsyncGPUReadback で高速化出来そうだが... •

    Android で AsyncGPUReadback を動かすには GraphicAPI を Vulkan にする必要があるが OculusGo では非対応 • C++ ネイティブプラグインで高速化可能っぽい?
  53. 60FPSを下回ってしまう... (Profiler)

  54. 撮影するたびに OVRFade で暗転する?

  55. 出来ればあんまり暗転させたくない...

  56. 誰か解決方法教えて下さい

  57. さいごに

  58. ざっくりまとめ • multipart/form-data で画像を受け取れるAPIを作る • API から S3 に画像を送信 •

    Unity 側は撮影用カメラから画像バイナリを取得 • API サーバに UnityWebRequest で画像送信
  59. 宣伝させて下さい!

  60. スタンドアロンVR開発者の為のDiscord作った!!

  61. スタンドアロンVR開発者の為のDiscord作った!!

  62. 固定ツイートに参加リンクありますので是非!

  63. Thank you for listening!