zawazawa雑記

シャリだけでも美味しく寿司が食える方法

くだらないネタ考えたのでやりました

先日のxR Tech Tokyoでこの記事の話が出ました。

www.wantedly.com

いろんな人がこれをネタに持って行こうとしているようなので自分もそれに乗っかろうとして、思いついたのが、

「シャリにARマーカーくっつけて自分の好きなネタ乗せれば良くない??」

f:id:zawazawahtn:20180625123501p:plain:w100

です。ネタを思いついてしまった以上責任を持って実現をさせようというくだらない記事です。

別に寿司ネタとかけてるわけじゃないんだからね。

ちょうどいい機会

XR分野の研究を始めて1ヵ月ぐらいで、ちょうどいい機会だったのでVuforiaを初めて使ってみました。

Developer登録とかDatabaseのtargetimage追加とかのフローはいくらでも記事があるのでそちらをみてください。

出来上がってしまったネタ

寿司ネタを3つ(2つと1体)用意しました。お粗末なマグロとタマゴと可愛いユニティちゃんです。

作ってる途中で「これ、正当な寿司ネタだけじゃなくても乗せられるよね??」と思ってしまった自分、たちが悪いです。

f:id:zawazawahtn:20180625114332p:plain
途中でバカバカしくなって笑いながら作ってました

ARマーカーは海苔で作ろう

シャリにはやっぱり海苔でARマーカーつけるのが最適でしょう。 ということで海苔を買って切ってARマーカーにしようと思います。近くに海苔を売ってるところがなかったのでおにぎりの海苔を使いました。パリパリしてなくて、引っぺがしたらご飯もくっついてました。ここがくだらなさポイントの頂点です。

f:id:zawazawahtn:20180625114233j:plain:w200
おにぎり買ってきた

f:id:zawazawahtn:20180625114239j:plain:w200
ARマーカーできた笑

薄々感じてはいた

だめかーー

f:id:zawazawahtn:20180625114422p:plain
認識してくれなかった泣

ふにゃふにゃの海苔を使ったのがまずいけない笑。エッジもクソもない。 あと海苔の光沢もダメだろう。

(そもそもおにぎりを使ってシャリを使わなかったんかいというツッコミはナシでお願いします。金欠でした。)

ちなみに正確なマーカーではうまくいきました

f:id:zawazawahtn:20180625120028p:plain

f:id:zawazawahtn:20180625120036p:plain

f:id:zawazawahtn:20180625120042p:plain

得られた知見

まず何より食べ物で実験すると、その後美味しくいただきましたができる。

あとはiphone上で動かそうとすると、画面が真っ暗になる状態に陥りました。環境はvuforia7+Xcode9.3+iOS11.3。どうやらvuforia側の問題のようです。参考

システム的なコンフリクトに立ち向かうのも無駄だと思ったので今回はPCでやりました。いつかチャチャっと直せるようになりたいです。

ユニティちゃんのロゴもちゃんと載せないと。

f:id:zawazawahtn:20180625114137p:plain:w100

【Unity】ボタンの下にあるオブジェクトへのタップイベントを無効化する

想定

UnityでiPhoneのARkitを使った簡単なアプリを作っている時にぶつかった課題です。

ボタンの下は押したくない

uGUIを設置した時に、ボタンの下に検出された平面のタッチイベントまで取得してしまって、意図しない挙動をしてしまった。

なんだか色々解決策がある...

でも絶対もっと簡単にやれるって!って思って調べたところ本当に簡単にできました。

あくまで、自分のケースですが。

手法

UnityARHitTestExample.csスクリプトのUpdate関数内の条件分岐に一言「ボタンがあればタッチイベントを無視しますよ」と加えるだけ。

あ、あとスクリプトの頭にusing UnityEngine; using UnityEngine.EventSystems;の2行を加えるだけ。

        // Update is called once per frame
        void Update () {
           #if UNITY_EDITOR   //we will only use this script on the editor side, though there is nothing that would prevent it from working on device
            if (Input.GetMouseButtonDown (0)) {
                Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);
                RaycastHit hit;
                
                //we'll try to hit one of the plane collider gameobjects that were generated by the plugin
                //effectively similar to calling HitTest with ARHitTestResultType.ARHitTestResultTypeExistingPlaneUsingExtent
                if (Physics.Raycast (ray, out hit, maxRayDistance, collisionLayer)) {
                    //we're going to get the position from the contact point
                    m_HitTransform.position = hit.point;
                    Debug.Log (string.Format ("x:{0:0.######} y:{1:0.######} z:{2:0.######}", m_HitTransform.position.x, m_HitTransform.position.y, m_HitTransform.position.z));

                    //and the rotation from the transform of the plane collider
                    m_HitTransform.rotation = hit.transform.rotation;
                }
            }
           #else
            if (Input.touchCount > 0 && m_HitTransform != null)
            {
                var touch = Input.GetTouch(0);

###################### ここのした一行に手を加えるだけ!!! ###################### 
                if ((touch.phase == TouchPhase.Began || touch.phase == TouchPhase.Moved) && !EventSystem.current.IsPointerOverGameObject(Input.GetTouch(0).fingerId)) 
############################################################################
                {
                    var screenPosition = Camera.main.ScreenToViewportPoint(touch.position);
                    ARPoint point = new ARPoint {
                        x = screenPosition.x,
                        y = screenPosition.y
                    };

                    // prioritize reults types
                    ARHitTestResultType[] resultTypes = {
                        ARHitTestResultType.ARHitTestResultTypeExistingPlaneUsingExtent, 
                        // if you want to use infinite planes use this:
                        //ARHitTestResultType.ARHitTestResultTypeExistingPlane,
                        ARHitTestResultType.ARHitTestResultTypeHorizontalPlane, 
                        ARHitTestResultType.ARHitTestResultTypeFeaturePoint
                    }; 
                    
                    foreach (ARHitTestResultType resultType in resultTypes)
                    {
                        if (HitTestWithResultType (point, resultType))
                        {
                            return;
                        }
                    }
                }
            }
           #endif

        }

本当に簡単にできた。優勝。

ポイントはEventSystem.current.IsPointerOverGameObject(Input.GetTouch(0).fingerId)っぽいですね。

参考にさせていただいたサイト

nn-hokuson.hatenablog.com

Unity + ARkit + MMDモデル + MMDモーションの実現

現実とバーチャルを横断したい

今回、習いたてのUnityでタイトルにあるものを作ってみました。 結構ハードル高かったですが、色々な記事を参考にして作りました。

目標

Unity上でMMDモデルとMMDモーションくっつけてそれをARkitで現実世界に召喚しよう!

動作環境

  • macOS 10

  • Unity 2017.4.2

  • iPhoneX iOS 11.3

参考サイト

お借りしたもの

手順

全体の流れとしては、

  • UnityのARkitプラグインをimport

  • お好きなMMDモデルとモーションデータ(vmdファイル)をproject内に移動

  • MMD4Mecanimパッケージをimport

  • MMDモデルとモーションデータをUnity上で動かせるようにMMD4Mecanimで変換(fbxファイルの生成)

  • アニメーションの作成

  • ARkitに対応づけ

です。以下で細かく見てみましょう。

  1. まずARkitプラグインをAssetStoreからimport しましょう。Freeです。素晴らしい。

    f:id:zawazawahtn:20180608010024p:plain

  2. お借りしたキズナアイMMDモデルもフォルダごと持ってきてしまいましょう。

  3. 次にいきなり厄介なのですが、MMD4Mecanimをimport します。どうもこの手順が一癖あるようで(バージョンにもよると思いますが)、丁寧にやっていきます。

  4. まず現時点で最新版のMMD4Mecanim_Beta_20180523のpackageを全てimportしてきます。次に、MMD4Mecanim_Beta_20160815PMX2FBXの項目のみをimportします。こうしないとMMDモデルからUnity上で扱えるFBX形式のモデルに変換が出来ないようです。↓のような具合になると思います

    f:id:zawazawahtn:20180608101908p:plain

  5. ではここからfbxモデルの生成に移ります。キズナアイフォルダの中にkizunaai.MMD4Mecanimというものが出来ていると思うので、規約に同意の上、動かしたいモーションをVMD欄にD&Dしてprocess

    f:id:zawazawahtn:20180608102555p:plain:w300 f:id:zawazawahtn:20180608102704p:plain:w300

  6. 無事fbxモデルが生成されると、指定したパスにモデルが出来上がります。

  7. これをやる必要があるのか検証してないですが、モデルのRigをHumanoidに設定してApplyするとエラーが出る箇所があります(Genericでも動くらしい?)。importメッセージを見ると、joint_hidariteoyayubiが 重複して参照されてしまってるよ、という事なので、configから実際に見てみるといかにもえらってそうな赤が見つかります。これを右手のものと比べながら正しいもの(joint_hidaritekubi)に設定してやると、解消できました。

    f:id:zawazawahtn:20180608113827p:plain:w300 f:id:zawazawahtn:20180608113832p:plain:w300

  8. ここへきてようやくモデルをsceneに移します。各自の嫁を召喚しましょう。HitCubeの子の位置に持ってきてやります。

    f:id:zawazawahtn:20180608182312p:plain

  9. あとは自由にチューニングしてください。自分の場合、このままではモデルが小さすぎると思ったのでscaleを3倍の3に設定して、HitCubeも邪魔なので消しました。あとocclusionも表現したかったので、GereratePlanesオブジェクトのPlane Prefabdebug planeだったものをocclusion planeに変更しました。これによってカメラから検出した平面にモデルが重なったらモデルを隠してくれるようになります。

出来上がり!

おわりに

ARkit2.0が発表されましたね!縦平面の検出とか状態保存とか端末同期とかで実現できることがたくさんありそうでワクワクします!(まだベータ版ですが)

【Unity】始めました

遅ればせながら感がすごい

VR/AR方面の研究や活動をしようとするとやっぱり必要になってくるというか、便利になってくるものがUnityですよね。

自分も今更ながらやり始めました。お手柔らかに。

参考書ベースでやります

 これを読み進めながらやっていきます。

Unity5 3D/2Dゲーム開発実践入門 作りながら覚えるスマートフォンゲーム開発

Unity5 3D/2Dゲーム開発実践入門 作りながら覚えるスマートフォンゲーム開発

 

 

やったこと

今回はこの参考書のChap3に書かれている内容を元にゲームをUnityで作成し、実際に実機(iPhoneX)で動かしてみるところまでやりました。

 

実機に転送する

踏まなければいけない手順がいくつかあります。まずビルドの流れですが、

Unityでビルド(プラットフォームをiPhoneにswitchした上で) => ビルドして作成されたフォルダからXcodeプロジェクトを開く => Xcodeから実機に移す

 

この際に困ったことを数点挙げます

 

・エラー箇所

ビルドしたプロジェクトをXcodeで開くとこのようなエラーが出ました。

f:id:zawazawahtn:20180530121025p:plain

 

自分の場合、これはiTunesを開いていたので発生してしまいました。

 

おしまーい

だいぶ雑な内容を書いてしまった。反省。

それにしてもこの参考書は結構役に立って、最低限必要な知識は付けさせてくれるように思います。

次回は面白い内容なので文章の方も頑張って書きます(いつも途中からめんどくさくなってしまう)。

 

【論文紹介】すごいと思った機械学習の論文

概要

Neural Best-Buddies- Sparse Cross-Domain Correspondence

著者:Kfir Aberman, Jing Liao, Mingyi Shi, Dani Lischinski, Baoquan Chen, Daniel Cohen-Or

こちらの論文を読みました。 これは、cross-domainな2つの画像のマッチするポイントを高精度に導出してくれる手法です。 たとえ入力した2つの画像同士の詳細な形や色、姿勢が違っていても、下の図のように対応点を示してくれます。

f:id:zawazawahtn:20180601185356p:plain

アルゴリズム

ざっくり言うと、下の図(a)の左下のような"深い"層から、2つの画像の"意味的"に一致する箇所(仮にpとする)を導出します。それを"浅い"層に持ち上げていくに従って点から面に範囲の広がったpに対してまた更に一致する箇所を導出していく、といった感じです。浅い層に行けば行くほど”意味的”な一致からエッジやコーナーといった"形式的"なシフトする、みたいな記述もありました。

f:id:zawazawahtn:20180601190529p:plain

すごいと感じた点

単純に、これだけの精度が上がると実現する社会実装の数が(image morphingの分野において)前例がないだろうと思いました。要するにこの技術に触れるユーザー数的な観点でインパクトが大きい、という意味です。

image morphingやHybridizationとcross-domain correspndenceは深く関わり合っています。以下に論文中で紹介されていたアプリケーションを示します。 画像全体のmorphingはもちろん、画像間の対応点も高精度に導出できているので、任意の範囲でのmorphingも可能になっています。

f:id:zawazawahtn:20180601191939p:plain

【VRChat】始めました

なんか流行ってるっぽい

f:id:zawazawahtn:20180531134831j:plain:w100

VRChatが巷(少なくとも自分のSNSではその流れが来てる)で流行ってるっぽいので自分も始めました(まだ遅くないはず...)。

そもそもVRChatとは

自分の知ってる限りで記述すると

  • ジャンルとしてはメタバース(meta + universe)と呼ばれるものらしいです

  • 自分はアバターになってWorldと呼ばれる仮想空間上で行動し、あれやこれやするといったコミュニケーションプラットフォームです

  • 要するに"Second Life"的なものです、やったことないから知らないけれど

参考にさせていただいたサイト

VRChat 日本wiki

こんな感じでアバターが作成されます。画像はUnityちゃん f:id:zawazawahtn:20180531140747j:plain

世界中の人がいるthe Hubと呼ばれるworldです。コミュニケーションはVoiceのみでtextベースのやり取りはできないみたいでした。 ちなみに自分はここでデッドプールにりんご食べさせてもらったり、虹色ミクにひたすらハート投げつけてたりしました(友達になりたかった)。 f:id:zawazawahtn:20180531140752j:plain

おわりに

今回は単に使ってみたってだけの記事でした。次は

  • 3Dモデルを実際に作る

  • HMDをかぶった上で遊んでみる(今回はPCディスプレイで遊んだ)

をやってみようと思います。

ちなみに某フリマアプリの研究開発?部門がVRChat上での採用面接活動を開始したみたいですよ笑

エンジニア向け2018夏インターンまとめ

神まとめです

大学の知り合いからこんなものをもらったので、せっかくなので共有・発信しておきます。(おそらくネットに載せて大丈夫だと思われる)

以下のGoogleスプレッドシートを参考に↓

docs.google.com

みなさん良い夏を。