はじめに
HoloLensアドベントカレンダー2021の1日目の記事です。
今回はZIGSIMを用いて、iPhoneのQuaternionをHoloLens2にUDP送信し、HoloLens2上のCapsuleをiPhoneの姿勢に合わせて動かしてみましょう。
開発環境
- Windows 10 PC
- Unity 2020.3.0f1
- MRTK 2.7.2
- HoloLens2
- iPhone 12 Pro
- ZIG SIM PRO
実装
1.MixedRealityFeatureTool-1.0.2104.4-Betaを用いてMRTKをインストールします
MRTK導入部分の詳細はこちらのHoloLens2 はじめーる(Unity 2020.3、MRTK2.7.2)をご参照ください。
2.ZigSimManager.csを作成し、objにCapsuleをアタッチします
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
#if UNITY_EDITOR
using System.Net;
using System.Net.Sockets;
#else
using System;
using System.IO;
using Windows.Networking.Sockets;
#endif
public class ZigSimManager : MonoBehaviour
{
int port = 3333;
Osc.Parser osc = new Osc.Parser();
public GameObject obj;
void OnMessage(Osc.Message msg)
{
// Debug.LogFormat("{0} => {1}", msg.path, msg.data[0]);
if (String.Equals(msg.path,"/ZIGSIM/{Device UUID}/quaternion")){
obj.transform.rotation = new Quaternion(-(float)msg.data[0], -(float)msg.data[2], -(float)msg.data[1], (float)msg.data[3]) * Quaternion.Euler(90.0f, 0.0f, 0.0f);
}
}
#if UNITY_EDITOR
UdpClient udpClient;
IPEndPoint endPoint;
void Start()
{
endPoint = new IPEndPoint(IPAddress.Any, port);
udpClient = new UdpClient(endPoint);
}
void Update()
{
while (udpClient.Available > 0) {
var data = udpClient.Receive(ref endPoint);
osc.FeedData(data);
}
while (osc.MessageCount > 0) {
var msg = osc.PopMessage();
OnMessage(msg);
}
}
#else
DatagramSocket socket;
object lockObject = new object();
const int MAX_BUFFER_SIZE = 1024;
byte[] buffer = new byte[MAX_BUFFER_SIZE];
async void Start()
{
try {
socket = new DatagramSocket();
socket.MessageReceived += OnMessage;
await socket.BindServiceNameAsync(port.ToString());
} catch (System.Exception e) {
Debug.LogError(e.ToString());
}
}
void Update()
{
lock (lockObject) {
while (osc.MessageCount > 0) {
var msg = osc.PopMessage();
OnMessage(msg);
}
}
}
async void OnMessage(DatagramSocket sender, DatagramSocketMessageReceivedEventArgs args)
{
using (var stream = args.GetDataStream().AsStreamForRead()) {
await stream.ReadAsync(buffer, 0, MAX_BUFFER_SIZE);
lock (lockObject) {
osc.FeedData(buffer);
}
}
}
#endif
}
Debug.LogFormat("{0} => {1}", msg.path, msg.data[0]);のところで
/{Device UUID}/deviceinfo => iPhone13,3
/ZIGSIM/{Device UUID}/quaternion => 0.3267779
こんな感じのOSCメッセージが送られてきます。{Device UUID}はZIGSIMの設定からコピペしてください。OSCのメッセージの処理については、keijiroさんのunity-oscを使ってます。
msg.pathがquaternionのときに、msg.data[0]~[3]がそれぞれx,y,z,wになります。
object型になっているのでfloat型にキャストして、Unityの座標系に合わせてCapsuleのrotationに代入します。
3.HoloLens2にデプロイしましょう。PlayerSettings->CapabilitiesのInternetClientServerとPrivateNetworkClientServerにチェック入れるのを忘れずに。
反映されてないこともあるので、Package.appxmanifestもチェックしましょう。
4.アプリを起動したら、ZIGSIMも起動します。ZIGSIMの設定でHoloLens2のIPアドレスを指定してStartしてください。CapsuleがiPhoneに合わせて動いたら成功です。
Sensor | Setting | Start |
---|---|---|
デモ
#HoloLens2 x #ZIGSIM quaternion test pic.twitter.com/FsXFjlfiOr
— がちもとさん@メタバース熊本 (@sotongshi) December 1, 2021