Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
PhotonでOculusAvatarを動かす方法
Search
Keizo Nagamine
July 17, 2019
Technology
570
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
PhotonでOculusAvatarを動かす方法
Keizo Nagamine
July 17, 2019
More Decks by Keizo Nagamine
See All by Keizo Nagamine
福岡XR部でのHubs活用事例報告っ!
kzonag
0
210
ついに届いたNreal! -サンプルランチャーを作ってみた-
kzonag
0
280
福岡XR部の紹介と最近のオンライン活動
kzonag
0
2.4k
ZoomとHubsの繋げ方
kzonag
0
710
VTuberになるために必要な要素技術
kzonag
0
140
リアルと重ねるVR
kzonag
0
2.7k
UnityでOculuQuest入門
kzonag
0
1.2k
XRのおさらいと最近ホットな話題
kzonag
0
130
UnityマンがA-Frameさわってみて感じた共通点とか
kzonag
0
740
Other Decks in Technology
See All in Technology
内製AIチャットボット開発で学んだ Datadog Agent Observability活用術
mkdev10
0
140
AIエージェントのためのデータ設計
daiz21
0
220
みてねにおけるAI-DLC導入活動とAIドリブン開発の現在地/JAWS-UG AI-DLC #2
isaoshimizu
2
120
RapidCopy2 Matrix I/Oエンジンによるファイルコピーソフトウェアの設計と実装
kengosawa2
1
410
カーネルまで探検して理解するふたつの自動計装
sumiyae
0
310
AIに持続⼒を与える 判断の⻑期記憶設計
eiei114
1
710
AWS Blocks が楽しい #ゆるWeb札幌
tacck
PRO
0
150
Microsoft MVP プログラムを紹介するから目指す人増えてくれ
tsubakimoto_s
0
110
AI for Science時代を切り開く、政府の次世代HPC戦略の展望
gpuunite_official
0
250
All About Sansan – for New Global Engineers
sansan33
PRO
1
1.5k
国家プロジェクトを支える「さくらONE」 大規模LLM開発におけるGPU障害を乗り越えるクラスター運用戦略
gpuunite_official
0
280
わたしが知り合いゼロの勉強会に 行けるようになるまで
r5ni4
2
790
Featured
See All Featured
Become a Pro
speakerdeck
PRO
31
6.2k
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
630
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
64
56k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
11k
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.4k
brightonSEO & MeasureFest 2025 - Christian Goodrich - Winning strategies for Black Friday CRO & PPC
cargoodrich
3
790
30 Presentation Tips
portentint
PRO
1
380
Java REST API Framework Comparison - PWX 2021
mraible
34
9.7k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
49
10k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.3k
Transcript
Photonで OculusAvatarを 動かす方法 @KzoNag XRミーティング 福岡 2019年7月17日 #XRMTG #福岡XR部
自己紹介 ながみね @KzoNag Jollystics Inc. / 福岡XR部 Unityを触っていることが多い XR/インタラクティブ/モバイル 5
発端 6 前にGoで試した OculusAvatarをマルチ プレイできるサンプルを Questでも試したかった
Questでは動かせないことが発覚! 中で利用してるP2P通信などの機能はアプリIDを発行しないと使えない しかしデベロッパーサイトでのアプリ作成でPlatformをQuestにできない Questアプリの企画審査に通過する必要がある!? だがしかし 7
そこで 8 https://developer.oculus.com/documentation/avatarsdk/latest/concepts/avatars-sdk-intro/ https://www.photonengine.com/ja-JP/PUN
ドキュメントがあります https://doc.photonengine.com/ja-jp/pun/current/demos-and-tutorials/oculusavatarsdk 9
今日の話の目的 ドキュメントはOculus AvatarとPhotonを知ってることが前提 コピペしたら動いたけど中身の理解のハードルはやや高そう いろいろ触ってチョット分かってきたので共有します 10
Oculus Avatar Oculusが提供するアバターの仕組み Rift(S)/Go/Quest + SteamVRなどでも動かせる AvatarSDKで自作アプリに導入できる 11 https://developer.oculus.com/documentation/avatarsdk/latest/concepts/avatars-sdk-intro/
Oculus Avatar SDK Asset StoreでOculus Integrationを入れたらAvatarSDKも入る (以前は各種SDKの個別版も配布してたけど今は全部入りだけっぽい?) 12
LocalAvatar (シンプルなサンプル) 一人称視点と三人称視点の2つのアバターオブジェクト LocalAvatarはプレハブになっているのですぐに使える 13 Little_LocalAvatar LocalAvatar
LocalAvatarとRemoteAvatar 16 LocalAvatar HMDとコントローラーの情報 をもとにアバターを制御 RemoteAvatar シリアライズされたアバター データをもとにアバターを制御
LocalAvatarとRemoteAvatar 17 LocalAvatar RemoteAvatar アバター データ HMDとコントローラーの情報 をもとにアバターを制御 シリアライズされたアバター データをもとにアバターを制御
RemoteLoopback (シンプルなサンプル②) LocalAvatarから取得したアバターデータを RemoteAvatarに流し込むサンプル 18 RemoteAvatar LocalAvatar
LocalAvatar → アバターデータ 19 void Start() { LocalAvatar.RecordPackets = true;
LocalAvatar.PacketRecorded += OnLocalAvatarPacketRecorded; } void OnLocalAvatarPacketRecorded(object sender, OvrAvatar.PacketEventArgs args) { using (MemoryStream outputStream = new MemoryStream()) { BinaryWriter writer = new BinaryWriter(outputStream); ... byte[] avatarData = outputStream.ToArray(); SendPacketData(avatarData); } }
アバターデータ → RemoteAvatar 20 void ReceivePacketData(byte[] data) { using (MemoryStream
inputStream = new MemoryStream(data)) { BinaryReader reader = new BinaryReader(inputStream); int sequence = reader.ReadInt32(); OvrAvatarPacket avatarPacket; ... LoopbackAvatar.GetComponent<OvrAvatarRemoteDriver>().QueuePacket(sequence, avatarPacket); } }
マルチプレイの構成 21 アバター データ アバター データ アバター データ アバター データ
PlayerA PlayerB LocalAvatar LocalAvatar RemoteAvatar RemoteAvatar ネットワーク経由のデータの 送受信をどうするか
PlatformSDKのP2P通信を利用してアバターデータを送受信 ルーム制御やボイスチャットなどOculusRooms的な機能が実現されてる SocialStarter(しっかりしたサンプル) 22 XR部のメンバーに手伝ってもらって アバターが動くことを確認した
Photon マルチプレイゲームに必要なネットワーク機能を提供するサービス 無料プランあり Unity向けパッケージ : Photon Unity Networking (PUN) 25
https://www.photonengine.com/ja-JP/PUN
ネットワークオブジェクト 26 PhotonView 同期するコンポーネントを監視する役割 同じViewIDを持つ相手と同期する オブジェクトの所有権などの情報も持つ Photon***View 同期するコンポーネント TransformやRigidbodyなどは用意されている 自作することも可能
ネットワークオブジェクトの生成 27 Client1 Client2 Instantiateを実行して オブジェクト生成 Client1に合わせて オブジェクト生成 ViewID=1 ViewID=1
PhotonNetwork.Instantiate(prefabName, position, rotation); Cube Cube
ネットワークオブジェクトの同期 28 Client1 Client2 プレイヤー操作で 移動 Client1に 同期して移動 ViewID=1 ViewID=1
IPunObserbable 29 PhotonViewの監視対象となるインターフェイス public class PhotonAvatarView : MonoBehaviour, IPunObservable {
public void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info) { if(stream.IsWriting) { byte[] data = null; stream.SendNext(data); } if(stream.IsReading) { byte[] data = (byte[])stream.ReceiveNext(); } } } ここでLocalAvatarのアバターデータを送信 受信したアバターデータを RemoteAvatarに流し 込む
異なるプレハブ間の同期 30 ViewID=1 ViewID=1 LocalAvatar RemoteAvatar PhotonAvatarView PhotonAvatarView Client1 Client2
こういう状態にしたい
異なるプレハブ間の同期(手順) 31 ViewID=0 LocalAvatar PhotonAvatarView Client1 Client2 ①通常のInstantiateでオブジェクト生成
異なるプレハブ間の同期(手順) 32 ViewID=1 LocalAvatar PhotonAvatarView Client1 ②手動でViewIDを割り当て
異なるプレハブ間の同期(手順) 33 LocalAvatar PhotonAvatarView Client1 Client2 ③ViewIDを指定して生成イベント発行 ViewID=1 ViewID=1で 生成して
異なるプレハブ間の同期(手順) 34 ViewID=1 LocalAvatar RemoteAvatar PhotonAvatarView PhotonAvatarView Client1 Client2 ④指定されたViewIDでオブジェクト生成
ViewID=1
そんなこんなでできたもの 36 https://twitter.com/KzoNag/status/1149360901205610497?s=20
Have a nice avatar life!
CREDITS Special thanks to all the people who made and
released these awesome resources for free: ▪ Presentation template by SlidesCarnival ▪ Photographs by Unsplash 38