こんなのあった
メモ
Unityのバックスラッシュ記法で\s(スペース)が使えない件
標記のみ.
\t(タブ),\n(改行)は使える.
日本のWindowsの場合,バックスラッシュは¥マークのこと.
Unityで画像認識(Google API使用)
AIがらみで調べていて,Google Cloud Vision APIが使えそうでした.
ちなみにCloud Visionとは
Cloud Vision APIの凄さを伝えるべくRasPi botとビデオを作った話 – Qiita
(この記事はGoogle Cloud Platform Advent Calendar 2015の12月3日分の記事です) Cloud Vision APIと私 Googleに入ってからまもなく5年、Google Cloud Platformのデベロッパーアドボケイト(エバンジェリストみたいな役割)の仕事に就いてから1年が経ちました。仕事の半分はアジア地域向けの開発者コミュニティ支援で、残り半分はGCPの新製品ローンチの支援をグローバル向けに行っています。 特に…” name=”description
このように顔の検出や,その顔のスマイル度,文字認識,写真なら何が写っているかなどを情報にして返してくれます.
ふーん,Unityだったらカメラ(WebCamTextureでUSBカメラも,スマホのカメラも使用できる)が使えるので,Unityで使えたらいいなぁ,,,ってふと検索したら,,
UnityからGoogle Cloud Vision APIを使ってみた |
前回の更新から1年ぶり(!)でtokyoZデビューすることになりました。どうぞよろしくお願いします。私は日頃から好んでUnityを使っておりまして、ゲームだけでなくインスタレーション、CE機器のUI、そして医療用のビュー前回の更新から1年ぶり(!)でtokyoZデビューすることになりました。どうぞよろしくお願いします。 私は日頃から好んでUnityを使っておりまして、ゲームだけでなくインスタレーション、CE機器のUI、そして医療用のビューワーなど、そのとどまるところを知らない可能性には日々感心させられておりま
作ってくれてる方がいました!
素敵!
デモを見ると顔認識ができそうです.文字認識などは自分でリクエストコードかけばいいか,,,=>入ってます!!
ということで,さっそくダウンロード.
Unityのプロジェクトになっているのでプロジェクトをインポートして,,
APIキーをゲットして,,
あれ,,動かない,(400が出る)
APIキーが有効になるまで最大5分かかるのね,,
動かない,,,,(400)
あ,,APIキーの最後に半角スペースが入ってた(てへぺろ)
動かない,,,,(40以下略)
サーバ版でなくブラウザ版にしてみよう
動かない,,,,(4以下略)
もういっかいAPIキーをコピペして,,,ん?APIキーの1文字目の前にも半角スペースが,,,これを取り除いて,,
動きました!!
顔認識モードにします.で,満面の笑顔をした結果Googleの判定は!?=>VERY_UNLIKELY(意訳:おま,超不幸そうな顔!)
これは理系のエンジニアが悪いことにします.決して私の顔が悪いわけではない!!
ペットボトルを見せてみると,,
Cと中京大学って認識されています
裏のラベルを見せてみると,
“locale”:”ja”,”description”(日本語ですね,その内容は)と書かれています
で,認識したのが,
e50(),:/\u003e非加非加熱軟水B+t科名★(Eボ賞味期限ボトル側面に記載ars方法直射日光高温多湿の觀を避けて保存してくださ長良川名t株式会社:岐阜県関市APm29%水一地,岐阜県anan養成分10hLAC+)】エネルギーaKLr質脂質炭水化物カルシウム100gカムi-o名名量11
この距離ではよく認識したほうではないでしょうか?
さてこれをどう使うか?がとても重要ですね.
VRに使ったスクリプト(Unity側)
(関連記事)
上記リンク先の記事SerialHandlerを使ったUnityの制御です.
using UnityEngine; using System.Collections; using System;//use for time using UnityEngine.UI;//use for UI //アセットSuperSplinesのメニューを追加 [AddComponentMenu("SuperSplines/Animation/Regular Animator")] public class mySpline2 : MonoBehaviour{ public Spline spline; public WrapMode wrapMode = WrapMode.Clamp;//SuperSplineの初期モード実際はLOOPで使用 public float speed = 0f;//初期速度ゼロでないと起動したら動いてしまう public float offSet = 0f;//オフセット値/スタート位置を変えたい場合など. public float passedTime = 0f;//何に使ったかな? float myspeed = 0f;//何に使ったかな? public Text myText; //UIで使う用 public SerialHandler serialHandler;//serialHandlerスクリプトがアサインされたゲームオブジェクトをアサインする用. //for arduino public bool spBool = false;//停止用 //時間計算用,試行錯誤してるので要らない変数あるかも private int starttime; private int now; private int duration; private float truespeed; private float myPos = 0f; private float mytime = 0f; float lerpspeed =0f; float firstSpeed = 0f; float mymillsec= 0f; string kmspeed; void Start(){ myText.text = "0km/h";//GUI表示用に0km/hいれる starttime = DateTime.Now.Hour * 60 *60 * 1000 + DateTime.Now.Minute * 60 * 1000 + DateTime.Now.Second * 1000 + DateTime.Now.Millisecond;//起動した時間をstarttimeにミリセカンドで入れる.ペダル停止検知用 //信号を受信したときに、そのメッセージの処理を行う serialHandler.OnDataReceived += OnDataReceived; } void Update( ) { mytime += Time.deltaTime * speed;//いまの時間とスピードかけてspline動かす指標にする if (spBool) {//ペダル動いてるとき myPos += Mathf.LerpUnclamped (speed ,firstSpeed, mytime);//スプライン上の位置myPosを時間でslerpする } if (Input.GetKeyDown ("s")) {//停止用 myPos += Mathf.LerpUnclamped (0f, 0f, mytime); spBool = false; myspeed = 0f; } if (Input.GetKeyDown ("r")) {//リセット用 myPos = 0; spBool = true; myspeed = 0f; speed = 0f; } // 下3行がsplineを動かすやつ float clampedParam = WrapValue (myPos + offSet, 0f, 1f, wrapMode); transform.position = spline.GetPositionOnSpline (clampedParam); transform.rotation = spline.GetOrientationOnSpline (clampedParam); //// } void OnDataReceived(string message){//arduinoから文字列を受信したら firstSpeed = speed;初期速度をさっきの速度に入れ替え(2回目以降用) mymillsec = float.Parse (message);//車輪が1回転した間隔を受信してるので,それをフロート値に変換 myspeed = (3600000f / mymillsec) * 0.000628f;//速度km/hを計算 if (myspeed < 0.9) {//速度が1km未満ならゼロに myspeed = 0f; } kmspeed = myspeed.ToString ("N2");//小数点2桁でカット speed = myspeed * 0.00005f;//乗数で速度感変わります //} myText.text = kmspeed + "km/h";//速度をUIに表示 //以下使ってない(タブでデータ区切り用) var data = message.Split( new string[]{"\t"}, System.StringSplitOptions.None); if (data.Length < 2) return; try { } catch (System.Exception e) { Debug.LogWarning(e.Message); } } public void stopper(){ //使っていません.ペダルの回転間隔を調べて回っていないのならゼロにしようと思いましたが,惰性で進むことを優先してこちらはカット(ただしBoolだけ使ってる) now = DateTime.Now.Hour * 60 *60 * 1000 + DateTime.Now.Minute * 60 * 1000 + DateTime.Now.Second * 1000 + DateTime.Now.Millisecond; duration = now - starttime; if (duration > 3000) { spBool = false; kmspeed = "0"; myText.text = kmspeed + "km/h"; } else { spBool = true; } //Debug.Log (spBool); starttime = DateTime.Now.Hour * 60 *60 * 1000 + DateTime.Now.Minute * 60 * 1000 + DateTime.Now.Second * 1000 + DateTime.Now.Millisecond; } public void testBtn(){//センサを使っていないときに,GUIのボタンでテスト出来るよう int myrand = UnityEngine.Random.Range (150, 1800); string randStr = myrand.ToString (); OnDataReceived (randStr); } //splineのモード設定用みたい private float WrapValue( float v, float start, float end, WrapMode wMode ) { switch( wMode ) { case WrapMode.Clamp: case WrapMode.ClampForever: return Mathf.Clamp( v, start, end ); case WrapMode.Default: case WrapMode.Loop: return Mathf.Repeat( v, end - start ) + start; case WrapMode.PingPong: return Mathf.PingPong( v, end - start ) + start; default: return v; } } }
です.
VRアプリ開発メモ
実質2日間でOculusRift(DK2)対応のコンテンツを作っていました.
このレベルなら文系の私でもモデリング含めて2日(徹夜なし)で作れるので,卒研とかはこんなレベルじゃダメですよ〜
(ていうか,そもそも組み立てただけで研究でもなんでもない,,,)
そもそもOculusって何かってっつーと,PSVRのようなものです.
Oculus Riftはコケられない、だから値段も高くなる|WIRED.jp
製品版「Oculus Rift」の予約受付がはじまり、その価格の高さに驚いた人も多いだろう。しかしソニーやHTCといった手ごわいライヴァル企業と競わなければならないOculusにとって、いちばんの問題はその価格ではないようだ。
このOculus社がDK1を出したのはずいぶん前です.当時は衝撃でしたね.私はジェットコースターで酔ってOculusは触らないことにしました.
でもこのあたりの衝撃が現在のVRブームを作ったとも言えます.
さて,このVRコンテンツ,作るのは超簡単です.
どのくらい簡単かというと,ドライバなどインストールしてれば,見るだけなら3分くらいで作れます.
研究室に前の住人が残しておいたエアロバイクがあったので,ちょいと分解.データが取れそうでした.
そこで,,,,
Arduinoでちょいちょいといじって,
こんなものができました.
八事の空を空中散歩♪
オーキャンで高校生が絶叫していました〜(それを見てる方が楽しい)
センサのデータ変換にはAruinoを使っています.
今回書いたプログラムは全部で200行以下です.
そのうち,エアロバイクのセンサをArduinoからシリアルで送るプログラム
unsigned long mytime = 0; unsigned long hittime; unsigned long duration; boolean sensorBool = true; int input_value; void setup(){ Serial.begin(9600); mytime = millis(); } void loop(){ input_value = analogRead(3); if(sensorBool == true){ if(input_value < 200){ sensorBool = false; hittime = millis(); duration = hittime - mytime; mytime = hittime; send(); } }else if(!sensorBool){ if(input_value > 500){ sensorBool = true; } } } void send(){ Serial.println(duration); }
これをUnityに送って,コースのスプラインを走るだけです.
うん,簡単ですね.
Unity側のプログラムは別記します
なお,数値変化をやさしくするために,
Mathf.LerpUnclamped
を使っています.
Mathf.Lerpでもいいのですが,これは0から1でしか動作しません.
Splineは0(始点)から1(終点)で動くので,1を入れると1周します.Mathf.Lerpですと,1周しかしません.
Mathf.LerpUnclampedにすると,1を越えても数値補完してくれるので2周3周したいお客さんがいるときにも対応できます.
もちろん,適宜データのリセットは大事ですが,,
Pokémon GO(ポケモンGO)はUnityでつくってるとかなんとか
どうもネイティブっぽくないらしい.
逆にUnityにバグがあると,かえってUnityが問題になる予感.
ちょいちょいバグの入った(Unityの)バージョンがリリースされっからな,,知らずにビルドしちゃったりとかして,,,
『Pokémon GO』公式サイト
『Pokémon GO』は、位置情報を活用することにより、現実世界そのものを舞台として、ポケモンを捕まえたり、交換したり、バトルしたりするといった体験をすることのできるゲーム! 『Pokémon GO』は、2016年サービス開始予定!!
位置ゲーで人が能動的に動く様子を見ています.つまり仕事なんです.わりと本当です.
iMovie(2)
- 編集が終わりプロジェクト選択の画面に戻ったら,プロジェクト名を学籍番号と氏名に変更し,完了をタップ.(※ここを変更しても提出するファイル名は変わりませんので飛ばしてもかまいません)
- 共有ボタンをタップします
- ビデオを保存をタップ
- HD-720pをタップし,保存されます.これは自分用の保存
- 提出方法については別途指示します
番外編
- アフレコをしたいときは,マイクのボタンをタップし,録音をタップすると3秒前から開始されます.ヘッドホンマイクを使うと便利
- また,メディアの追加ボタンを押し,オーディオのタブには,効果音(サウンドエフェクト)などが入っています
- また,アプリGarageBandでは,BGMを作成したり,声を録音してエフェクトをかけたり,楽器の演奏もできます.これがあの「そう,iPhoneならね」
- GarageBandで楽曲を作成したらプロジェクト画面に戻り,選択をタップ
- 書き出したいプロジェクトを選択し,左上のシェアボタンをタップ
- アプリに出力をタップ
- iMovieを選択
- その後,iMovieのどのプロジェクトに音を追加するか聞かれますので,音を追加したいプロジェクトを選択してください
- あとはiMovieで編集をして書き出すだけです
iMovie(1)
iMovie編集のながれ
iMovieというか,最近の編集ソフトの何がすごいかって20〜30年前はこれだけの編集するのに機材だけで数千万から1億以上かかっていたのですが,今は600円(しかも無料).当時の0.00006%のコストです
- iMovieを起動します.
- プロジェクトのタブで+ボタンでプロジェクトを追加します.なお,操作はポートレイトモード(縦位置).ランドスケープモード(横位置)どちらでもかまいません
- ムービーを選択します
- テーマ「シンプル」を選択し,作成をタップします
- フィルムと音符の記号をタップします
- 画面下部の写真を選択し,すべてをタップします.なぜか古い写真が先に表示されます.下の方にある絵コンテを撮影した画像を探す
- 写真が追加されます(黄色い枠).画像が継続表示される時間を調整します
- Ken Burns(勝手に動くエフェクト)をオフに
- 次の画像を追加すると,トランジション(つなぎ方)を選択できます.カット編集は「なし」徐々に変わるのは「ディゾルブ」です
- ワイプやディゾルブなどトランジションの継続時間は左下に表示されている.前後の画像の長さが充分だと時間の選択肢が増えます
- 次に,右下の歯車のアイコンをタップ
- 黒からフェードイン,黒へフェードインをONにします.これでムービーの最初と最後がフェードイン,フェードアウトになります
- Vineなどの短尺の映像では前後フェードをかけない(=いきなりカットイン)のが標準的ですが,今回は標準的な映像作品のセオリーを目指しましょう.
- 映像全体の冒頭にタイトルを,冒頭かラストに学籍番号と氏名をテロップ(スーパー※とも言う)で入れます(ビデオコンテにはテロップを入れることは少ないのですが,提出者確認用として今回は入れてください)
- テロップを入れるには,素材を選択し,右下のTをタップし,画面に現れたサンプル文字をタップして編集します
- 終わったら完了をタップ
- テロップは,学籍番号と名前が判別できればどのようなデザインでもかまいません
- 全て編集が終わったら,左上の完了をタップします
(つづく)
※スーパー スーパーインポーズの略
ArduinoのデータをUnityに送る
Uniduino(Arduinoでなく)ではシリアル通信のデータ=Serial.println(hogehoge);したもの=が見えない.
サイクルコンピュータのようなものを作ろうとしたのですが,UnityのFPSを越える間隔のデータはUnityでは処理しきれないため,Arduino側でデータを処理し,Unityのupdateより遅い速度でUnityへ送る必要がある.
そこで,シリアル通信を送るサンプルを探していたのですが,以下リンクより見つけることができました.
UnityとArduinoをシリアル通信 – Qiita
はじめに (読み飛ばしてください 笑) ちょっとした趣味でデータグローブを作ってUnityで遊べたらなと思いました。 ハードウェアの部分はArduinoで制御すればいいんですがUnityとArduino間の通信とどうしたもんじゃと。 調べたらUniduinoという大変素晴らしいAssetがあるみたいですが、使うのに$30するようです。 ふえぇ…学生には高いよぉ… ということでいろんなネットの情報を参考にUniduinoを使わずにUnityとArduin…” name=”description
このプログラムのうち,SerialHandlerをそのまま使わせていただき,別の呼び出すスクリプトだけを変更します.
以下は,シリアルデータを読み出すスクリプトです.別途,SerialHandlerが必要です.
using UnityEngine; using System.Collections; public class mySpline2 : MonoBehaviour{ public SerialHandler serialHandler; void Start(){ serialHandler.OnDataReceived += OnDataReceived; } void Update(){ } void OnDataReceived(string message){ Debug.Log(message); var data = message.Split( new string[]{"\t"}, System.StringSplitOptions.None); if (data.Length < 2) return; try { } catch (System.Exception e) { Debug.LogWarning(e.Message); } } }
7行目でInspectorにボックスが出ますので,serialHandlerがアサインされたオブジェクトを入れてください.
11行目は必須です.これがないとエラーがでます.
23行目にあるようにmessageでString形式でデータが戻ってきます.
最終的にはこれをintParseして数値として使用する予定です.