MRが楽しい

MRやVRについて学習したことを書き残す

MRTK v2のドキュメントを少しずつ読み解く ハンドトラッキング その1

本日は MRTKv2 の調査枠です。
MRTKv2 の Guides ドキュメントを少しずつ読み進めていきます。

MRTKv2のGuidesドキュメント

以下のドキュメントを読み進めていきます。
microsoft.github.io

以下のページでは有志による本ドキュメントの日本語翻訳が行われています。
投稿時点でこちらで未翻訳、または著者が興味のある部分について記事にしていきます。
hololabinc.github.io

本記事では以下のページを読み進めます。
microsoft.github.io
f:id:bluebirdofoz:20200308232145j:plain

ハンドトラッキング

HandTrackingプロファイル

HandTrackingプロファイルは InputSystem プロファイルの下にあります。
ここには手の表現をカスタマイズするための設定が含まれています。
f:id:bluebirdofoz:20200308232154j:plain

JointPrefabs(ジョイントプレハブ)

ジョイントプレハブは単純なプレハブを使用して視覚化されます。
掌と人差し指の関節が特に重要です。他のすべての関節が同じプレハブを共有し、自分自身のプレハブを持っています。
f:id:bluebirdofoz:20200308232221j:plain

デフォルトでは、ハンドジョイントプレハブは単純な幾何プリミティブです。
これは必要に応じて交換できます。プレハブがまったく指定されていない場合、空の GameObject が代わりに作成されます。

ジョイントプレハブでは複雑なスクリプトや高価なレンダリングを使用しないでください。
全てのフレームで変換されるため、パフォーマンスが大幅に低下する可能性があるためです。
f:id:bluebirdofoz:20200308232232j:plain

HandMeshPrefab(ハンドメッシュプレハブ)

ハンドトラッキングバイスによって完全なメッシュデータが提供される場合、ハンドメッシュが使用できます。
f:id:bluebirdofoz:20200308232251j:plain

レンダリング可能なメッシュはデバイスからのデータに置き換えられるため、キューブなどのダミーメッシュで十分です。
プレハブの素材がハンドメッシュに使用されます。
f:id:bluebirdofoz:20200308232300j:plain

ハンドメッシュはパフォーマンスに顕著な影響を与える可能性があります。
このため、[Enable Hand Mesh Visualization]オプションをオフにすることで、完全に無効にできます。

手の視覚化設定

ハンドメッシュおよびハンドジョイントの視覚化はオンまたはオフにできます。
設定にはそれぞれハンドメッシュの視覚化モード設定およびハンドジョイントの視覚化モード設定を使用します。
、これらの設定はアプリケーションモードに固有です。
つまり、エディターでいくつかの機能をオンにし、デバイスに展開するときに同機能をオフにすることができます。

通常、エディターで手関節の視覚化をオンにして、デバイスで手関節の視覚化と手メッシュの視覚化の両方をオフにすることをお勧めします。
これは手の視覚化がパフォーマンスに影響があるためです。

MRTK v2のドキュメントを少しずつ読み解く ジェスチャー

本日は MRTKv2 の調査枠です。
MRTKv2 の Guides ドキュメントを少しずつ読み進めていきます。

MRTKv2のGuidesドキュメント

以下のドキュメントを読み進めていきます。
microsoft.github.io

以下のページでは有志による本ドキュメントの日本語翻訳が行われています。
投稿時点でこちらで未翻訳、または著者が興味のある部分について記事にしていきます。
hololabinc.github.io

本記事では以下のページを読み進めます。
microsoft.github.io
f:id:bluebirdofoz:20200307230807j:plain

ジェスチャー

ジェスチャーは、人間の手に基づく入力イベントです。
MRTKでジェスチャー入力イベントを発生させるデバイスは2つのタイプがあります。

HoloLensなどのWindows Mixed Realityデバイス

ピンチモーション(エアタップ)とタップアンドホールドジェスチャについて説明します。
HoloLensのジェスチャーの詳細については Windows Mixed Reality Gestures のドキュメントを参照してください。
docs.microsoft.com

WindowsMixedRealityDeviceManager は Unity の XR.WSA.Input.GestureRecognizer をラップします。
これにより、HoloLens デバイスから Unity のジェスチャーイベントを利用しています。

タッチスクリーンデバイス

UnityTouchController は物理的なタッチスクリーンをサポートする Unity Touch クラスをラップしています。

2つの入力ソースは両方とも Gesture プロファイルで設定します。
Unity のタッチイベントとジェスチャーイベントをそれぞれMRTKの入力アクションに変換します。
このプロファイルは Input タブの Input System Settinges プロファイルにあります。
f:id:bluebirdofoz:20200307230902j:plain

ジェスチャーイベント

ジェスチャーイベントは以下の GestureHandler インターフェイスのいずれかを実装することによって受信されます。
・IMixedRealityGestureHandler
・IMixedRealityGestureHandler
microsoft.github.io

ジェスチャーイベントハンドラーの実装例については後述のサンプルシーンを参照してください。

汎用的なものを実装する場合 OnGestureCompleted および OnGestureUpdated イベントは次のタイプの型付きデータを受け取ることができます。

Vector2

2D位置ジェスチャー。deltaPosition を通知するためにタッチスクリーンで作成されます。

Vector3

3D位置ジェスチャー。HoloLensが作成した以下の情報を取得します。
・操作イベントの cumulativeDelta
・ナビゲーションイベントの normalizedOffset

Quaternion

3D回転ジェスチャー。カスタム入力ソースで使用できますが、既存のソースでは現在作成されていません。

MixedRealityPose

3D位置/回転ジェスチャーの組み合わせ。カスタム入力ソースで使用できますが、既存のソースでは現在作成されていません。

イベントの順序

ユーザー入力に応じて2つの主要なイベントチェーンがあります。

ホールド

1.ホールドタップ
2.HoldStartDuration を超えてホールド
3.リリースタップ
microsoft.github.io

移動

1.ホールドタップ
2.HoldStartDuration を超えてホールド
3.NavigationStartThreshold を超えて手を移動
4.リリースタップ
microsoft.github.io

サンプルシーン

MixedRealityToolkit.Examples\Demos\HandTracking\Scenes の HandInteractionGestureEventsExample シーンを開きます。
これはポインターResultを使用して、ヒット位置にオブジェクトを生成する方法を示しています。

GestureTester スクリプトは、GameObjectsを介してジェスチャーイベントを視覚化する実装例です。
ハンドラー関数はインジケーターオブジェクトの色を変更し、シーン内のテキストオブジェクトに最後に記録されたイベントを表示します。
github.com

Unityのスクリプトで実行環境がHoloLensか識別する

本日は HoloLens の技術調査枠です。
Unityのスクリプトで実行環境がHoloLensか識別する方法について記事にします。
f:id:bluebirdofoz:20200305095136j:plain

実行環境の識別方法

スクリプトから実行中のデバイスを識別する場合、SystemInfo.devicemodel を利用します。
docs.unity3d.com

例えば以下のように HoloLens か否かを識別できます。

if (SystemInfo.deviceModel.Contains("HoloLens"))
{
    // HoloLensでの実行処理...
}
else
{
    // HoloLens以外の実行処理...
}

実機での動作を確認する

実際にアプリを作成し HoloLens での動作を確認してみます。
f:id:bluebirdofoz:20200305095414j:plain

以下の記事を元に HoloLens プロジェクトを作成します。
bluebirdofoz.hatenablog.com

シーン中のテキストパネルは以下の手順で作成しています。
bluebirdofoz.hatenablog.com

HoloLensの判定結果と取得デバイス名をテキストに表示する以下のスクリプトを作成します。
・DeviceChecker.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DeviceChecker : MonoBehaviour
{
    /// <summary>
    /// 出力用テキストフィールド
    /// </summary>
    private UnityEngine.UI.Text p_text;

    /// <summary>
    /// 起動時処理
    /// </summary>
    private void Start()
    {
        // Textコンポーネントを取得
        p_text = GetComponent<UnityEngine.UI.Text>();

        // デバイス名を出力
        string deviceName = SystemInfo.deviceModel;
        p_text.text = deviceName + System.Environment.NewLine;

        // HoloLensか否かをチェック
        bool isHoloLens = SystemInfo.deviceModel.Contains("HoloLens");
        if (isHoloLens)
        {
            p_text.text += "これは HoloLens です";
        }
        else
        {
            p_text.text += "これは HoloLens ではない";
        }
    }
}

作成したスクリプトを Text オブジェクトにアタッチします。
f:id:bluebirdofoz:20200305095451j:plain

UnityEditor 上で動作確認してみると、テキストに判定結果が表示されます。
f:id:bluebirdofoz:20200305095503j:plain

これを HoloLens 向けにプロジェクトをビルドしてインストールします。
UnityプロジェクトのビルドとHoloLensへのインストール手順については以下を参照してください。
bluebirdofoz.hatenablog.com

HoloLensでの動作確認

HoloLens 上で動作確認を行います。
以下の通り、HoloLens と判定されれば成功です。
f:id:bluebirdofoz:20200305095137j:plain

参考ページ

その他、HoloLens以外のデバイスなどは以下のようなデバイス名が取得できるようです。
qiita.com

MovieStudioを使って動画のアスペクト比やサイズを変更する

本日は MovieStudio の小ネタ枠です。
MovieStudioを使って動画のアスペクト比やサイズを変更する手順について記事にします。
f:id:bluebirdofoz:20200304093358j:plain
bluebirdofoz.hatenablog.com

動画ファイルの読み込み

今回はサイズ 1920x1080(アスペクト比 16:9) の動画ファイルを 640x480(4:3) のサイズに変更してみます。。
サイズを変更する動画ファイルをドラッグして MovieStudio に取り込み、「ビデオ」ラインに配置します。
f:id:bluebirdofoz:20200304093435j:plain

動画のサイズ変更

「プロジェクトビデオプロパティ」のボタンをクリックして動画のプロパティを変更します。
今回は「テンプレート」から[インターネット 480-30p 4:3]を選択して、640x480のサイズに変更しました。
[OK]ボタンをクリックして変更を確定します。
f:id:bluebirdofoz:20200304093444j:plain

プレビューのアスペクト比とサイズが変わりましたが、そのままだと映像がない部分に黒い帯が入ります。
描画位置を調整して画面全体に映像が映るように調整します。
ラインの右端にある「イベントのパン/クロップ」アイコンをクリックして、「イベントのパン/クロップ」ウィンドウを開きます。
f:id:bluebirdofoz:20200304093454j:plain

プリセットのプルダウンを開き、[4:3 標準 TV アスペクト比]を選択します。
f:id:bluebirdofoz:20200304093605j:plain

これで動画の描画位置を調整して画面全体に映像が映るようになりました。
タイミングごとに[キーフレームの作成]で描画位置を変更することもできます。
f:id:bluebirdofoz:20200304093615j:plain

動画の出力

最後に編集したプロジェクトを動画ファイルとして出力します。
メニューから プロジェクト -> レンダリング を選択します。
f:id:bluebirdofoz:20200304093625j:plain

出力先と出力名を設定し、テンプレートから出力形式を選択します。
今回は出力形式にサイズが同じである[Apple iPod 640x480 ビデオ]を選択しました。
[レンダリング]ボタンをクリックして動画を出力します。
f:id:bluebirdofoz:20200304093635j:plain

これでサイズが変更された動画が出力されました。
f:id:bluebirdofoz:20200304093647j:plain

Blender2.8でアクションを完全に削除する

本日は Blender2.8 の技術調査枠です。
Blender2.8 でモデルのアクションを完全に削除する手順について記事にします。
f:id:bluebirdofoz:20200303093541j:plain

2022/2/28追記

本記事ではアクションの参照を切ることでアクションのデータを削除する手順を紹介しています。
以下の記事でアクションのデータそのものを直接削除する方法を記事にしました。
bluebirdofoz.hatenablog.com
こちらの方がより簡単にアクションを削除できます。

アクションの削除

アクションをプロジェクトから完全に削除するには全ての参照を切る必要があります。
アクション名の横に「0」マークがついているアクションは参照がないアクションです。
参照の無いアクションはプロジェクトを再起動することで、完全に削除されます。
f:id:bluebirdofoz:20200303093551j:plain

新規作成した直後の場合

アクションを作成した直後であれば削除は簡単です。
試しに「ドープシート」ビューの「新規アクション」ボタンでアクションの新規作成を行います。
f:id:bluebirdofoz:20200303093559j:plain

参照はドープシートのみが持っているため、「ドープシート」ビューで作成したアクションの「アクションのリンク削除」ボタンを押すと、全ての参照を削除できます。
f:id:bluebirdofoz:20200303093609j:plain

これでアクションに「0」マークが付きました。
プロジェクトを再起動すると、メモリ上からも削除されてアクションは完全に削除されます。
f:id:bluebirdofoz:20200303093618j:plain

新規作成した後に他のアクションを確認するなどをした場合

アクションを作成した後、他のアクションを確認するなどをした場合、手順が少し複雑になります。
他のアクションを確認した場合、作成したアクションには自動で参照が追加されてしまいます。
以下のように「2」のマークが付き、参照が追加された状態になっています。
f:id:bluebirdofoz:20200303093629j:plain

この状態でアクションを削除するため、「アクションのリンク削除」ボタンを押してみます。
f:id:bluebirdofoz:20200303093637j:plain

すると「ドープシート」上での参照は切れましたが、「0」マークは付かず、該当アクションは残り続けてしまいます。
f:id:bluebirdofoz:20200303093645j:plain

これは「ドープシート」上で切り替えなどが行われた場合、自動的に「ノンリニアアニメーションエディター」の「保留アクション」にアクションの参照が保持されるためです。
f:id:bluebirdofoz:20200303093654j:plain

該当アクションを選択して「Deleteキー」で削除します。
f:id:bluebirdofoz:20200303093703j:plain

アクションが削除されたら「ドープシート」に戻ります。
f:id:bluebirdofoz:20200303093711j:plain

アクションを確認すると「0」マークが付き、全ての参照が切られた状態になったことが分かります。
f:id:bluebirdofoz:20200303093723j:plain

これは「ドープシート」上で別アクションを選ぶと、その時点で参照が切れてしまうため、意図しないアクションの削除が発生してしまう事の対処のようです。
この対処により、ユーザはアクションの保存について、参照を意識する必要がありません。

一方で、削除の際はどこが参照を持っているか分からず、困惑することになります。
「ドープシート」はあくまでアクションの一時的な編集を行う箇所であり、アクションそのものの管理は「ノンリニアアニメーションエディター」で行われることを覚えておきましょう。

Blender2.79以前の手順について

Blender2.79以前での手順は以下の記事を参照ください。
bluebirdofoz.hatenablog.com

MRTKのTextMeshProで日本語を利用する

本日は MRTK の技術調査枠です。
MRTKのTextMeshProで日本語を利用する手順について記事にします。
f:id:bluebirdofoz:20200302094435j:plain

MRTKのサンプルシーン

MRTKのサンプルシーンで利用される TextMeshPro はそのままでは以下のように日本語が利用できません。
f:id:bluebirdofoz:20200302094444j:plain

TextMeshPro で日本語を利用するにはフォントアセットを作成する必要があります。

日本語フォントを準備する

フォントアセットを作成する前に、日本語のフォントを用意します。
今回は Windows に含まれる[メイリオ]フォントを利用してみました。
C:\Windows\Fonts 配下にある以下の MeiryoUI をコピーし、MeiryoUI.ttc を取得します。
f:id:bluebirdofoz:20200302094456j:plain

Unity のアセットに取り込んだら事前準備は完了です。
他に利用したい日本語フォントがあれば、そのフォントファイルを取得して準備してください。
f:id:bluebirdofoz:20200302094507j:plain

FontAssetの作成

TextMeshProの機能を利用してフォントアセットを作成します。
メニューから Window -> TextMeshPro -> FontAssetCreator を開きます。
f:id:bluebirdofoz:20200302094518j:plain

[FontAssetCreator]ウィンドウが開くので、以下の通り設定を行います。

SourceFontFile:meiryo(準備したフォントファイル)
SamplingPointSize:CustomSize 48
Padding:5
PackingMethod:Fast
AtlasResolution:8192 8192
CharacterSet:CustomCharacters
SelectFontAsset:None
CustomCharacterList:(利用したい文字コード)

f:id:bluebirdofoz:20200302094527j:plain

CustomCharacterList には TextMeshPro で利用したい文字を全て入力する必要があります。
以下の記事で、ほぼ全ての日本語文字を網羅した文字セットを公開して下さっている方がいたので、今回はこれを用いました。
qiita.com

設定を完了したら[Generate Font Atlas]を実行し、フォントアセットを作成します。
f:id:bluebirdofoz:20200302094544j:plain

最後に[Save as..]でフォントアセットを保存すれば、作成完了です。
f:id:bluebirdofoz:20200302094553j:plain

FontAssetを利用する

作成したフォントアセットを TextMeshPro コンポーネントの[FontAsset]に設定します。
これで TextMeshPro で日本語が利用できるようになりました。
f:id:bluebirdofoz:20200302094603j:plain

参考ページ

qiita.com
qiita.com
qiita.com