スマホ向けに始めるVR Part1

どうも!洋梨🍐です!

みなさん「VR」ご存知でしょうか?
今この「VR」や「AI」がホットな分野だと思います!(個人的意見)

そんなわけで今回は簡単なVRアプリの作り方について初心者にもわかりやすく書いていこうと思います!

作成時間の目安は

Unity、プログラミング未経験者:30分
Unity初心者:10分
Unity経験者:5分

ほどで出来ると思われるほどVRの参入は簡単です!
※個人的体感速度になります。

ぜひ、そもそもアプリを作ったことがない方もやってみてくださいね♪

用意するもの

・スマートフォン (今回はAndroid)

作成したアプリをインストールして使います。
今回私は Xperia Z5 を使用しました。

※事前に設定で開発者オプション→USBデバックをONにしておいてください

・ヘッドマウントディスプレイ(HMD)


↑( 私が買ったのはこちら)↑
アプリを実行するのに使います。

・Unity

まだPCに入ってない方はこちらから無料版をダウンロードしてください!

・GoogleVR SDK (For Unity)

Unityに取り込んで使います。ここからダウンロードできます。

プロジェクトの作成

まずUnityを起動し、プロジェクトを作成します。

お好きな名前、ファイルパスに設定し3Dで作成してください。

GoogleVR ForUnity のインポート

事前にダウンロードした「GoogleVRForUnity_[バージョン名].unitypackage」をUnityが起動した状態で開きます。すると、

この画面が出ると思うので最初は無心でImportをクリックしてください!

インポートが完了するとAssets/GoogleVRが作成されているのが分かると思います。

Prefubのアタッチ

Assets/GoogleVR/Prefubsの中から

・GvrEventSystem

・GvrControllerMain

・GvrEditorEmulator

を探して無心でとりあえずシーンに追加します。

PlayerSetting

Unity上部タブ「Edit」→「Project Setting」→「Player」を開きます。

ドロイド君タブ内のXR Settingを開き、Supportedにチェックをつけ、+ボタンから上画像のように無心で追加します。

オブジェクトの追加 (任意)

この上までの作業でもう既にVRアプリは完成しています!

しかし、ステージ上に何もないため実行しても何もない世界を見渡すだけになってしまいますので何かしら追加したいと思います。

過去に作った3Dモデルがあれば配置してもいいし、

無ければ右クリック・Createから3D Objectなどで作ってもいいと思います!

ビルド

ではこれでプロジェクトが完成したのでアプリを実際動かしていきたいと思います。Unity上部タブから「File」→「Build Settings」を開きます。

そしてAndroidを選びます。スマホがPCに接続されていることを確認したら、「Build And Run」で実行します。2台以上接続されている場合Run Deviceから実行する端末を選んでください。

※IphoneなどIOSでの実行はXcodeに出力、および実行の手順がありますが割愛させていただきます。

スマートフォンでVRアプリが実行できれば成功です。
思ってたよりとても簡単だったのではないでしょうか?

まだこれでは見渡すだけなので好評だったら動けるようにしたり、ゲームにしてみたりと続きを書いてみようかと思います~


エラーが起きる

この記事通りに実行しても環境によりエラーが出ることがあります。
アプリ開発・プログラミングにエラーはつきものです(;^ω^)
ここには一般的なエラーと解決方法を書いておきます。

UnityException: Minimum API Level Not Supported on Requested VR Device.Cardboard Requires a Minimum API Level of 19.

指定最低APIレベルが低すぎます。この場合ですと、Level 19 ( Android4.4 )以上にする必要があります。PlayerSettingを見直してみてください。

Build completed with a result of ‘Failed’

様々な原因がありますが主には

・スマホが接続されていない。(adbで接続できているか確認)
・JDK・SDKのパスが間違っている。(External Toolsで確認)
・パッケージ名が初期のまま(PlayerSetting→PackageNameを変更)


読んでいただきありがとうございました^^

これからもどんどん記事を書いていこうと思ってますのでどうぞよろしくお願いします!!

最新の記事を見る→

Unity上で顔認識 ~Webカメラでモーションキャプチャーへの道~ Part2

どうも!洋梨🍐です!

前回の記事

[ Unity上で顔認識 ~Webカメラでモーションキャプチャーへの道~ Part1 ]

の続きになります!

マスク画像から輪郭を抽出

基本動作

UnityでのTextureのデーターは左下を0,0として保存されています。

そのため、マスクデーターも同じく左下を0,0として2次元配列として保存しています。

今回マスクデーターの配列はByte型を使用しました。bool型でも良かったのですがスタート位置をマークしたかった為、Byte型にしました。


※( Byte[ width , height ] px の引数としている部分 )

さて、ピクセルデーターから輪郭を抽出するには

このように周りのピクセルをたどっていくのが一般的なようなのでこの方法で行きたいと思います。

しかしこの処理は1フレーム事に行うため、この部分が重い処理だとフレームレート低下に繋がってしまいます。そのためアルゴリズムの最適化などが必要になります。

処理の流れ

左下の0,0からX軸方向にピクセルデータを取得していき、ヒットした点を起点として今回は反時計回りに探索していきます。

次に探索する方向が分かるように、図のように方向ごとに数字を割り振ります。

の数字を引数とした関数を作り、前回の探索した方向から次探し始めるべき方向を決めます。今回は大きい数字から少ない数字へと探索します

※たとえば4からの場合4321 9 … と探索します。

この関数では初めてピクセルにヒットし呼び出された時

4から探索を始めます。

なぜなら下から上へ・左から右へと探索してきたので、

5、6、7、8には存在しないためです。

このような法則を元に次の探索開始点を求める関数を別に用意します。

前の探索方向を元に次の開始方向を返す関数 GetNextWay( int )

※また、前の数字が偶数だった場合5回、奇数だった場合6回で探索できない場合おかしい(エラー)という事も踏まえてこの段階で例外処理も入れておきます。

このように探索していき探索後、引数としてとったピクセルデーター配列の変数(byte[ , ])を(探索したピクセルを)1から2にしていきます。

そして探索開始点に戻ってきたら処理を終了します。

探索開始時呼び出す関数 StartScan( int , int ,ref byte[ , ] )

探索するメイン関数(1) Scan(int , ref int ,ref int ,ref List<Pixel_XY>)

保存用クラス class Pixel_XY

このままだとノイズの輪郭も判定してしまっているため小さい輪郭(輪郭のピクセル数がしきい値以下)は除外するなどの処理をします。

※これらの結果は Dictionary<int, List<Pixel_XY>> result として保存されます。
また、result.Countで輪郭の総数、result[ int ].Countで [int]つ目の輪郭のピクセル数が分かるようになっています。

このデーターを元に画面に囲ったボックスを表示すると

↓ このようになります ↓

かなりそれっぽくなってきたのでは無いでしょうか?

これで大体の顔を特定できたという事で、次は体の部分を特定できるようにしていきたいと思います!!

読んでくれてありがとうございます!

他にも様々な記事を書いていますので是非見ていってくださいね^^

Unity上で顔認識 ~Webカメラでモーションキャプチャーへの道~ Part1

どうも!洋梨です!🍐

先日、Facerig + Live2D を用いてWebカメラで2Dモデルを動かしているのを見て、Webカメラで3Dモデルを動かすことはできないのか?と考えました。

※(Live2Dについてはこちら Facerigはこちら をご覧ください。)

ここで私は

1.顔を画像から探す
2.顔から下を人物と特定。
3.人物から体のポーズを取得。
4.ポーズデーターを3Dモデルに反映させる。

これが出来れば動かせるようになるのではないか?と自分は考えたのでこれから順々に作っていこうと思います。Unityはまだ使い始めて半年のためWebカメラは使用したことが無かったので、そこから順に書いていきたいと思います。

画像から顔を取得する

まずは画像から顔を取得できるようにしたいと思います。
これには定番「OpenCV」を使うことも考えたのですが、

・せっかくなら最初から作ってみたい
・Phython向き
・そもそも高度正確な抽出は必要なく、顔の位置がわかる程度でいい
・背景は部屋で撮るため単色
・余計な処理を除いて軽くしたい

という点から作ることにしました。

抽出方法についてなのですが手軽に軽く済ましたかったので今回は背景差分法RGB(HSV)を用いて肌を検出、及び顔を抽出してみました。

UnityでWebカメラから画像を取得

この部分は他にかなり参考になるサイトがあると思うので簡単な説明です。

詳しい説明が欲しい方が多いようなのでWebカメラから画像を取得する方法はこちらをご覧ください~


ソースコード

WebCamTexture を使ってカメラから画像を取得します。
また、今回は画質はを求めていないため、320×240を指定しています。


※ちなみに今回私が買った・使っているWebカメラはこちら


LOGICOOL ウェブカム HD画質 120万画素 C270

費用を抑えたかったのでかなり安いやつを選びました。私はモーションキャプチャの研究用に買ったので大丈夫ですが、「配信したい」など画質を求めて買うのはやめましょう

しかしデスクトップPCなどWebカメラがついてない方は今後の為にも購入をお勧めします。(値段もそこまでしないので)


WebCamTexture を RawImageのTextureにセットし、実行します。

Webカメラのデーターを取得できるとこのように表示することができます。

※IndexOutOfRangeExceptionなどエラーが発生する場合、カメラ番号に値するカメラが存在していない可能性があります。Windows 10に標準搭載されているカメラアプリなどで表示できるか確認してみてください。

画像から肌を検出

上のソースコードをUpdate()などに書きフレーム毎呼び出します。

Near_Color_Chack_RGB() は 入力された色と一定範囲内の色だった場合、Trueを返す自作関数です。

Near_Color_Chack_RGB(Color 32)

これで肌の色に近いピクセルを抽出することが出来ました。

また、ここにさらにHSVによる判定も加えて「PixelData[,]」からノイズを減らし、精度を多少上げます。


この段階で「pixelData[,]」をマスクとしてレイヤーを重ねて表示すれば肌の色だけ取得できているのが確認できると思います。

※なお、今回はUnityでよく使われる「Color」クラスでなく「Color32」を使っています。理由はこれにより速度を大幅に上昇させることができるからです。

これで今回は顔のマスクデーターを作成するところまで出来ました。
では次回はこのマスクデーターをさらに管理しやすくしていきたいと思います!

次へ「モーションキャプチャへの道 Part 2」


ここまで読んでくれてありがとうございます!

ホームページでは他にも

・様々な記事や作った作品および過程
・ソースコード、素材ファイル
・あらゆる”モノ”の作り方

などなど随時、記事や作品を新規公開・更新していますので是非見ていってくださいね!見ていただけると本当に嬉しいです!

また、「このアプリの作り方を知りたい。この部分どうなってるの?」「身の回りのこんなもの作れるの?」などなどご意見何でも受け付けていますので是非連絡くださいね!

3Dプリントにおける用語

どうも!洋梨🍐です!

皆さん、3Dプリンター持って(使って)いますか??

私は買って1年以上たった今でも毎日とは言いませんがかなり愛用しております^^

持っていない方は是非こちらを見て購入を検討してみてくださいね♪

今回は3Dプリンターを初めて使う方・使い始めて間もない方に向けて3Dプリンターのよく使われる用語や説明を書いていきたいと思います。

~用語~

サポート材

サポート材とは印刷における印刷物を支える土台のことです。
3Dプリンターでは底面から上に向かって積み上げるように印刷していきます。そのため、空中に浮いている部分は底面から支えるものが必要となります。それがサポート材です。

(※イメージ)
左のようなものを作りたいとすると右のようなサポート材が必要となります

ABS・PLA

プラスチックの種類のこと。
一般的に使われている3Dプリンターで出力できるのはこの2つ。簡単に比べるとABSのほうがPLAに比べて強度は高いが印刷難易度は高い。(高い温度のため反りが発生しやすい)。PLAはその逆で印刷しやすいが強度が弱く、低い温度(70度程度)での印刷のため高温な環境で使用するものには使えないというところだ。

フィラメント

電球や真空管の中身のことを想像する方も多いと思うが、3Dプリンターにおけるフィラメントとは出力に使うプラスチック(通常のプリンターでいうインク)のことである。

STL・OBJ・FBX

ファイル拡張子でどれも3Dデータである。
様々な形式があるが代表的なものを挙げた。主に3Dプリンターで使われるのは前者2つだと感じる。

G-code

3Dプリンターが印刷に使用するコード。
3Dデーターを印刷ソフトに取り込み、プリンターに次はここに動くよ!などと印刷場所を指示し動かすための設計図みたいなもの。印刷ソフトが自動で作成するため意識する必要はあまりない。

ステージ・ベッド

3Dプリンターにおける印刷物ができる台のこと。
この上に印刷される。なお、温度調節ができるものも多くABSでの印刷の時は70度程度に温めると反りが減らせる+吸い付きがよくなるため良い。

ノズル

3Dプリンターでフィラメントが出てくる部分。
この部分が温かくなり、プラスチックの材料を溶かして出力する。

FDM・熱溶解積層法

多くの3Dプリンターでとられている印刷方法のことである。
ノズルが材料を出力しながら動き、層を積み上げていく方式のこと。この方式では空中に浮いた部分にはサポート材が必要となる。

Fill Density・密度

印刷物の中に占める材料の割合のこと。
通常のFDM方式3Dプリンターでは印刷物の中を空洞にして材料を節約することができる。その節約度合いをこの設定で調節する。

ファン 設定

3Dプリンターの印刷ソフトにおけるファン設定とはノズル先端付近にあるファンの事。(ノズル横当たりにあるヒートシンクについているファンではない)。
このファンをつけることにより、出力した材料をすぐ冷ますことが出来るため、印刷スピードを上げることができます。(しかし反りがあるためオススメしません。)

まとめ

どうだったでしょうか?
今回は初心者向けに3Dプリンターを使う上で出てくる言葉をまとめてみました。この記事が少しでも誰かのお役に立てれば幸いです^^

知っておくと良い知識編もありますのでこちらもよろしければ合わせてご覧下さい!

閲覧ありがとうございました!!

3Dプリンタにおける知識

こんにちは!洋梨🍐です!
今回は3Dプリンターで印刷する前に知っておいた方がいい知識等を初心者向けにまとめて書きましたのでぜひご覧ください!

印刷向き

積層方式で印刷する3Dプリンターにおいて印刷する向き、つまり印刷するモデルの向きはとても大切です。具体的にはまずこちらをご覧下さい。

例えば上のようなモデルがあったとします。果たしてこのモデルはこのまま印刷しても良いのでしょうか?

では、例えばこうしてみてはどうでしょうか?

こうすることにより空中に浮かぶ部分が減り、サポート材が減る→印刷品質の向上になる訳です。積層方式の3Dプリンターの特性上、浮かぶ部分の印刷が苦手です。よって、いかに浮いている部分が少なくできるかが上手に印刷するための秘訣なのです。

※ちなみにフィギュアなどは頭を下にし、斜めにすると良いようです。

印刷スピード

3Dプリンターにおける印刷スピードとは最低面を印刷する時のスピード、通常印刷スピード、ヘッド移動スピード、引き戻しスピードなどなど沢山あります。というかあり過ぎます。

ここで最も大切なのは最低面の印刷スピードと通常の印刷スピードです。それぞれ変更によりどんな効果があるかを説明します。

・最低面の印刷スピード

これは名前の通り最低面、一層目の印刷をする時のスピードです。この速度が別になっている理由は、一層目だけ速度をゆるめてステージへとしっかりと吸い付くようにです。

つまりステージへの吸い付きが悪い場合この設定を見直せばいいということです。

・通常の印刷スピード

こちらは名前の通り、通常の印刷スピードです。速度を上げることにより印刷完了までの時間を短縮することができますが、早くするにつれファンの使用が必要になったり、印刷ミスが起きやすくなったりしますのでこちらは感覚での操作となります。

印刷精度

印刷ソフト等で指定できるこの印刷精度とは具体的にはどの位の厚さの層を重ねて印刷するか、という設定になります。

この設定は印刷完了までの時間に大きく関わる部分なので出力するものに合わせて変えた方が良い設定です。

球体など丸みがあるものを作る時は精度を細かく、型など四角く丸みがないものは精度を荒くするのがいいと思います。

細かい方が良い例。0.3mmと0.1mmではこのくらい段差の目立ち具合が違う。

丸みがないものは精度によって対して形は変わらないため時間短縮のために荒くしても〇

ステージ(ベッド)温度

印刷途中でズレる印刷ミスをしてしまう場合この温度を上げて吸い付きを良くする。夏と冬でも適切な温度は変わってくるので感覚での調節となる。また、3Dプリンターを

このようにプラ板等で囲むのも保温効果があり、反りが減るため良いです!

また、印刷物のズレがひどい場合こちらを参考にしてみてください。マスキングテープはとっても良い手段だと思ってます!

まとめ

いかがだったでしょうか?この記事が少しでも皆さんの役に立てれば光栄です!
ものづくりに関する記事はこれからもどんどん書いていくのでもしよければ是非見に来てくださいね^^