LoginSignup
3
0

More than 1 year has passed since last update.

HoloLens2 × ZIGSIM やーる(Quaternion)

Last updated at Posted at 2021-12-01

はじめに

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をインストールします
image.png
MRTK導入部分の詳細はこちらのHoloLens2 はじめーる(Unity 2020.3、MRTK2.7.2)をご参照ください。

2.ZigSimManager.csを作成し、objにCapsuleをアタッチします

image.png

ZigSimManager.cs
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にチェック入れるのを忘れずに。

image.png

反映されてないこともあるので、Package.appxmanifestもチェックしましょう。
image.png

4.アプリを起動したら、ZIGSIMも起動します。ZIGSIMの設定でHoloLens2のIPアドレスを指定してStartしてください。CapsuleがiPhoneに合わせて動いたら成功です。

Sensor Setting Start
262127487_1790216537839892_7255513602478216080_n.jpg 262583901_1187764461747415_208444545253038229_n.jpg 263038467_1008804956335039_7598450806399269906_n.jpg

デモ

参考文献

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0