2020年1月20日月曜日

【第39回】東ゲ部もくもく会に参加

お疲れ様です。ZuQ9->Nnです。



 2020/01/19(日)に

【第39回】東ゲ部もくもく会が開催されたので参加しました。

【第39回】東ゲ部もくもく会

関東ゲーム制作部こと、東ゲ部 のもくもく会です。 毎月第2日曜日に開催(を予定)しています。 各々ゲーム関係のやりたいこと、作業を持ち込み、ひたすらもくもくする会となっております。 職種、ツール、ジャンルは問いません。 アナログ、デジタルも問いません。 書籍を持ち込んで学習するもよし、ゲーム作りの作業をするもよし、アセットの作成をするもよし。 ゲームに関する作業であれば、なんでもOKです。 ...
場所は、茅場町のコワーキングスペース茅場町 Co-Edo
特に僕は、ガチでゲーム開発をしているわけではないんですが、
実は、かなり前から、タイミングが合えば参加していました。

基本的には、ゲームそのものでなくても、ゲームに関連するツールや
またデジタルゲームではなく、アナログのボードゲーム等の開発関連?なら
特におとがめなしで参加できるようです。。
僕は本当に、いつも、あんまりゲーム関連の作業してなくてすんません。って感じです。

僕は、毎回、そん時に気になった作業をしてたので
実際、まったくゲームに関係なくても、きちんとモクモク作業をしていたり
よほど行動が怪しくない限りは参加可能なようです。。

今回は、HoloLens 2 Hack Dayのイベントで作成したピザアプリを
もう少し改良していました。ただ、HoloLens 2は現状、所有してなかったので
折角つくっても実機で動かせないとテンションがさがるので
Oculus Questのハンドトラッキングで動く、簡単なゲームのようなものを作成しました。

実機まで動く形になったのがこちら。

内容は、Fruit Ninja VR のように
飛んでくるオブジェクトを切る感じです。

結局、ゲームのクリアとゲームオーバーを決めきれず
悩んでいるうちに制限時間終了。。

実際に実機で動かして自分で遊んでみたのですが、
まず、掴んだピザがすぐに外れてしまい、
とても操作できたもんじゃないですね。。

ここらへん実機でないと確かめられないので大変だなと。

本当に、個人でゲーム系のアプリを普段から作成され
展示会なんかで発表される方々には尊敬しかできません。

最後に、各自の進捗発表があるのですが、そこで主催の@Usuiさんに
ピザアプリちょっとやってみたいかも。。
と言われたのがちょっと嬉しかったので、
なんとか遊べる形までにはしたいです。。
来週別のモクモク会があるので、そこで続きをやりたい。



2020年1月18日土曜日

HoloLens 2 HackDay2020 in Tokyo に参加

お疲れ様です。ZuQ9->Nnです。

 2020/01/17(金)HoloLens 2 HackDay2020 in Tokyo に参加してきました。

HoloLens 2 HackDay2020 in Tokyo (2020/01/17 13:00〜)

HoloLens 2アプリを開発したいけど実機が無い・・・ そんなお悩みを抱える方にむけた HoloLens 2実機を使える開発者向けハックイベント です HoloLens 2が手元に届くのを待てない技術者の方はぜひこの機会に実機を触ってガンガン進捗上げちゃいましょう!! HoloLens 2の開発に欠かせないMRTK v2については下記をご覧ください! MRTK v2 の概要 事前にこちらのチュートリアルも確認しておくと吉です! チュートリアルとサンプルアプリ HoloLens 2 のチュートリアル ・HoloLens 2は参加者全員分の台数を準備できません。参加者同士譲り合ってご使用ください。 ・開発用PCの貸し出しはありません。 ・事前に開発を進めておき、当日ビルド&デプロイと不備修正などを行うことをお勧めいたします。 ・開発者向けのイベントです。事前アンケートに過去の開発物がわかるページへのリンクをご記入頂ける方を優先致します。 ・イベント中に取材が入る可能性があります。またイベントスタッフによる写真やビデオ撮影等を予定しております。撮影されました内容は後日主催者や会場提供者によるイベントの開催レポート等に使わせていただくことがありますので予めご了承ください。 ・当日の成果を是非とも当日夜の「HoloLensミートアップ Tokyo Vol.19」で発表してください! イベント名:HoloLens 2 HackDay2019 in Tokyo 日程:1月17日(金) 時間:12:30 受付開始 13:00~18:00  会場:日本マイクロソフト株式会社(品川) 31F セミナールームBCD 費用:無料 協力: 日本マイクロソフト Youtubeチャンネル: TMCN 私たちのコミュニティは、性別、性的自認、外形的な性別、年齢、性的指向、障害、身体的特徴、身体のサイズ、 人種、民族、宗教(あるいは無宗教)、技術の選択、を理由としたハラスメントの無い状態を維持すべく行動します。 私たちは、コミュニティメンバーに対する、いかなる種類のハラスメントも容認しません。 性的な表現や画像は、トーク、ワークショップ、パーティ、Twitterその他のオンラインメディアを含め、いかなるコミュニティイベントでも、不適切なものとします。 これらの規則を破った参加者は、オーガナイザーの決定のもと、制裁を受けるか、当該イベントおよび将来のあらゆるイベントあるいはコミュニティから、 払い戻し(もしある場合でも)無しで参加を拒絶されることがあります。 詳細は下記をご確認ください。 HoloLensミートアップ行動規範 https://holomagicianspolicy2019.azurewebsites.net/ 私たちのコミュニティは、ScalaMatsuri 2016にて上映された本動画に賛同いたします。 https://youtu.be/lIfOQNTWdxI
このイベントは、HoloLens 2の実機を操作するだけでなく、
自分が開発したアプリを実機にインストールして試せる。
またとない機会だと思い。平日の昼からのイベントでしたが
参加登録を行いました。とてもラッキーなことに、抽選にあたりチャンスをものにできました。

折角ですし、次のチャンスがいつくるのかわからない。
更に、落選した人もいるので、せめて、準備を十分にして参加しようと思い。
Visual Studio 2019の出力まで終えて参加に臨みました。

しかしながら、前半、USBのドライバを入れ忘れていて
正しくは、Visual StudioのUSDデバイス接続の設定でした。 m(-_-)m スマヌ

認識してくれなかったです。幸いスタッフの@torikasyu(とりかしゅ)さんに助けられ
こちらは、即解決となりました。

しかし、その後もUnityのバージョンなのか?はたまたVisual Studioが原因なのか
デプロイまで出来るがアプリが起動直後に落ちる等、うまくいきませんでした。
実機が5人に一台と少なく、しかもビルド、デプロイに時間がかかるため
あまり一人で占有しきれないので、待ちの時間が多くできてしまいました。

詳しい原因はよくわからないんですが。
Visual Studioで実機にインストールするときARMではなく、
ARM64だと アプリが落ちることがなく利用できるようになりました。

そして、ようやくうまく動いたのがこちら。
たまに、界隈の懇親会で利用されているネタ。
実は、すでに、Oculus Questがハンドトラッキング が対応され
ホロラボの@tarukosu(たるこす)さんが、MRTKv2で利用できるようにしてくれたので
その時にノリで作ってました。

その後、少し心の余裕ができ、まだ時間があるので、 前からやってみたかった、指から光線の出るアプリにとりかかりました。 かなり実装は雑で、なんちゃって感パナイのですが。 あまりなりふり構まっておられなかったので、とりあえずデプロイし、動かしたのがこちら。
その後、ピザアプリをもうちょっと遊べるようにとアセット等を入れて
改良して、ビルド、デプロイを行ったのですが、
ここでも、やはり、実機で実行時に落ちるようになってしまったり。

兎に角、もったいない時間も多かったと自分なりに反省です。
イベント中に、いろいろ聞きまくってたのに嫌な顔をせず、
むしろ、とても分かりやすく返答をいただいた@arcsin16(だん)さんにも
とても感謝しています。

そして何よりこのイベントを開催し、運営してくれた
コミュニティやスタッフさんにもお礼を申し上げます。
本当にありがとうございました。そしてお疲れ様でした。

ゆくゆくはこのチャンスをもらえたお返しに 少しでも良いアプリを作ること
アプリのクォリティーを高めることが重要かなと感じています。


2019年12月21日土曜日

[HoloLens Advent Calendar 2019] 21日目 MRTKv2のClippingをやってみた

お疲れ様です。ZuQ9->Nnです。
この記事は、HoloLens Advent Calendar 2019、21日目
2019/12/21 の内容です。

当初、azure remote renderingを試そうと思ったのですが、日本からではまだ利用できないようでした。
(認識あってます??、間違ってたら指摘お願いいたします。日本以外でも未だなのかも。。)
折角、枠をとったので、何か投稿しようと思い。色々見ていました。
やはり、Clippingの表現がとても映えて面白いと思ったので試してみました。
Clippingを利用するとオブジェクトをくり抜いて、中身を見るといったMRならではの表現が簡単に可能になります。
既に、何人か記事も出していますので、そちらも参考にお願いします。

2019-11-05から1日間の記事一覧 - デコシノニッキ

ホロレンジャーの戦いの記録

MixedRealityToolKit v2 Examplesを触ってみる ClippingExamples - 夜風のMixedReality

MixedRealityToolKit(以下MRTK)にはExamplesというデモサンプル集が含まれています。  Examplesを理解すればMRTKの機能の使い方を学習することや ノンコーディングでの アプリ開発 が可能になります。  今回は UX/StandardShader/ClippingExamplesを見ていきます。 HoloLens ClippingExample ...
今回の環境は、Unity 2019.2.12f1
Microsoft Mixed Reality Toolkit v2.1.0(Microsoft.MixedReality.Toolkit.Unity.Foundation.2.1.0.unitypackage) を利用しました。

プロジェクトの作成、 Microsoft.MixedReality.Toolkit.Unity.Foundation.2.1.0.unitypackageのインポート
UnityのMixed Relaity ToolkitメニューからAdd to Scene and Configureを選択する等はいつも通り
わからない方は、以前の記事を参考にしてください。
MixedRealityToolkit > StandardShaderに
ClippingBox.cs、ClippingPlane.cs、ClippingSphere.csが存在します。
そちらがClippingの処理を行うスクリプトで、形状の違いはありますが、使い方は一緒です。
今回はCubeにClippingPlaneを行う手順を示します。
まずは、HierarchyのCreate > 3D Object > CubeでCubeを作成

次にClipping用のマテリアルを作成します。
Pro

ProjectのCreate > Materialを選択、Materialの名前は何でも大丈夫ですが
今回はClippingMaterialとしました。


ClippingMaterialを選択、InspectorのShaderのドロップダウン押し
Mixed Reality Toolkit

さらにStandardを選択

InspectorがMixedRealityToolkit/Standardに切り替わったら
Clipping BorderのチェックをONにします。

ProjectrのClippingMaterialをHierarchyのCreateにドラッグ&ドロップでアタッチ
CubeのInspectorでClippingMaterialがアッタッチされたことを確認してください。

Cubeを右クリック、メニューからCreate Empetyを選択、Cubeの子供にします。

Empetyのオブジェクトの名前を変更します。特に何でも良いのですが、今回はClippingPlaneとしました。

ClippingPlaneのがInspectorのAdd Componentで、Clipping Planeのスクリプトをアタッチ

InspectorのClipping PlaneスクリプトRenderersのsizeに1を入力

HierarchyのCubeをClipping PlaneスクリプトのInspector > Renderers
Element 0 にドラッグ&ドロップでアタッチメント

そうすると、この時点で、SceneとGameのCubeの下半分が消えて見えなくなっています。
SceneでClipping PlaneオブジェクトのY座標を変更すると、Cubeが消えたり、現れたりします。こんな感じになります。

Exampleでは、すでに専用のMaterialが作成されていたり、
Animationを利用して自動でClipping Planeオブジェクトの座標を変更して
カッコイイ表現を行っていますので、是非、そちらを見てください。

おまけ。。

まぁ、やっちゃいますよね。こんなこと。。
あんたも好きねぇ。。

2019年12月17日火曜日

[HoloLens Advent Calendar 2019] 17日目 HoloLen 2で床、壁、天井にPlaneのオブジェクトを作成する Scene understanding SDK のUnity Sampleを実行してみた。

お疲れ様です。ZuQ9->Nnです。
この記事は、HoloLens Advent Calendar 2019、17日目
2019/12/17 の内容です。

HoloToolkit-Unity時代、SurfaceMeshesToPlanes.csという
床、壁、天井にPlaneのオブジェクトを作成するScriptが存在しました。
SurfaceMeshesToPlanes.csについて詳しくは下記の記事が参考になるとおもいます。

壁とか天井とか床とか欲しいな 〜 空間認識 - ウラデブ

ども、ウラさんです。HoloLensなんだから壁や床を利用したいよね?って事で、空間認識ってか部屋認識をやってみましょ。 前回と同じでHoloToolkitを使って空間メッシュが表示されるまで作ります。んで、空のゲームオブジェクトを追加。 自前の スクリプトとして「MakePlanes.cs」を作成&アタッチ。 HoloToolkitから「SurfaceMeshesToPlanes.cs」「RemoveSurfaceVertices.cs」をアタッチ。 んで、MakePlanes.csを編集。 sing System.Collections; using System.Collections.Generic; using UnityEngine; using HoloToolkit.Unity.SpatialMapping; using HoloToolkit.Unity.InputModule; public class MakePlanes : MonoBehaviour, IInputClickHandler { void Start () { InputManager.Instance.PushFallbackInputHandler(gameObject); SurfaceMeshesToPlanes.Instance.MakePlanesComplete += SurfaceMeshesToPlanes_MakePlanesComplete; } void Update () { } public void OnInputClicked(InputClickedEventData eventData) { SpatialMappingManager.Instance.StopObserver(); SurfaceMeshesToPlanes.Instance.MakePlanes(); } private void SurfaceMeshesToPlanes_MakePlanesComplete(object source, System.EventArgs args) { RemoveSurfaceVertices.Instance.RemoveSurfaceVerticesWithinBounds(SurfaceMeshesToPlanes.Instance.

目指せ脱HoloLens初心者!その2(SpatialProcessing)

https://torikasyu.com/?p=927 の続きです。 さて、次は別のサンプルを使ってSpatialMappingを更に調べてみます。 HoloToolkit-UnityのHoloToolkit-Testにある、SpatialProcessingシーンを実行してみます。 (HoloToolkit-1.5.7で試していますので、バージョンが違うと多少違うかもしれません) ...
個人的には、あの機能が好きで、Mixed Realty Tookit Unity v2 ではどうやるんだろうと探していました。
MRTKv2には、SpatialAwarenessSurfaceTypes.csというScriptで
enumの定義で、Floor、Ceiling、Wall、Platformの定義が行われている他、

Enum SpatialAwarenessSurfaceTypes

null
SpatialAwarenessPlanarObject.csのCreateSpatialObjectメソッドというのが存在し、
なんだか出来そうな感じでした。

Class SpatialAwarenessPlanarObject

Inheritance Assembly: cs.temp.dll.dll Syntax public class SpatialAwarenessPlanarObject : BaseSpatialAwarenessObject, IMixedRealitySpatialAwarenessObject SpatialAwarenessPlanarObject() Declaration public SpatialAwarenessPlanarObject() Collider Declaration public BoxCollider Collider { get; set; } Property Value CreateSpatialObject(Vector3, Int32, String, Int32) Declaration public static SpatialAwarenessPlanarObject CreateSpatialObject(Vector3 size, int layer, string name, int planeId) Parameters Returns
残念ながらサンプルが見つけられず、どう使うのかはわからずじまい。
しかし、色々と検索しているうちに、Scene understanding SDKというものが別に存在していることを知りました。

MicrosoftDocs/mixed-reality

The goal of Scene understanding is to transform the un-structured environment sensor data that your Mixed Reality device captures and to convert it into a powerful but abstracted representation that is intuitive and easy to develop for. The SDK acts as the communication layer between your application and the Scene Understanding runtime.
というか、MicrosoftDocs/mixed-realityというリポジトリの存在そのものも、今回初めて知りました。。orz..。

Scene understanding SDKは、どうやら、HoloToolkit-Unity時代のSpatial Understandingと呼ばれた機能のHoloLens 2版のようです。

UnityでのSampleがまた、別のGithubのリポジトリに存在しましたので、
今回は、そちらを確認しました。

sceneunderstanding-microsoft/unitysample

A Unity-based sample application that showcases Scene Understanding on HoloLens 2. When this sample is deployed on a HoloLens, it will show the virtual representation of your real environment. When this sample is deployed on a PC, it will load a serialized scene (included under Resources\SerializedScenesForPCPath) and display it.
Githubに色々注意書きがあるのですが、Unity 2018.4.12以上が必要になる他
Windows SDK version 10.0.18362.0以上も必要です。
また、これは、Mixed Realty Tookit Unity v2 とは全く関係無く。
実機では、HoloLens 2のみで旧型のHoloLensでは動作しないようです。
UnityのSampleはPCでも確認できるようになっていたため、
今回はPCのUnity Editorで確認を行いました

GitHubからプロジェクトをCloneかダウンロードしてプロジェクトを開きます。
Unityで確認する場合は Asset > SceneのSceneUnderstandingSampleを開き
HierarchyからSceneUnderstandingManagerを選択
InspectorのSceneUnderstandingDataProvider > Run On Deviceのチェックを外して実行します。

Unityで実行ボタンを押すと、こんな感じで壁や天井、床といったオブジェクトがせいせいされた部屋のようなものが表示されます。

しつこいようですが、
Mixed Realty Tookit Unity v2 とは全く関係無いため、Mixed Realty Tookit Unity v2 のパッケージインポートをする必要すらありません。
独立した全く別の一つの機能としてとらえた方がよさそうです。

少し、中身を確認したところ
SceneUnderstandingDataProvider.cs、SceneUnderstandingDisplayManager.cs、
SceneUnderstandingUtils.csというScriptが利用されています。
こちらは、Microsoft.MixedReality.SceneUnderstanding.Samples.Unityという
namespace のため、SceneUnderstandingそのもののコードではなく
あくまで、サンプルのために作成されたScriptです。

SceneUnderstandingそのものは、UnityではAsset > Packages > Microsoft.MixedReality.SceneUnderstanding.0.5.2042-rc > Unityの中に
CPU毎のフォルダにMicrosoft.MixedReality.SceneUnderstanding.dllが入っています。
dllなのでコードの中身は見ることができませんでした。

SceneUnderstandingDataProvider.cs、Start()メソッドの中で
var access = await SceneUnderstanding.SceneObserver.RequestAccessAsync();
が呼び出されています。実機ではこちらで、実際の部屋を読み取り、
床、壁、天井にPlaneのオブジェクトを作成するようです。

PCだと、SceneUnderstandingDataProvider.csの SUSerializedScenePath プロパティに
指定されているbyteデータを読み込んで表示しています。

GitHubのサンプルでは、Asset > Resources > SerializedScenesForPCPath > SU_Kitchen.bytes
が利用されています。

いかがだったでしょうか?

開発者は、Mixed Realty Tookit Unity v2のリポジトリだけではなく、MicrosoftDocs/mixed-realityのリポジトリのチェックも必要そうです。

あと、やはり、Microsoftの開発ドキュメントはよく読みましょう。。 僕は、今回、何度も、見落としておりましたので。。orz..

2019年12月16日月曜日

[HoloLens Advent Calendar 2019] 16日目 Mixed Realty Tookit Unity v2 HandConstraint.csのOnHandActivateの呼び出しタイミングについて

お疲れ様です。ZuQ9->Nnです。
この記事は、HoloLens Advent Calendar 2019、16日目 2019/12/16 の内容です。
 Mixed Realty Tookit Unity v2(以下MRTKv2)に
ハンドトラッキングを扱うHandConstraint.csというスクリプトがあります。

Class HandConstraint

Provides a solver that constrains the target to a region safe for hand constrained interactive content. This solver is intended to work with IMixedRealityHand but also works with IMixedRealityController. public class HandConstraint : Solver protected HandBounds handBounds protected IMixedRealityController trackedController When a hand is activated for tracking, should the cursor(s) be disabled on that hand?

HandConstraint.csは、Provides a solver that constrains the target to a region safe for hand constrained interactive content.
つまり、手の領域にあるオブジェクトに対して制約をつけて、手が見えたり隠れたりするときにイベントを実行するScriptです。
HandConstraint.csにはOnFirstHandDetected、OnHandActivate、OnHandDeactivate、 OnHandDeactivateというイベントが定義されています。

OnFirstHandDetectedは、Event which is triggered when zero hands to one hand is tracked.
日本語に直すとゼロ本の手の片手がトラッキングされたときにトリガーとなるイベント

OnHandActivateは、Event which is triggered when a hand begins being tracked.
手がトラッキング開始されたときにトリガーとなるイベント

OnHandDeactivateは、Event which is triggered when a hand stops being tracked. 手がトラッキング終了されたときにトリガーとなるイベント

OnLastHandLostは、Event which is triggered when all hands are lost. すべての手がトラッキングが失われたきにトリガーとなるイベント

となっています。ふと、OnFirstHandDetectedとOnHandActivateのタイミングってどう違うのだろう?そんな純粋な気持ちで調べたら。。。
なんだか思っていた結果と違ったので、

自分のメモ用にまとめておきます。 プロジェクトの作成、
Microsoft.MixedReality.Toolkit.Unity.Foundation.2.1.0.unitypackageのインポート
UnityのMixed Relaity ToolkitメニューからAdd to Scene and Configureを選択する等はいつも通り行ってください。
わからない方は、以前の記事を参考にしてください。

HierarchyのCreate > 3D Object > 3D Textを作成

これはデバックの文字列を画面に表示させるためのテキストです。
画面で確認できるように3D TextのTransFormや設定を行ってください。
僕は今回、Transform x:0, y:0, z:20 、Textは空に
Text MeshのAnchor Middle Center、Aligiment Center、Font Size 50としました。

HierarchyのCreate > Create Emptyで空のオブジェクトを作成

特に名前は何でもいいのですが、今回は、HandConstraintTestとしました。

HierarchyのHandConstraintTestを選択、
InspectorからAdd CompnentでHandConstraintを選択してアタッチ

更に、Add CompnentのNew ScriptでScriptを追加

Script名は何でも良いのですが、 今回は HandConstraintTest.csとしました。

中身は、こんな感じ HierarchyのNew TextをHandConstraintTest(Script)のTextにアタッチ


HandConstraintの各イベントにHandConstraintTestのメソッドを対応させます。
OnHandActivate : AfterHandActivate
OnHandDeactivate : AfterHandDeactivate
OnFirstHandDetected: AfterFirstHandDetected
OnLastHandLost: AfterHandLost

これでUnityを実行すると、このような感じになりました。

動画では、少しわかりにくいので、スクリーンショットでも解説します。
Unityを実行した直後は、OnLastHandLost、OnHandDeactivateが実行されます。

次に手を表示したときには、OnFirstHandDetectedのみ実行されます。

つまり、このタイミングでは、OnHandActivateは実行されません
手を非表示にしたときは、OnLastHandLostが呼び出されます。

では、いつ、OnHandActivateが呼び出されるのでしょうか?
結論から言うと、Unityの設定を変更しなければ、OnHandActivateは呼び出されません。

HandConstraint.csをアタッチすると、
Solver Handler.csもアタッチされています。

Class SolverHandler

This class handles the solver components that are attached to this GameObject public class SolverHandler : MonoBehaviour protected Handedness currentTrackedHandedness protected Handedness preferredTrackedHandedness protected readonly List solvers Add an additional offset of the tracked object to base the solver on. Useful for tracking something like a halo position above your head or off the side of a controller.
Solver Handler.csは、GameObjectにアタッチして、オブジェクトの位置と方向を計算するコンポーネントを提供します。
HierarchyからHandConstraintTestを選択、
InspectorでSolver HandlerのTracked Target Typeを確認してください。
最初の設定は、Headになっています。
つまり、頭に追随する設定なのです。

Solver HandlerのTracked Target Typeのドロップダウンから
Hand Jointを選択し。 手に追随する設定に変更します。


もう一度、Unityを実行するとこのような感じになります。

今回は、手を表示した時点で、
OnFirstHandDetected、OnHandActivateの二つのイベントが実行されました。


InspectorでSolver HandlerのTracked HandnessをBothからRightやLeftにすると
右手が表示されたときのみ、左手が表示されたときのみといった制御を行うことができます。

Solver HandlerのTracked Hand JointをPalm以外にも変更してみましたが、
OnFirstHandDetected、OnHandActivateの二つのイベントが実行されました。
しかし、これはUnity Editorで実行しているからかもしれませんね。

もしかしたら実機で、Tracked Hand JointをThumbTipにした場合、
親指を隠した状態で手を表示し、親指を立てたときのみ
OnHandActivateが実行される可能性があるのでは?
と思ったのですが、Noneにしてもイベントが実行されました。
なので、おそらく、Tracked Hand Jointは、OnHandActivateの実行タイミングとは関係ないと考えています。
Tracked Hand Jointは、オブジェクトをトラッキングするときの位置のみに利用するのでしょう。

しかし、これだけではありません、OnHandActivateイベントは、
HandConstraintPalmUp.csをアタッチした場合では、また別のタイミングで実行されるのです。

一度、InspectorのHandConstraintの歯車アイコンをクリックし、
Remove ComponentでHandConstraintをRemoveします。

InspectorのAdd ComponentからHandConstraintPalmUpを選択しアタッチします。

HandConstraintPalmUpの各イベントにHandConstraintTestのメソッドを対応させます。
OnHandActivate : AfterHandActivate
OnHandDeactivate : AfterHandDeactivate
OnFirstHandDetected: AfterFirstHandDetected
OnLastHandLost: AfterHandLost

Unityを実行するとこのような感じになります。

こちらもスクリーンショットで開設します。まず、手を表示したときは、
OnFirstHandDetectedのみ実行されます。

そして手を回転させて、手のひらが表示されたタイミングで
OnHandActivateが実行されます。

Solver HandlerのTracked Hand JointをPalm以外にも変更してみましたが、
Unityでは同じタイミングでイベントが実行されました。

Tracked Target TypeをHead、頭に戻して確認したところ
手のひらが表示されたタイミングでは、OnHandActivateが実行され無い結果となりました。

実機でどのように動くか、確認したい。。欲求が高まりましたが、
おそらく、イベントの実行タイミングはUnity Editorの時と変わらないと考えるのが妥当です。

とりあえずUnity上で確認した動きを表にしてまとめました。

Solver Handler
Tracked Target Type
手を表示した時の
イベント
手のひらを
表示したときのイベント
HandConstraint Head OnFirstHandDetected -

Hand Joint OnFirstHandDetected
OnHandActivate
-
HandConstraintPalmUp Head OnFirstHandDetected -

Hand Joint OnFirstHandDetected OnHandActivate

ちょっと自信が無いので、間違いがあったらご指摘ください。。
よろしくお願いいたします。

2019年12月15日日曜日

[HoloLens Advent Calendar 2019] 15日目 Mixed Realty Tookit Unity v2 Hand Trackingで、柔らかい仮想オブジェクトに触ってみる

お疲れ様です。ZuQ9->Nnです。
この記事は、HoloLens Advent Calendar 2019、15日目
2019/12/15 の内容です。

今回は、ネタ記事です。技術的にもアセットを使っているので
あまりたいした内容ではありません。そして少しセンシティブな内容が含まれるので
不愉快に思われる方は、記事を閉じてください。

個人的にHoloLens 2の新しい機能で、一番気になるのがハンドトラッキングです。
ハンドトラッキングで、今回は柔らかい仮想オブジェクトに触ってみましょう。。

今回の環境は、Unity 2019.2.12f1
Microsoft Mixed Reality Toolkit v2.1.0(Microsoft.MixedReality.Toolkit.Unity.Foundation.2.1.0.unitypackage) を利用しました。

まずは、適当な名前でUnityでプロジェクトを作成(僕はTestとしました。)
Microsoft.MixedReality.Toolkit.Unity.Foundation.2.1.0.unitypackageをUnityにインポートします。

Apply Mixed Reality Toolkit Default Settings?
のダイアログが表示されますので、Applyを押します。

Unityのメニューに、Mixed Relaity Toolkitが表示されますので、
そこから。Add to Scene and Configureを選びます。



Select MixedRealityToolkitConfigurationProfileのダイアログが表示されます。
こちらは、開発環境に合わせて選択しますが、今回は、とりあえず、
DefaultMixedRealityToolkitConfigurationProfileを選択します


Hierarchyに、MixedRealityTookitとMixedRealityPlayspaceが自動追加されます


今回は、こちらのサイトに公開されているアセットを利用します。

Mesh Deformation, a Unity C# Tutorial

Making a Stress Ball Cast rays at objects and draw a debug lines. Convert forces to velocities for vertices. Maintain shape with springs and dampening. Compensate for object transformation. We start with a scene that has a single cube sphere object at its center.
サイトの一番下に、unitypackageのリンクがありますので、そちらをクリックしてダウンロード

dealing-with-transformations.unitypackageがダウンロードされますのでUnityにインポートを行います。

HierarchyからCreate > 3DObject > Sphereを選択
Sphereを見える位置に配置します。(僕は x : 0, y : 0, z:2に配置しました)

HierarchyのSphereを選択、Inspectorを表示し、
Add ComponentからMesh Defomerを選択アタッチします。
続いて、SphereのInspectorをから、 Add ComponentでPointer Handlerを選択アタッチします。


続いて、SphereのInspectorをから、 Add ComponentでNew Scriptを選択スクリプトを追加。
スクリプト名は、特に何でもいいのですが、今回はSphereBounceとしました。

SphereBounceのコードはこんな感じになります。
SphereのInspectorをからPointer Handlerの
On Pointer Draggedの + ボタンを押し

HierarchyからShpereをInspectorのPointer Handler、
On Pointer Draggedにドラッグしてアタッチします。

SphereのInspector、Pointer Handler、 On Pointer Draggedから
No Founctionのドロップダウンを開いて。
SphereBounse > Boundを選択します。

Unity Editorを実行し、Shiftボタンを押しながら指を表示
クリックしながら動かすとこんな感じで動きます。

ちょっと、パラメータを調整してみたんですが
残念ながら、あんまり思った感じのプルプル感は得られませんでした。。 orz..

この辺りは、別のアセットを検討したほうがいいかもしれませんね。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
HoloLens 2のタッチに対応させてみる。
上記は現状のHoloLensの実機のAir Tapでも動くように
Pointer Handlerを利用しました。

 HoloLens 2ではハンドトラッキングのタッチも検出できます。
一応、そちらでも動くように対応させてみたいと思います。
なので、その対応が不要な人は読み飛ばしてください。

SphereのInspectorのAdd Componentで
Near Interaction Touchable Volumeをアタッチします。
つづいて、SphereのInspectorのAdd Componentで
Touch Handlerをアタッチします。

SphereのInspector、Touch HandlerのOn Touch Updatedの + ボタンをクリック

HierarchyからShpereを Inspector、
Touch HandlerのOn Touch Updatedにドラッグしてアタッチします。

SphereBounceのコードに、タッチで反応したときの動作のメソッドBoundTouchを追記します。
SphereBounceのコードは、こんな感じになります。
SphereのInspector、
Touch HandlerのOn Touch Updatedから No Founctionのドロップダウンを開いて。 SphereBounse > BoundTouchを選択します。
設定は以上でおわりです。Unity Editorを実行
Shiftボタンを押しながら指を表示、今度は、クリックせずそのまま、Shpereに近づけます。
こんな感じで動きます。
 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
流石に、これだけだと、あまりにネタすぎるのでソースコードの解説を行います。

1) Shpereを揺らしているMeshDeformer.csについて。
Unity C# TutorialsのサイトMesh Deformation にも実装が記述されていますが、
MeshFilterを取得して、ポリゴンそのものを変形させることによって、凹んだ表現をおこなっています。

2) クリック動作を扱うPointerHandler.csについて。
こちらは、MixedRealityToolkit-Unityで提供されています。
MonoBehaviourを継承しているため、Inspectorからセットできるようになっています。
IMixedRealityPointerHandlerがイベントを扱います。
OnPointerDown(MixedRealityPointerEventData eventData);  // クリックポインターを下げたとき
OnPointerDragged(MixedRealityPointerEventData eventData);  // ドラッグされたとき
OnPointerUp(MixedRealityPointerEventData eventData); // クリックポインターを挙げたとき
OnPointerClicked(MixedRealityPointerEventData eventData); // クリックが押されたとき このイベントがUnityのInspectorからセットできるようになっています。

3) タッチ可能にする NearInteractionTouchableVolume.cs
こちらも、MixedRealityToolkit-Unityで提供されています。
実は、よく似た名前の NearInteractionTouchable.csと言うスクリプトも存在します。
NearInteractionTouchable.csでは、Shpere Colliderには反応しませんでした。(SetTouchableColliderメソッドの引数がBoxColliderになっているから??)
間違えないようにNearInteractionTouchableVolume.csをアタッチしてください。
4) タッチ動作を扱う TouchHandler.cs
こちらも、MixedRealityToolkit-Unityで提供されています。
こちらもMonoBehaviourを継承しているため、Inspectorからセットできるようになっています。
IMixedRealityTouchHandlerがイベントを扱い
OnTouchStarted(HandTrackingInputEventData eventData);  // タッチ開始
OnTouchUpdated(HandTrackingInputEventData eventData);  // タッチで移動中
OnTouchCompleted(HandTrackingInputEventData eventData);  // タッチ終了
こちらのイベントもUnityのInspectorからセットできるようになっています。
上記の NearInteractionTouchableVolume.csをアタッチしていないと、検出されませんでした。
5) 自作した SphereBounse.cs
Bound(MixedRealityPointerEventData eventData)
クリックで反応するメソッド、今回は、クリックされている間はずっと反応させたかったので
OnPointerDraggedの時に呼び出しました。
ポイントは引数のMixedRealityPointerEventData で、
IMixedRealityPointerHandlerのOnPointerDragged(MixedRealityPointerEventData eventData);の 引数をそのまま渡すことができます。
eventData.Pointer.BaseCursor.Positionでカーソルの場所がVector3で取得できます。
BoundTouch(HandTrackingInputEventData eventData)
タッチで反応するメソッド、今回は、タッチされている間はずっと反応させたかったので
OnTouchUpdatedの時に呼び出しました。
IMixedRealityTouchHandlerのOnTouchUpdated(HandTrackingInputEventData eventData);の 引数をそのまま渡すことができます。

もちろん、自作のメソッドでIMixedRealityPointerHandler、IMixedRealityTouchHandlerをそれぞれ実装することも可能なのですが
実装したいイベントの後に、どのような処理をしたいか?に集中したほうがコードは短くなりますので、今回はこの実装をおこないました。

これ系のネタは、ほかの人もやっているんじゃないかと捜したところ
QiitaではUnityで3記事みつかりました。 。。。
ってか。もろ、タグが切られていてたww。

Clothで実装しているのが2記事

UnityのClothを使っておっぱいを作る - Qiita

Unityでゲームの制作をしているのですがキャラクターモデルのおっぱいを揺らしたいという話になりました。 胸にボーンがなく諸事情により増やすことも難しかったのでどうしたもんかなと思っていたところ UnityのCloth(布のシミュレーション)を使えば擬似的におっぱいを作れそうだなと思ったのでやって見ることにしました。 最終的にはこんな感じになりました まず今回使用する 被害者モデルがこちら ...

【Unity】おっぱいを揺らして触る技術【VR】 - Qiita

どうも、趣味でVRゲームを作ってるおっぱい大好きエンジニアです。 その製作中におっぱいの動きで悩んだところがありました。 他のおっぱい大好きなゲームエンジニアのためにも、 どのようにおっぱいの実装をしたのか残そうというコンセプトです。 「おっぱい」ってタグあるのね 結果として次のような動きができるようになりました。 揺れるおっぱい上げときますね ...
Rigitody、Spring Jointで実装しているのが1記事

Unityでおっぱいを揺らす - Qiita

これはマイネットエンターテイメント Advent Calendar 7日目の記事です。 ふと揺れるおっぱいが見たい気持ちになったのですが、MayaやLive2Dを買うお金がないので気合いで作りました。 Unity (4.x or 5.x 無料版でおk) おっぱい素材 Rigitbodyコンポーネントだけのオブジェクト。 停止してほしいので、RigitodyのUse Gravityはオフ、Constraintsは全部チェックつける。 Spring Jointコンポーネントを追加し、Connected Bodyに「1つめ」のオブジェクトを指定。それ以外の値は適当です。 RigitbodyのMassを小さめにしています。 基本的に2つめのSpring Jointと同じです。 Connected Bodyに「2つめ」のオブジェクトを指定。 RigitbodyのMassを調整していい感じにばいんばいんするようにする(*´Д`) コツとしては、 Springを大きめにすると激しくなって楽しい Damperを0にしないと停止してしまう Max Distanceは小さすぎず、大きすぎず・・・ Mathでばいんばいん具合を調整 こんな感じになれば、ほら、楽しそうな予感が( ˆωˆ) Mesh Rendererは確認用なので、あってもなくてもおkです。 犠牲者 インポート設定は特に不要です。 空気を読んでそれっぽいものを作成 インポート設定でTexture Type「Normal map」 Create from Grayscaleにチェックをつけるといい感じにノーマルマップを作成できます。 マスクはアルファチャンネルを使用するので、Photoshopで↓こんな感じになっていないとダメです。(RGBチャンネルは使用しないので無しでおk) インポート設定は特に不要です。 マスクのアルファチャンネルを使ってテクスチャーを動かします。 ノーマルマップは設定しなくても大丈夫ですが設定したほうが影ができて興奮できます。 Shader "pai" { Properties { _Color ( "Main Color" , Color ) = ( 1 , 1 , 1 , 1 ) _Parallax ( "Height" , Range ( 0 .


あんたも好きねぇ。。


本当はHoloLens 2の実機が届いてたら実機で動かしたかったんですが。
残念ながら実機確認はできていません。ビルドして、 HoloLens 2のエミュレータでは動くのを確認しました。

多分 HoloLens 2実機でも動くと思うよ。。