Autodesk ForgeをVisual Studio Codeで試す

私の横には「スプラトゥーンはこんなに楽しいよぉ〜、やらないのはもったいないなぁ〜、罪だよぉ〜」と私を誘惑する可愛い愛娘がいます。

MacBook Proからこんにちは。
WFHをしているhiroakitです。

この記事ではAutodesk Forgeというサービスをご紹介しつつ、Visual Studio Codeの拡張機能でお試しいただけますという点を簡単にですがお伝えいたします。

読むと何が出来るようになるの?

こちらができるようになります!

Autodesk Forgeとは

3Dモデルをクラウドベースで展開できるWeb APIベースのプラットフォームです。JavaScriptで動く専用の3Dビューアも提供しています。
例えば、お手元のAutodesk RevitのデータをAutodesk Forgeにアップロードすると専用ビューア (ウェブベースのもの) で閲覧できるようになります。

必要な環境

  • ウェブブラウザ (アプリ登録をする際に必要です)
  • Visual Studio Code (後述するAutodesk Forge Toolsと併せて使用します。本記事内ではMacを使っていますがWindowsでももちろん大丈夫です。)

料金

以上のことから、パソコンさえあれば、どなたさまも無料でお試しできます。
この記事ではAutodesk Forgeの使い方を以下の流れでお伝えします。(Autodeskアカウントをお持ちでない方は別途ご用意ください)

  1. Autodesk Forgeでアプリ登録
  2. Autodesk Forge Toolsをインストール
  3. Visual Studio Codeで設定
  4. 保存先のバケット作成
  5. ファイルをアップロード
  6. アップロードしたファイルを変換
  7. 変換したファイルの閲覧

それでは順にご説明いたします。

Autodesk Forgeでアプリ登録

お試しいただくためにはまず環境を用意しなくてはなりません。
Autodesk Forgeのサイトでアプリ登録をするのですがとてもカンタン。

ウェブサイトにアクセスしてちょっとのクリックとキーボード打つだけ。
Apple Developer Programみたいに頭を悩ます項目はありません。

アクセスするウェブサイトはこちら:
https://forge.autodesk.com/myapps

こんな感じに設定していきます。

上記の画面でアプリ登録が完了したら、次にお願いしたいのは「Autodesk Forge Tools」のインストールです。
前述の通り、Autodesk ForgeはAPIのみを提供しているサービスですので操作画面がほとんどありません。
ですが「Autodesk Forge Tools」をVisual Studio Codeにインストールすると粗方のAPIを操作することができます。

Autodesk Forge Toolsをインストール

「Autodesk Forge Tools」はVisual Studio Codeの拡張機能でGitHubでソースコードが公開されています。

こちらの拡張機能をインストールするとForgeへのデータアップロードなど一通りの機能を体験できます。

インストールが完了したら設定ファイルをホンのちょっとだけ、ちょっとだけいじる必要がありまして、前述の「Autodesk Forgeでアプリ登録」で登場した次の情報を書き込みます。

  • Client ID
  • Client Secret

詳しいところは次の節でご説明します。

Visual Studio Codeで設定

先ほどの情報をVisual Studio Codeの設定ファイルに記載します。

  1. コマンドパレット (Shift + Command + P) を開きます
  2. Open Settingsと入力して「基本設定: 設定 (JSON) を開く」を選びます

settings.jsonが表示されますから以下の形式で入力していきます。

アプリ登録時に発行されたClient IDをmy client idに、Client Secretをmy client secretに書き込みます。

保存先のバケット作成

Visual Studio Codeで「BUCKETS & DERIVATIVES」の右にある「+」ボタンをクリックします。

入力欄が表示されるのでClient IDを半角英数文字列に変換して、{Client ID}_{任意の文字列} の形でバケット名を入力します。

ファイルをアップロード

作成したバケットにファイルをアップロードします。アップロードするファイルはこちらのデータを使いますのでダウンロードしてください。

VSCodeで作成したバケットを右クリックすると「Upload Object」がありますのでそちらをクリックします。

先ほどダウンロードしたファイルを選択します。

しばらくするとアップロードが完了します。

アップロードしたファイルの変換

ファイルのアップロード完了後、そのファイルを右クリックして「Translate Object」を選択します。こうすることでウェブページ表示用のデータに変換され、次のステップの「閲覧」に進むことができます。

変換したファイルの閲覧

ここまで来たらあともう少しです。
{3D} で右クリックして「Preview Derivative」を選択します。

しばらくすると、VSCodeに3Dモデルを表示されます。

パン、ドリーなどしてモデルを色んな視点からご覧いただけます。

最後に

この記事ではRevitファイルをAutodesk Forgeにアップロードして表示するところまでご紹介しました。少しセットアップに手間がかかりますが、お試しする際の方法としては手軽なのでぜひともご活用いただければ幸いです。

今回はRevitファイルが例でしたが、他にもIFCファイルもアップロードできます。
ちょっとコードを書く必要がありますがAutodesk Forgeが提供している専用ビューアではモデルの検索ができますからお持ちのCMSなどと連携したら面白いかもですね。
その辺りはまた別の機会に。それでは、また。

オリジナルのハンドジェスチャーを実装する

こんにちは。HoloLensチームの老田です!

今回はHoloLens2でオリジナルのハンドジェスチャーの実装についてです。

そもそもどんなハンドジェスチャーがあるの?

  • AirTap
  • ホーム画面を出すジェスチャー (手首に人差し指をあてる)
  • ホーム画面を出すジェスチャー (手首に視線を合わせて人差し指と親指を合わせる)
    詳しくは下記を参照してください。

https://docs.microsoft.com/ja-jp/hololens/hololens2-basic-usage

https://docs.microsoft.com/ja-jp/windows/mixed-reality/system-gesture

オリジナルのジェスチャーを実装することができるのか?

かなり泥臭い方法になってしまいますが、実装することは可能なようでした。

今回は以下のようなジェスチャーを認識するように実装していきたいと思います。

実装のしかた

考え方としては指一つ一つを手のひらに対して同じ向きかどうか、そうでないかを判断することで指を曲げているかどうかを認識することができます。

using UnityEngine;
using Microsoft.MixedReality.Toolkit.Input;
using Microsoft.MixedReality.Toolkit.Utilities;

public class GestureTest : MonoBehaviour
{

    [SerializeField, Range(0.0f, 90.0f)] private float flatHandThreshold = 45.0f;
    [SerializeField, Range(0.0f, 90.0f)] private float facingThreshold = 80.0f;
    [SerializeField] GameObject sphere = null;
    [SerializeField] TextMesh textMesh = null;


    private void Update()
    {

        if (CheckHandSgin())
        {
            sphere.SetActive(true);
        }
        else
        {
            sphere.SetActive(false);
        }

    }

    private bool CheckHandSgin()
    {
        // 右手のみ判定したいので右手を取得
        var jointedHand = HandJointUtils.FindHand(Handedness.Right);

        // 手のひらが認識できているか
        if (jointedHand.TryGetJoint(TrackedHandJoint.Palm, out MixedRealityPose palmPose))
        {
            MixedRealityPose thumbTipPose, indexTipPose, middleTipPose, ringTipPose, pinkyTipPose;

            if (jointedHand.TryGetJoint(TrackedHandJoint.IndexTip, out indexTipPose) && jointedHand.TryGetJoint(TrackedHandJoint.PinkyTip, out pinkyTipPose))
            {
                var handNormal = Vector3.Cross(indexTipPose.Position - palmPose.Position, pinkyTipPose.Position - indexTipPose.Position).normalized;
                handNormal *= (jointedHand.ControllerHandedness == Handedness.Right) ? 1.0f : -1.0f;
                if (Vector3.Angle(palmPose.Up, handNormal) > flatHandThreshold)
                {
                    return false;
                }
            }

            // 中指と薬指の情報を取得
            if (jointedHand.TryGetJoint(TrackedHandJoint.MiddleTip, out middleTipPose) && jointedHand.TryGetJoint(TrackedHandJoint.RingTip, out ringTipPose))
            {
                var handNormal = Vector3.Cross(middleTipPose.Position - palmPose.Position, ringTipPose.Position - indexTipPose.Position).normalized;
                handNormal *= (jointedHand.ControllerHandedness == Handedness.Right) ? 1.0f : -1.0f;
                if (Vector3.Angle(palmPose.Up, handNormal) < flatHandThreshold)
                {
                    return false;
                }
            }
        }
        // 手のひらを向けているか確認
        return Vector3.Angle(palmPose.Up, CameraCache.Main.transform.forward) < facingThreshold;
    }

}

適当なオブジェクトにアタッチしてsphereにオブジェクトを割り当ててあげれば以下のGIFように動作すると思います。

最後に

注意点としてUnityエディタ上ではデバッグできませんのでそこそこつらいです。

今回は右手だけ反応するように実装しましたが、どちらかの手や左手だけ反応するようにも実装できます。

MagicLeapOneでEyeTracking

こんにちは。HoloLensチームの老田です!

前回の記事「MagicLeapOneで2つのコントローラを使う方法」に引き続き、EyeTrackingができるようなので検証してみました。

なにができるの?

  • 両目での視線のトラッキング
  • 片目の視線のトラッキング
  • 視線のステータスの取得
  • 瞬きの検出(左右別々に判定可能)

視線のトラッキングについて

Holo2のような視線のトラッキングが可能になっています。
前提としてかぶり方次第ではずれているように感じますので頑張っていい位置を探してください。

Holo2と比べるとそこまで正確にトラッキングできているわけではなさそうでした。
誤差や精度についての話はここでは割愛します。

ある程度ずれていても両目でトラッキングしている場合はそれなりに動いてくれます。
片目の場合はしっかりかぶっていないとカーソルが視界にすら入ることもままなりません。

視線のステータスの取得

MLEyes.CalibrationStatusから以下が取得できます。

  • MLEyeTrackingCalibrationStatus_None(未検出の状態)
  • MLEyeTrackingCalibrationStatus_Bad(1度検出した後に検出できなくなった状態)
  • MLEyeTrackingCalibrationStatus_Good(検出できている状態)

ちなみに瞬きをした場合はMLEyeTrackingCalibrationStatus_Badと判定されます。
また、瞬きだけではなくMLを外した時にも上記と同様の扱いになります。

瞬きについて

以下のbool型のフィールドで取得できます。
MLEyes.LeftEye.IsBlinking
MLEyes.RightEye.IsBlinking

精度はよいです。
普通の一瞬だけの瞬きでも取得でき、ウィンクでも行けます。
ただし、ウィンクしなれてないのでウィンクだけ難しく感じました。

サクッと動かす(両目の視線のトラッキング)

特にあれこれする必要もなく上記のInspectorの設定に合わせるだけで動作します。
MaterialやSharder、Scriptに関してはMagicLeapのExamplesを入れていればすべてそろっています。

実行すると視線の先にカーソルが表示されるようになります。

ざっくりと解説するとWorldRaycastEyes内でUpdateごとにOnRaycastHitが呼ばれています。
ここでオブジェクトのTransformを変更しています。

もう少し深掘りしてみる(ウィンクで何か操作する)

右ウィンクしたときに0.5秒たったら何かするものを実装してみました。
あとは豆腐の色変えたりお好きに使ってください。

using System.Collections;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.XR.MagicLeap;

public class EyeTracking : MonoBehaviour
{
  bool isBlink = false;
  float count = 0f;
  [SerializeField] float threshold = 0.5f;

  private void Start()
  {
    StartCoroutine(BlinkCheck());
  }
  private IEnumerator BlinkCheck()
  {
    MLEyes.Start();
    while (true)
    {
      // 右目のウィンクだけを判定
      if (!isBlink && MLEyes.RightEye.IsBlinking && !MLEyes.LeftEye.IsBlinking)
      {
        count += Time.deltaTime;
        // 右ウィンクしている状態で0.5秒たったらコマンドと認識
        if (count > threshold)
        {
          isBlink = true;
          Debug.Log("is Blink Command");
        }
      }
    }

    // 両目を開いたらリセット
    if (!MLEyes.RightEye.IsBlinking && !MLEyes.LeftEye.IsBlinking)
    {
      count = 0f;
      isBlink = false;
    }
    yield return null;
    }
  }
}

 

MagicLeapOneで2つのコントローラを使う方法

こんにちは。HoloLensチームの老田です。

前回の記事「MagicLeapOne向けアプリ開発の始めかた」に引き続き、コントローラ2台の接続方法とサンプルの実装まで行いたいと思います。

接続方法

1. 1台目はつながれていることを確認

2. 2台目をケーブルでつなぐ

3. 設定のConectivityのControlから接続されていることを確認する

4. 2台目のケーブルを抜く

画像のように1台目がprimary、2台目がsecondaryといった表現で接続されていることがわかります。

ホームでの挙動

1台目(primary)は通常通り動作します。

2台目(secondary)はホームボタンのみ動作します。

自作アプリでコントローラを2台の入力を受け取る

ControllerというPrefabがありますのでこれをScene上に2つ配置します。

ControllerConnectionHandlerというスクリプトがありますのでその中のDeviceTypesAllowedをそれぞれLeftとRightに変更してください。

あとはビルドしてデプロイして動かすとこんな感じになります。

MagicLeapOne向けアプリ開発の始めかた

 

こんにちは。HoloLensチームの髙木です。

前回の記事「MagicLeapOne始めました!」に引き続き、今回はUnity向け開発環境のセットアップ~ビルドまでを書いてゆきます。

ちなみに当社で検証に使用しているデバイスは、MagicLeap社と業務提携されているNTT Docomo様のご厚意により、お借りさせていただいています。

 

  • 安心してください。技適通ってますよ!

それでは、本題の開発環境の構築を行っていきます。

 

前提:

今回の記事は、MagicLeap社(公式)の開発者ガイドを元に記載しています。

https://creator.magicleap.com/learn/guides/creator-portal

 

デバイスの準備:

◆OSアップデート

  • 事前にMagicLeapOneのLuminOSを最新版にアップデートしてください

◆開発者モードの有効化

  • Wi-Fiに接続します(未接続だとCreatorメニューが出ない)
  • ランチャー上部の設定アイコン(歯車マーク)> Deviceアイコン > Creatorメニュー

  • 全てのスライダーをオンにします

以上でデバイス側の設定は完了です。

 

開発用PCの環境構築:

◆SDK、ツールのインストール

  • Magic Leap The Labをインストールします
    https://developer.magicleap.com/downloads/lab
  • Magic Leap The Labを起動し、右上のPackage Managerを開きます
  • Lumin Runtimeを選択し、Optional Packageにチェックを入れ、Apply Changesをクリックします
  • C:\Users\ “ユーザー名” \MagicLeap\mlsdk\”バージョン” 配下にSDKがインストールされます
  • インストール後、PCを再起動します

 

Unityアプリの開発:

◆Unityのインストール

※ テンプレートを使用せずにプロジェクトを作成したい方はコチラ

◆Magic Leap Toolkitのインポート

Magic Leap ToolkitはUnityアプリケーションで、コントローラ入力の取り扱いや、マルチプレイングなどの実装を行うためのツールキットです。必要に応じて使用しましょう。

◆Lumin SDKパスの設定

  • Unity Editor:Edit > Preferences > External Toolsを開きます
    • Lumin > SDKにSDKのパスを入力します
      • C:/Users/”ユーザー名”/MagicLeap/mlsdk/”バージョン”

◆.NET APIの設定

  • Unity Editor:Player Settings > Other Settings > Api Compatibility Level
    • 「.NET 4.X」を選択します

◆ビルドターゲットの設定

  • Unity Editor:Build Settings
    • Platform「Lumin」を選択し、「Switch Platform」をクリックします

 

シミュレータでの実行:

◆Unityプロジェクトの設定

  • Edit > Magic Leap > ML Remote > Install Support Librariesをクリックします
    • シミュレーションに必要なライブラリがインポートされます

◆シミュレータの起動

  • Magic Leap The LabからZero Iterationを起動します
  • Stateタブをクリックし、シミュレータを起動します

◆Unityプロジェクトの実行

  • Unity Editorの実行ボタンをクリックします
  • シミュレータ上でUnityプロジェクトが動作します

 

実機へのデプロイ:

◆アプリに署名を追加する

MagicLeapOne向けのアプリケーションには署名が必要なため、以下を実施します。

  • Unity Editor:Player Settings > Other Settings > Identification > Bundle Identifier
    • 「com.companyname.appname」の形式で入力します ※小文字で入力する事

◆証明書を取得する

  • Magic Leap Creator Portalへログインします
  • 右上の「Publish >「Certificates」をクリックします
  • 「Add New」をクリック > 証明書の名称を入力し「Generate」をクリックします
    • Privatekey.zipのダウンロードが開始します
    • ローカルに保存して解凍します(XX.privkey)
  • 少し待ってページを更新し、先ほど登録した証明書の「Download」をクリックします
    • XX.certのダウンロードが開始します
    • ローカルに保存します

◆証明書を登録する

  • Unity Editor:Player Settings > Publishing Settings > ML Certificate
    • 上記手順で取得した証明書(XX.cert)を選択します

◆アプリ権限を設定する

◆デプロイ

  • MagicLeapOneの電源をONにして、ランチャー画面を起動します
  • MagicLeapOneとPCをUSB Type-Cケーブルで接続します
  • Unity Editorで、「File」> 「Build And Run」をクリックします
    • ビルド完了後に実機上で実行される

 

まとめ:

以上で、開発環境構築~ビルドまでが完了です。

今回は、サンプルプロジェクトをそのままビルドしただけですが、自分好みにカスタマイズしてデプロイすると楽しんでいただけるかと思います。

また、MagicLeapOneには、コントローラ入力、ハンドトラッキング、アイトラッキングなど様々なインターフェースが用意されているので、今後、ご紹介してゆきたいと思います。

ようこそHoloLens 2

こんにちは。Hololensチームのたくやです。

2019年11月7日より、世界各国の法人向けに出荷が開始された、Microsoft社の新型MRデバイス「HoloLens 2(ホロレンズ 2)」。ついに弊社にも第一号機が到着いたしました!!!

 

HoloLens 2は前世代機であるHololensに比べて視野角が2倍以上広くなり、ピクセル密度も2倍以上、片目2Kの解像度を実現し、広視野角で高精細なグラフィックスに進化しています。

今後の導入事例拡大に向け、HoloLens 2の優れたスペックを最大限活用し、検証や開発も進めていければと思います。

最新事例は都度、紹介していきますのでお楽しみに!!!

MagicLeapOne始めました!

こんにちは。HoloLensチームの老田です。

日頃からHoloLens開発を行っておりますがこの度弊社にもMagicLeapOneがやってきました!

HoloLensとの大きな違いはコントローラが付いていること、本体とHMDがケーブルでつながれているところです。

性能面などの違いが知りたい方やMagicLeapOneが何かをご存知ない方はこちらをご覧ください。

引き続きHoloLens開発も行っては行きますがMagicLeapOneの検証や開発も行っていきたいと思います!

また後日MagicLeapOneの記事をアップ予定ですのでお楽しみに!

 

MRTKを使ってHoloLensの空間メッシュを取得する

こんにちは。HoloLensチームの野元です。
先日、待ちに待ったHoloLens2が発売されましたね!手元にHoloLens2が来るのを今か今かと待ち望んでいる今日この頃です。(笑)

HoloLensを使用すると空間をスキャンしてメッシュデータを取得することが出来ます。
HoloLens1ではHTK(HoloToolKit)のSpatialMappingを使ってメッシュデータを取得していましたが、HoloLens2ではMRTK(MixedRealityToolkit)のSpatialAwarenessを使用しメッシュデータの取得する必要があります。(HoloLens1でもMRTKは使えます。)
HoloLens2がいつ手に入ってもいいように、MRTKを使用したメッシュデータの取得方法を見ていくことにします。

MRTK is 何?

MRTKは、Mixed Reality Toolkitの略称であり、Virtual Reality (VR) 及び Augmented Reality (AR) の Mixed Reality エクスペリエンスを構築するためのクロスプラットフォームツールキットのことです。
HoloLensアプリケーションを作る際には、MRTKがないと始まらないレベルで重要です。
詳しく知りたい方は、MRTK公式ドキュメントをご覧ください。

検証環境

  • Windows 10 SDK (10.0.18362.0)
  • Unity 2018.4.2.f1
  • Visual Studio 2019
  • Microsoft Mixed Reality Toolkit v2.1.0

方法その1. メッシュデータを全件取得する

下記の通りにすると、HoloLensがスキャンしたメッシュデータを一括で取得することできます。

// SpatialAwarenessSystemをIMixedRealityDataProviderAccessにキャストしてオブザーバーを取得します
var access = CoreServices.SpatialAwarenessSystem as IMixedRealityDataProviderAccess;

// 利用可能な最初のメッシュオブザーバーを取得します。通常、登録されているのは1つだけです。
var observer = access.GetDataProvider< IMixedRealitySpatialAwarenessMeshObserver>();

// 既知のすべてのメッシュをループします
foreach (SpatialAwarenessMeshObject meshObject in observer.Meshes.Values)
{
  // ここでメッシュが取れます
    Mesh mesh = meshObject.Filter.mesh;
  // 以降はお好みの処理をどうぞ!
}

方法その2. メッシュデータの差分を取得する

下記の通りにすると、HoloLensがスキャンしたメッシュデータを逐一差分で取得することができます。

// タイプを簡素化します
using SpatialAwarenessHandler = IMixedRealitySpatialAwarenessObservationHandler< SpatialAwarenessMeshObject>;

public class MeshObservationExample : MonoBehaviour, SpatialAwarenessHandler
{
    private bool isRegistered = false;

    private void OnEnable()
    {
        RegisterEventHandlers();
    }

    private void OnDisable()
    {
        UnregisterEventHandlers();
    }

    /// SpatialAwarenessSystemイベントを登録します
    private void RegisterEventHandlers()
    {
        if (!isRegistered && (CoreServices.SpatialAwarenessSystem != null))
        {
            CoreServices.SpatialAwarenessSystem.RegisterHandler< SpatialAwarenessHandler>(this);
            isRegistered = true;
        }
    }

    /// SpatialAwarenessSystemイベントを登録解除します
    private void UnregisterEventHandlers()
    {
        if (isRegistered && (CoreServices.SpatialAwarenessSystem != null))
        {
            CoreServices.SpatialAwarenessSystem.UnregisterHandler< SpatialAwarenessHandler>(this);
            isRegistered = false;
        }
    }

    /// メッシュが追加されたときに呼ばれます
    public void OnObservationAdded(MixedRealitySpatialAwarenessEventData< SpatialAwarenessMeshObject> eventData)
    {
        // メッシュ追加時の処理を記述します
    }

    /// メッシュが更新されたときに呼ばれます
    public void OnObservationUpdated(MixedRealitySpatialAwarenessEventData< SpatialAwarenessMeshObject> eventData)
    {
        // メッシュ更新時の処理を記述します
    }

    /// メッシュが削除されたときに呼ばれます
    public void OnObservationRemoved(MixedRealitySpatialAwarenessEventData< SpatialAwarenessMeshObject> eventData)
    {
        // メッシュ削除時の処理を記述します
    }
}

まとめ

周辺環境は常に変化していくと思うので、HoloLensの空間スキャンデータの差分をハンドリングする方がベターがと思います。
さらに詳しく知りたい方は、SpatialAwarenessの項目をご覧ください。

Azure DevOpsでHoloLensアプリをビルドする(MS-hosted編)


こんにちは。酒井(@saka_it)です。

突然ですが、皆さん、CI(継続的インテグレーション)してますか?
今どきの開発に CI 環境の構築は欠かせませんが、CI環境構築やメンテナンスは、面倒なことも多いと思います。

そこで今回は Azure DevOps の一部である Azure Pipelines の Microsoft-hosted agents を使って、ビルドマシンの用意が不要なCI環境を作ってみます。

※この記事では HoloLens(Unity)アプリのビルドを説明します。WebApps の CI/CD 環境を構築したい方はネスケラボの記事もどうぞ。

続きを読む Azure DevOpsでHoloLensアプリをビルドする(MS-hosted編)

Microsoft Dynamics 365 Guides を始めてみる

Guidesイメージ

こんにちは。酒井(@saka_it)です。

2019年02月にスペインバルセロナで開催された MWC(ワールドモバイルコングレス)で Microsoft HoloLens 2 と共に Microsoft Dynamics 365 Guides が発表されました。ノンプログラミングで HoloLens 上での操作ガイドを作成できるということで、注目されている方も多いかと思います。

公開されているデモ動画などでは HoloLens 2 で利用されているのですが、今までの HoloLens 1 でも動作させることができます。今回は HoloLens 1 の方で導入して、ガイドを作成する手順を紹介します。

続きを読む Microsoft Dynamics 365 Guides を始めてみる