てんちょーの技術日誌

自分がつまづいたこととかメモ

【Unity】ViveのHMDなしにTrackerを使う

はじめに

お高いPerception Neuronとか買わなくても今流行のVirtual Youtuberになれる!!(かも)(Final IKは買おう)

ところで、こんなのを作っています

Trackerしか使わない子供向けおもちゃの #Inst_Paper です。HMDいらないなーと思ってて、

つい最近

これきっかけで調べたらまずこれを発見しました。

www.roadtovr.com

ここは Python使って取得するやつで、

その通りやったらできました。サンプルにUDPで送る方法もあったのでそれでやろうかなーと思っていたら、

と言われたので調べてみよ と思っていたら、

と、次々情報が集まってきたのでやったら上手く行った という話です。

やること

VRSettingsを変える

ここらへんに設定ファイルの default.vrsettings があります。

<steamインストールフォルダ>\steamapps\common\SteamVR\resources\settings

これを開いて、 requiredHmd を falseにします。

--- 追記 2019/11/28 ---
default.vr.settingsについて

とのことです


合わせて上記の設定のままだとHMDを1度PCに繋がなければいけないので、こちらも合わせてご確認ください。

shop-0761.hatenablog.com

--- 追記おわり 2019/11/28 ---

f:id:shop_0761:20180108032049p:plain

Steam VRを起動してたら再起動しておきましょう。 利用不可になりますが、通常HMDを繋がないとベースステーションやTrackerが見えるようになります。

Unity側の設定

とりあえずSteam VR Pluginを入れて、Virtual Reality Supportを切ります()

f:id:shop_0761:20180108032253p:plain

一応 Edit → Preferences からAutomatically Enable VR も切っておきます

f:id:shop_0761:20180108032439p:plain

これで準備完了 のはず

スクリプトを書く

のは、めんどくさいので用意しました。

gist.github.com

これを適当にアタッチして使ってください。

こんな感じで使います。

f:id:shop_0761:20180108033556p:plain

すると

といった具合に使えます。ただ、途中でTrackerを追加したりした時に勝手には対応してくれない(監視するのが面倒い)ので、 Resetボタンを用意しました。デフォだとTabキーを押すといけます。(意味的にRefreshのがよかったかも

トラブルシューティング

Steam VR はβじゃないと動かない…かも?

Init_HmdNotFoundPresenceFailedエラー

ビルドした時に動かない

openvr_api.dll がない可能性があります。win64の場合はこのdllをUnityのAssets/Plugins 以下などに適当に放り込んであげれば 動くはず。

64bit

github.com

32bit

github.com

ポゴピン

TrackerのRoleを設定しないと入力が取れないようです

けのじ (@kenoooooji) | Twitter さんが検証してくれました ありがとうございます!

kenoji.hatenablog.jp

まとめ

自分でOpenVRを初期化すればいろいろできそう

このHMDなしバージョンで #Inst_Paper を銀VR 2日目に展示する予定ですのでよければー

http://jvr-fest.com/2017/11/2958/

全く関係ないですが、Udemyの講座 よかったら買って欲しい(割引きクーポンつきURL貼っとくので

https://www.udemy.com/unrealengine-4-archviz-vr/?couponCode=TENCHO_435970www.udemy.com

2017年 作ったものとかをまとめてみた

はじめに

個人的に完成した(と思っている)ものに関してはすぐ忘れてしまうので、 「作ったもの見せて」と言われた時にこの記事にまとめておくと便利かなぁと思いまとめておきます。

意外と時間がかかりそうなので、ざっくりまとめた後、おいおい追記するかもです

1月

お引っ越し(下見)と卒論があったので、後半はわたわたしてるけど、前半はこんな感じ

2016年に作り始めたVRキーボードの別案を年始から作っていたらしい

GASがお気に入りだったので、この頃はslackと連携してアレコレ作ってたっぽい

2月

Mogura VRでちょろっと紹介されたり

卒論 おわらせたのがこのくらい

これのお手伝いをしたり

引っ越し先のおうち Blenderで作ったりした

UE4 Meetup Sapporo で登壇したり

うっかりSVVR(アメリカ)に行くことを決めてしまうなどした

会社から課題を出されていたので、そのためにUnityの勉強をしたりもしてたなぁ

3月

Unity Chan Live -UE4 ver-

4月

Unity Chan Live をモバイルに持っていったり

SVVR 報告会でLTした

atnd.org

https://speakerdeck.com/shop_0761/svvr-en

5月

意外とお気に入りの引き出し

6月

凹みさんの uDD でYoutubeの360度動画を再生するやつ

7月

音声認識でメモを残すやつ

これはこの前LTしました

speakerdeck.com

8月

VALU向けchrome拡張を作った

shop-0761.hatenablog.com

夏コミ 技術書を書いたりしました

shop-0761.hatenablog.com

水彩風マテリアルをまた調整しはじめたり

Unreal Engine Meetup Sapporo にて ライブノーディングのサポートをしたり VR ModeのSequencerの紹介をしたり

ミクさんお迎えしたけど、全然遊べてない…

9月

ぷちコンで UE4 + Network + VRなコンテンツをやっつけでなんとか作った

10月

Inst_Paper 上海で展示してきました

技術書典3にだしたり

Udemyの講師になった

11月

Windows MR で無限に歩けるので公園で歩いた

Inst_Paper 初国内展示

STYLYハッカソンにて、未実装のシーン遷移をハックしてつくるなど

f:id:shop_0761:20171223012943p:plain

12月

イベント用名札メーカー

shop-0761.hatenablog.com

その他

全く関係ないですが3月から東京に引っ越してきて、どうやら大分痩せたようです(体重計がないので分からない

一人暮らししたら、とりあえず食費から削るなぁと思ってて実際そうなった模様。実家にいる間にいっぱい食べとこと思ってたらかなり太ったんですが、それも無かったことになるくらいに…

夏ごろ?に家族に会った時に後ろ姿が変わった(細くなった)とか言われたのを思い出したりしました

なんでこの話を書いたかというと、さっき久々に履こうとしたズボン(春先とか履いてたやつ)がダボダボになってて!?!?ってなったからです はい

UE4のお仕事はいつでも募集中なのでお気軽にTwitter等に連絡くださいね!

twitter.com

【UE4】スマホアプリによくあるスワイプ、ピンチインアウト

はじめに

久々にちゃんと誰かの役に立ちそうな記事を書かねばと思った次第です()

というのもありますが、検証ついでに作ってみたので忘れないようにメモをば。

実装

Playerのカメラ回転 よく忘れるので、どうするのがいいのか迷ったあげく とりあえずPlayerPawnのカメラを直で回しています。ダメっぽい気がするのでいい方法があったら教えてください。

あと、なぜか意図せずRoll方向にも回っていたので、PlayerPawn側で回らないようにしました(ダメそう

Player Pawn


2017/12/13 01:52 修正

Control Rotationに変えたので、Player Pawnのチェックを入れとかないと動かない

f:id:shop_0761:20171213015045p:plain


f:id:shop_0761:20171213010151p:plain

Player Controller


2017/12/13 01:52 修正

Get Component by Class はキャッシュしたほうがよさそう

f:id:shop_0761:20171213015143p:plain


f:id:shop_0761:20171213010227p:plain

CalcPinchRate マクロ f:id:shop_0761:20171213010535p:plain

f:id:shop_0761:20171213010552p:plain

CalcSwipeCameraRot マクロ

f:id:shop_0761:20171213010648p:plain

f:id:shop_0761:20171213010703p:plain

別で入力が欲しい時

f:id:shop_0761:20171213010730p:plain

簡単な説明

indexに合わせてPress時のVector2Dを取っておいて、Movedで差分を計算する感じです。 とりあえず見栄え重視でマクロに突っ込んだので色々アレです。まあサッと試しただけなのでご勘弁を…

まとめ

デバッグにはじめてまともにLauncher使ったけどべんりっぽい!細かい実装はUnityのコードとか参考になります おわり。

GoogleHome で遊んでみたことメモ

はじめに

スマートスピーカー Advent Calendar 2017 の 3日目です。

qiita.com

昨年末はPCのキーボードを封印して音声認識でどこまでいけるか試したりしていました。

コルタナさんがあまりにもEdge頼りなので、気合でPowerShellスクリプトを書くなどしてTwitterをしてました。

shop-0761.hatenablog.com

今回は勢いで購入したGoogleHome miniが思ってた以上に認識精度が高いので、 あれこれ勢いで作って便利になったメモを残しておこうかと。

nodejsは手探りで書いたのであまりよくない書き方かも…。

ついでにAmazon echo dotも安かったので、最後に感想とかも。

やったこと

基本的に RaspberriPi Google Apps Script(GAS) IFTTT の3つでやりくりしてます。

Raspberri Pi zero W を買う

事前にちょろっと調べるとGoogle Home notifier を使えば発話させられるらしく、 これはラズパイ買っとこ と思って秋葉原で買いました。 キットみたいなやつを買ってすぐ使えるやつだったのに、何を思ったかSDカードをフォーマットしてしまい 結局入れ直しました…地味にひっかかったりした…

Hue連携

Hueがあれば、すぐ終わります。なんか覚えてないくらいに一瞬でした。 "部屋"って名前の部屋をGoogleHomeのアプリで作っておくと、「OK Google, 部屋の電気をつけて」みたいに使えて便利です。

wemo連携

家に転がってたwemo mini smart plugをつかうことにしました。 こいつはコンセントのオン/オフができます。

www.belkin.com

IFTTTで連携できるので、とりあえずそのまま使っています。 運用でカバーってやつですね()

IFTTTでコマンドの上書き

どうやらGoogle Homeにある既存のコマンド「おはよう」などはIFTTT連携で上書きできるようです。 はたして需要があるのかコレ。

特に難しい設定もせずにこうすると、上書き?になるっぽい

f:id:shop_0761:20171116094813p:plain

Google Home notifier

セットアップ

qiita.com

記事をそのままやりました。注意すべきはnodejsは7系でないと動かないかもです。 これで喋らせる時に「とぅるん」ってこれから喋るよみたいな音がなるやつ消せないのかな…?

ngrokのURLをslackにPOST

Google Home Notifier では ngrok というのを使ってローカル環境を外部に公開しています。

qiita.com

example.js を実行するたびにアドレスが生成され、これを使えばGAS等からアクセスできます。 サブドメインを割り当てることができるらしいのですが、2.0だと有料、1.0だと無料だそうです。

google home notifierがどっちなのか調べるのも面倒だったので、 urlが生成されるたびにslackへPOSTして、それをOutgoing webhooksで拾い、GASでSpread Sheetに記録してました。 まあ、メリットとしてラズパイが落ちてしまった時にこれらのスクリプトの準備できたらslackに通知がくるって感じですかね。

こんな感じで

f:id:shop_0761:20171116010213p:plain

outgoing webhooks は legacy になってしまったので代わりになるものを探しましたが、いまいちしっくりくるものが無かったので そのまま使っています。ただtokenの生成が前と変わって、権限を付与する形のものになりました。 今はこの3つを許可したtokenを使っています。

f:id:shop_0761:20171116011350p:plain

api.slack.com

qiita.com

example.jsに追記する感じで書いています。

app.listen(serverPort, function () {
  ngrok.connect(serverPort, function (err, url) {
    console.log('POST "text=Hello Google Home" to:');
    console.log('    http://localhost:' + serverPort + '/google-home-notifier');
    console.log('    ' +url + '/google-home-notifier');
    console.log('example:');
    console.log('curl -X POST -d "text=Hello Google Home" ' + url + '/google-home-notifier');

   //ここから
        var request = require('request');
        const HOST = 'https:\/\/slack.com/api/chat.postMessage';
        var options = {
                url: "https://slack.com/api/chat.postMessage",
                form: {
                        "token": "とーくんをいれる",
                        "channel": "#googlehome",
                        "text": "ngrokのアドレスが変わったよ " + url + "/google-home-notifier",
                        "username": "GoogleHome_Assistant"
                }
        };

        request.post(options, function(error, response, body){
                if(!error){
                        console.log("BODY: " + body);
                }

                else{
                        console.log("error: " + error.message);
                }
        });
  //ここまで
  });
})

trello にメモを残す

Google Home 標準で買い物メモを残せますが、消すのはアプリ経由らしくて面倒いのでtrelloで管理出来るようにしました。 カードの追加/削除 がボイスコマンドで出来ます。全てのカードの読み上げもできるようにしようかな。

GAS側のコードはこの辺にまとめておきました。

gist.github.com

IFTTTはこんな感じで。

f:id:shop_0761:20171116013755p:plain

こうして「メモに牛乳を追加して」というと、「牛乳を追加」とSpread Sheetに書き込まれるので、 追加の文字列が入ってたらtrelloにカード追加、無かったら削除 みたいにしてます。

実行済みのチェック

Spread Sheet に書き込まれたタイミングでGASを実行するため、適当に編集してると 何度も関数が呼ばれてアワアワすることになるので、こんな感じでチェックするようにするといいでしょう。

f:id:shop_0761:20171116014152p:plain

function checkCmdDone(){
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  //sheet が複数あるので名前で指定
  var sheet = spreadsheet.getSheetByName('CommandLog'); 
  var value = sheet.getRange(sheet.getLastRow(), 1, 1, 2).getValues();

  if(value[1] != "Done"){
    sheet.getRange(sheet.getLastRow(), 2).setValue("Done");
    return true;
  }
  
  else{
   return false; 
  }
}

勝手にしゃべる

細かく時間を指定して実行できるらしいです。(知らなかった)

qiita.com

これらを使って勝手にしゃべるようにしました。

ゴミ捨ての通知

ゴミ捨て表をSpread Sheetで作って、そこを参照しつつ通知してくれます。 前日の夜とかに知りたいので少しindexを調整してます。

f:id:shop_0761:20171116015341p:plain

  for(var i in cels){
   // todayは12/3(日)10:00表記になるものを作っておいて、indexOfでさがしてる
    var index = readableDate.indexOf(cels[(parseInt(i)+1) % (cels.length)][0]);
    var state = cels[(parseInt(i)+2) % (cels.length)][1];

    if(index > -1 && state != ""){
      //読み上げ
      textToSpeech("てんちょーさん、今日は" + state + "だよ");
    }
  }

ストレッチの通知

ストレッチし忘れるので、さっきの時間指定できるTriggerで設定しています。

降水確率の読み上げ

天気はスクレイピングしてきて使っています。 現在の時刻に合わせて、それ以降の降水確率を読み上げてくれます。 スクレイピングしてきたときに、過去の降水確率は"-"みたいになってたりするので、 その時は読まない、みたいにして書いてます。大したことないので省略。

ミクさんに喋ってもらう

という気持ちで作りました。 多分 OpenJTalk + MMD Agentの初音ミクの音響モデル が1番ラクな気がしますが、 あまり好みではなかったのでゴリ押しで作りました。

流れとしては

  1. Google Home で音声認識 + IFTTT でSpreadSheetに書き込み
  2. GASで検知して、Raspberri Pi にテキストを送信
  3. MeCabでカナ読み取得
  4. 一文字ずつに分割
  5. 対応する.wavファイルを探す
  6. sox コマンドで一つの.wavファイルに
  7. google home notifier で音声ファイル読み上げ

って感じですね。面倒いので全部は書きませんが、ポイントだけ。

  • MeCab で品詞分解に失敗して読みが取れない時がある
  • 数字は漢字に変換してMeCab
  • 促音・撥音・拗音・長音あたりを考慮して分割

これ作ってる途中で気づきましたが、GASってzip作れるんですね…やばみ…

gist.github.com

Amazon echo dotとの比較

Amazon echo dot は Google カレンダーに予定を追加できます。Google Home mini では出来ません。 ????どういうこと????

あとAmazonで買い物できますが、やり取りが長いので喋るくらいならポチポチしたほうが早いという印象です。 Hey mikuも使えます。ただ1回遊んだら終わりですかね…

それと体感的な話ですが、echo dotは自分で再生しはじめた音楽のせいでマイクの感度が落ちる…?自爆…? その点Google home miniのが優秀な気がします。布団からごにょごにょ喋っても反応したり、 モニターを正面に座り、真後ろに置いてあるGoogle home mini に話しかけても反応したりします。すごい。

まとめ

ここまでやるともはやGoogleHomeである意味とは…?という気持ちになります。 ただ、GoogleHomeの認識精度は魅力的ですね。

イベント用名札生成ツール -NameCardMaker- を作ってみた

はじめに

これを見て、「あ、自動化できそう」と思って作ってみました。

-- 12/02 02:24追記

これツイートの元ネタがあるんですね(しらなかった

yoshiko.hatenablog.jp

--

2018/03/06

専用ページを作りました。 詳細はこちら。 記載してた採用実績、対応サイト等も全て移行しました。

shop-0761.com

【UE4】BPで気合のProcedural Modering

はじめに

Unreal Engine 4 (UE4) Advent Calendar 2017 の2日目です。

qiita.com

今回の内容はあまりオススメできませんが、気になったのでやってみた次第です。

先に参考図書である「Unity Graphics Programming」のリンクを貼っておきます。これをUE4に移植してみた、という内容です。 この本、割りとTwitterで話題になっており、初めて買えるタイミングであった技術書典3に僕も出展してたんですがなんとお隣のブースでした()

indievisuallab.stores.jp

実際のサンプルコードはこちらに。

github.com

まあこのまま移植しても多々ミスって思うように表示されなかったり、ちょっと手を加えないといけない箇所もあったりして 割りと大変でした。はい。

Procedural Moderingとは

通常のモデリングはDCCツールと呼ばれる Maya, 3ds MAX, Blenderなどを用いて作成することが多いです。 それとは別に計算だけでモデリングすることです。参考図書には

ルールを記述し、自動化された一連の処理の結果、形を得るアプローチのこと

とされています。

応用例としては AirtoneのコレもProcedural Moderingしてマテリアルで演出しているそうです。

f:id:shop_0761:20171101133503p:plain

https://youtu.be/qssKpo8cHYwより

始める前に

さがしてみると、もんしょさんが先にやっていました。さすが!

もんしょの巣穴blog [UE4] ProceduralMeshComponentを使ってみる

さすがに複雑な計算をBPでやるのは骨が折れるので、ProceduralMeshComponent を使う場合はC++の方がいいと思います。

はい。のでこれをBPでやりました。すると代わりにたすさんの骨が折れました。

できたもの

先に完成イメージを見ておきましょう。よっしゃーできた!!と思っても知らない人には正直大したことないものなので 心が強い方が取り組むことをオススメします。

f:id:shop_0761:20171101134149g:plain

f:id:shop_0761:20171101134217g:plain

f:id:shop_0761:20171101134242g:plain

f:id:shop_0761:20171201020107p:plain

多少見栄えするようにTimelineでしゅるしゅる動かしたりしてますが、特に意味はありません。

こんな感じで頂点があります。

f:id:shop_0761:20171201022926g:plain

作ってみる

こちらに今回作ったアセットをサンプルとして置いておきます。 詳細な考え方は参考図書を読んで下さい。

github.com

とりあえずBaseクラスを作っておきました。BP_ProdeduralMeshBaseとしています。

f:id:shop_0761:20171201020614p:plain

f:id:shop_0761:20171101134949p:plain

f:id:shop_0761:20171201020657p:plain

Debug用にちょっと関数を用意してありますが、あまり頂点数が多いとUE4ごと死にます。気をつけましょう。

基本的にはこのDraw MeshをOverrideして使う感じです。

では板ポリを出して見ましょうか。継承したBP_QuadでDrawMeshをOverrideします。

f:id:shop_0761:20171101140201p:plain

するとこんなかんじ

f:id:shop_0761:20171101135719p:plain

わーい!これくらいならお手軽ですね。UVも設定してあげるとチェッカーの模様が出ます。 失敗してる / 設定してないと消えます。

f:id:shop_0761:20171101135827p:plain

同様にNormal, Tangentも設定できます。

移植時の注意点

だれもやらないとは思いますが、一応。参考図書がUnityなので、座標系、単位が違います。 またいくつかのindexに注意が必要です。(i >= length と i > length とか)

コードを何度も見直しても、間違ってる箇所が見つからない場合は、自分が見落としている可能性があるので 何日か空けて見直すしかありません。それでも思うように出来ない場合は手探りで調査します。(木の後半は手探りでした)

便利ポイント

Procedural Mesh Componentで生成したMeshはStatic Mesh化できます。

f:id:shop_0761:20171201025022p:plain

ここからCreate Mesh して保存すると、

f:id:shop_0761:20171201025124p:plain

とアセット化できます。

おわりに

最近どういうわけかUnityとUE4を同時に起動する時間が長くなり、謎の移植芸を身に着けてしまったようです。 動的にモデルを生成したい、モデルアセットはプロジェクトに入れたくない、BPしか使いたくないけどProcedural Moderingはしたい、などといった 特殊な人向けの内容になってしまいました。 最初のPlaneやQuadレベルだとやる意味をあまり感じませんが、木とかできると途端にすげぇ感がでますね(間に合ってよかった)。たぶんSpeedTreeを使ったほうが速い気がしました。

宣伝

UE4の動画教材(日本語)がこれからどんどんUdemyに出てきそうです。 僕のが一番最初に出たライトな感じのやつなので、興味があれば覗いてみてください。 こちらはちゃんと役に立つ系のものです()

www.udemy.com

ちょうどこの記事を公開する1時間くらいにalweiさんのが公開されたようです。

unrealengine.hatenablog.com

それとこの動画教材を作ったお話を 第2回UE4何でも勉強会 in 東京 にてLTするのでよければぜひぜひ。

ue4allstudy.connpass.com

【WinMR】バックパックPC + WinMR でUSB/Bluetoothが繋がらなくなった話

はじめに

こんなのをUE4で作りました

これ、当初の予定では僕のバックパックPCを使って撮るつもりだったんですが、途中でうんともすんとも言わなくなり 急遽ノートPCを借りてやりました

おはなし

環境

お外でやりました。PCはこれ。

www.dospara.co.jp

WinMR の方はAcerのDevelopment Editionです。(コントローラーないやつ) 動画内で使ってるコントローラーはDellのやつです。

OSはこんな感じ。

f:id:shop_0761:20171114011943p:plain

グラボのドライバ

f:id:shop_0761:20171114012029p:plain

死兆星が見える

なんとかの拳で見えるアレです。見えると死が近いと言われるやつです。

撮影するためにいろいろ試行錯誤してる途中で、なぜか注視点が2つ見えました。 片目で見ても2つ見えたので???と思っていたら、今度はオレンジ色になりました。とりあえず動いてるからいいか、と思って続行。

電源がつかない

オレンジの注視点が見えた状態で歩きまわっても動画のように歩き回れなかったので、 おかしいなと思いPCごと再起動しようと思いました。なんとかなるでしょ、ぽちーっと電源ボタン長押しで一旦落としました。

今回は iPad Pro 10.5 + Splashtop Wired XDisplay HD で外部モニタとして使ってました。 ので通常のモニタ出力と違い、ちゃんとアプリが表示してくれないと状況がわかりません。 というか、それ以前に電源が入らなくなりました。バッテリーはまだ残っているはず…おや…?

USBが繋がらない

しょうがないので、デコ氏(@Ash_Yin)のおうちにお邪魔してモニタに繋ぎ確認することにしました。 電源に繋いでつくことはつきましたが、USBとBluetoothが反応しない…詰みでは…???

どの段階でUSBが来ないのか、チェックするためにダメ元でBIOS起動を試みるといける…おや!?!? どうしたものか…これ…

原因を調べる

さて、おうちに帰ってきて原因を調べることに。 事前にChrome Remote Desktop が起動時に立ち上がるようにしていたのが救いでした。 おうちに帰ってきてなんとか操作できるように…

Bluetoothどうなってるかなーと見てみると、

どういうことなのこれ

ドライバ入れ直せばいいかーと思って適当にググってる途中で、 intel usb 3.0 extensible host controller driver が無効になってることに気が付きました。

これ…有効にしてみるか…すると USB ルートハブ(USB 3.0) が現れました。 こいつも有効にするか…と有効にしてみるとUSBもbluetoothも生き返りました。

まとめ

Immersiveなヘッドセット 開発周りであわあわしてるのをよく見ますが、このようにドライバを無効にしてくるケースがありました。

まあしゃーないところはあるので、自己責任ということでお気をつけを…

リモートで操作できる環境を用意しておくことをオススメします…