Hololensを触り始めて1週間

はじめに

この記事はFUN Advent Calendar 2017 6日目の記事です.昨日は tkr1205 さんでした

どうも tenjoufire です.普段はC#を主に利用して研究とか進めてます.某プロジェクトのある方に誘われてAdventに登録しましたが,公開する手段が無いということで過去に作成したサイトを復元するところからやりました.URLからも推測できるように,このサイトはMicrosoftAzure上にあります.投稿から3日ぐらいはApp ServiceのプランをFreeからBasic1にしておくので快適にページがロードできると思います. Freeになりました.(Qiitaとかで書かない理由はこの記事に技術的なことが一切存在しないからです)

内容

  • Hololens触ってみたけどすごいなこれ
  • なんか作りたい

本編

時代はHololens

先日Microsoftから衝撃的な発表がありました.Kinectの生産が終了してしまいました.

日本でも故Kinectを惜しむ様子が確認できました.

このことは,depthセンサーを使った製品はKinectからHololensへとシフトしたとみなしてもよいでしょう.まさにHololensの時代がやってきたのです.そこで早速某研究室の方にHololensを頼んだところ購入していただいたので,触ってみた感想を書きたいと思います.

 

いざ開発

Hololensのサイトには

”HoloLens Developer Edition および Commercial Suite は、消費者契約法第 2 条において消費者にあたらない開発者向けのみの販売となっています。商品とその関連サービスおよびサポートは英語のみでのご提供となっています”

と書かれているようにまだ開発者向けにしか展開されていないようです.また公式のサポートは英語のみですが,公式のチュートリアルがかなり充実していたり,数少ないですが日本の有志の方々が日本語で解説を書いてくださったりしています.

とりあえず公式の指示に従ってツール類を導入しました.Unity2017.1が指定されていますが2017.2でも大丈夫そうでした.筆者の環境は
・Windows10 Pro
・Unity2017.2.0f3 Personal
・Visual Studio 2017 enterprise とUWP系のSDKもろもろ
となっております.CPUやGPUもそれなりのが求められるのでデスクトップでの開発をおすすめします.(筆者はラップトップで開発をしているがNVIDIA GTX1060を搭載しているので問題がないようです)

Unityの設定も公式チュートリアルに従って行いました.1点異なる点としてはEdit -> Project Settings -> Player の Other Settings -> Configuration -> Scripting Runtime Version を .NET4.6に変更する点が挙げられます.

最近(Unity2017か5.6ぐらいから?)UnityのC#も.NET4.6に対応したということでC#を普段よく書く身からするとぜひとも設定したい項目です.ちなみに以前Unityを利用していたときは.NET3.5までしか対応していませんでした.

とりあえず何を作ったか

デモ動画

<流れ>
Hololens周辺の空間をマッピング

マッピングが完了すると画面を追いかけるCubeが赤から緑色に変化

CubeをFloorの上に持っていきGazeをCubeにあわせてAir-TapをするとUnityちゃんが出現

UnityちゃんをAir-Tapするとアニメーション再生

空間マッピングとAir-Tap等のジェスチャはすべてMRToolKitを利用し極力コーディング量を減らしました.Air-Tapされた時に処理を行うコードを以下に示します.これをAir-Tapを実装したいGameObjectにアタッチするだけでOKなのだからすごい.(もちろんToolKitの該当するprefabを入れる必要がある)

またUnityちゃんのアニメーションは以前利用したものを利用しました.簡単に説明すると,KinectでOptiTrackのようなモーションキャプチャをしようというやつです.ちなみに今回のモーション@takkun1346 さんにお願いしました.


(Unityエディタの様子:ほとんどがprefabだ
ここまでほとんどノーコーディングで実装できるHololensってすごい.書いたコードもクラスの数的には3つと少なめです.一応書いたコードの一部を載せておきます.やっていることは
空間マッピングが完了したかどうかを観察

完了時に外部のトリガーからの呼び出しを受けるとオブジェクト設置
というぐらいのことです.

次に作りたいもの

今回は時間があまりなくほとんどチュートリアルみたいなものしかできなかったが,1月ぐらいまでにはオルガルの撮影モードみたいなものができたらなと思います.例えば様々なポーズをとってもらうとか,あえてローアングルにすると”プレイエリア”外です”と出るようにするとか,女の子をつんつんできるようにするとか,そもそもの女の子の数をふやすとか…

オルガルとは:cyberagentが提供するゲームオルタナティブガールズのこと(この大学でやってる人,筆者含めて2人しか知らない)
撮影モードとは:オルガル内で遊べるモードの1つ(以下の動画参照)

おわりに

Hololensはすごい.Kinectの技術がまさにHololensで生かされているといった印象を受けました.このような技術がスマートフォンのように10年先の当たり前になってくると面白くなってくるなあと感じました.

(個人的にHololensもXamarinと同様に奥が深いというか沼にはまりそうな技術だと感じ筆者は少し危惧しております)

ここまでご覧いただきありがとうございます.

明日は chy_na2 さんの投稿です.

このコンテンツは,ユニティちゃんライセンス条項 のもとに提供されています.

imageLicenseLogo.png

Outgoing WebHooksとFunction Appの連携をした話


(Qiitaからの転載です)

やったこと

SlackのOutgoing WebhooksをAzureのFunction Appを使って実現しようと試みて失敗(?)した.

参考にしたサイト様

http://blog.xin9le.net/entry/2016/04/01/042452
http://qiita.com/chike0905/items/58222a99be460f325ab8

Azureでの操作

  • Function Appを作成する.
  • 新しい関数からテンプレートの選択を開き,GenericWebHook-CSharpを選択する.

quii01.PNG

  • 関数名を適当に決めて,作成ボタンを押す.
  • 自動でテンプレートが生成される.

quii02.PNG

  • 適当に書き換える.(今回はbotを起動させたユーザー名を答えるようにした)
run.csx
    string jsonContent = await req.Content.ReadAsStringAsync();
    dynamic data = JsonConvert.DeserializeObject(jsonContent);

    return req.CreateResponse(HttpStatusCode.OK, new {
        text = $"Hello {data.user_name}!"
    });
  • ログに Compilation succeeded. と出たらエラーなくコンパイルに成功したことになる.
  • コードを書いているエディタの上に関数のURLがあるのでそれをコピーしておく.
  • 左の関数リストにある「統合」をクリックし,HTTP trigger(req)のモードをStandardに変更する.(なぜかWebHookだと動かない)

quii03.PNG

Slackでの操作

Outgoing WebHooksの詳しい使い方はURLを参考にしてほしい.
http://qiita.com/chike0905/items/58222a99be460f325ab8

先ほどコピーした関数のURLを画像のURL(s)へペーストする.
quii04.PNG

いざ運用

Slackでbotを起動させる言葉をポストしてみる.

.
.
.

動かない.

なんで?

Function Appのログを見てみると,

Exception while executing function: Functions.(関数の名前). Newtonsoft.Json: Error parsing boolean value. Path ”, line 1, position 1.

と出力されている.
つまり,Jsonをパースするときにエラーが起こってプログラムが止まったらしい.

そこでデバッグでJsonの内容をログに出力してみた.
するとSlackからのデータ形式が,

quii05.PNG

このデータを&区切りにした形だった.(そらエラーも起こりますわ)

まとめ

SlackからWebHookが飛んでくるというものだったので,てっきりC#のNewtonsoft.jsonでデシリアライズできると思い込んで苦労した.
とりあえずの対応として

  • Slackからの情報を使わないbotにする(つまり,デシリアライズしない)
  • Slackからの情報を&でSplitして強引に運用する

としているが,正直かっこよくないので改善したい.


Kinect v2で簡易モーションキャプチャした話


(Qiitaからの転載です)

やったこと

Kinectv2を使ってモーションキャプチャをし,Unityちゃんを動かすまで.
Unityのアセットストアで公開されている有償アセットを使用します.

使用した環境

  • windows 10 Pro
  • CPU それなりのクアッドコア
  • GPU ありきたりなグラフィックカード
  • Unity 5.5.1
  • Kinect v2 (Kinect SDK v2)

下準備

KinectはPCで認識された状態にする.
(下の画像のような状態だとOK)

qii01.PNG

以下のURLにアクセスしアセットを購入&ダウンロードする.
https://www.assetstore.unity3d.com/jp/#!/content/51090

ダウンロードが終わったら,Unityの3Dプロジェクトにインポートする.
qii02.PNG
(右下のImportを押せばOK)

モーションキャプチャ

インポートが終わるとプロジェクトのアセットフォルダにいくつかファイルが読み込まれる.ここのKinectMocapFbx->MocapFbxAnimatorシーンを選択する.
qii03.PNG

シーンが読み込まれたら,KinectがPCで認識されていることを確認しシーンを再生する.

qii04.PNG

ここでKinectの前に立つと,そのボーン情報が左のアバターに反映される.モーションキャプチャを開始したいときはスペースキーを押す.Kinectの音声認識が使える環境なら「Record」と発言しても開始できるらしい(未検証).

同様に,モーションキャプチャを止める時もスペースキーを押す.

記録されたアニメーションはKinectMocapFbx->Models->UChar1.fbxに保存されている.もう1度モーションキャプチャをすると,このfbxファイルにアニメーションが上書きされるので注意.

qii05.PNG

実際にほかのモデルでアニメーションを動かす

とりあえずUnityちゃんを動かしてみよう.適当にUnityちゃんのAssetをインポートする.

先ほどのUChar1のRigはGenericでUnityちゃんのRigはHumanoidなので,UChar1のRigをHumanoidに変更する.変更した後はApplyを押す必要がある.

qii06.PNG

アニメーションのファイルはfbxの中に格納されているので,取り出す必要がある.UChar1.fbxの中のKinectMocap.animが記録したアニメーションファイルに該当する.KinectMocapを選択して Ctl(Command) + D でアニメーションファイルをfbxから取り出すことができる.

qii07.PNG

取り出したアニメーションファイルをhierarchyのunitychanにドラッグアンドドロップする.すると,Animatorが自動生成され,下の画像のような状態になる.

qii08.PNG

これでシーンを再生すると先ほど記録したアニメーションが再生される.

qii09.PNG

まとめ

Kinect v2でモーションキャプチャをしたいという気持ちでアセットストアを眺めていたら良いのを見つけた.価格は$10と既存のKinectモーションキャプチャよりもかなり安く,おススメできる.

このコンテンツは,ユニティちゃんライセンス条項 のもとに提供されています.

imageLicenseLogo.png