ひつじTips

技術系いろいろつまみ食います。

[Unity]ShaderでテクスチャのUVを操作して目の注視(LookAt)っぽいことをしてみる

f:id:mu-777:20190713135728g:plain
カメラの位置が移動すると,その方向に黒い丸(黒目)が向く

こういう感じに,目がこっちを常に見てくる(LookAtする)のをテクスチャのUV操作で実現する,というネタです.(黒い丸が黒目,という設定です!心の目で目を見てください!)
なにげにこのブログでUnityネタは初かも.まぁUnityはいろいろな方が書いた記事がめちゃくちゃあるし,あんまり書くことがないんすよね(いつもお世話になっております>各位).

背景としては,後輩さん(@Korechi_)が言っていた「OculusQuestのGuardianを使ってなにかやりたい」というネタをパクって考えていて,Guardianという名前からインスパイアされてのジャストアイデアで,1984のBigBrother風のネタを思いついて実装してみたのがコレです.

で,コレをするときに,壁の目がユーザをLookAtさせたいなということで,このUV操作でLookAtをやりました.それのやりかたを忘れないようにここに書いておきます.

  • 方針
    • 方針の具体化
  • 実装
  • おまけ:目の感じにするには
  • 最後に
続きを読む

UE4のアプリをJetson Nanoで動かす!(という名の,UE4でLinux-Arm環境向けにクロスコンパイルする方法)

f:id:mu-777:20190501014135j:plain


こんな感じのことができます.


全てはここの情報に従っています.

サマリとしては,UE4のソースをちょっっっっとだけ編集して,ビルドすればできました.

ただ,今思えばUE4のビルドまでしなくても,ToolchainのダウンロードアプリでのTargetの設定 だけで大丈夫そうな気もします.が,まぁいいか.どなたか試していただきたく.


以下の作業は,Windows10,ThinkPad x1 Carbon 2018(Intel Core i7-8550U)の環境で,UE4のバージョンは4.21で行いました.

迷いつつ/中断しつつでやったのでなんとも言えませんが,スムーズにいっても1日がかりだと思います.UE4のビルド,初回はめっちゃ長いので...
なにか暇つぶしがあるといいかもしれません.(自分は結構アニメ見ながらビルド待ったりしてました)

  • 準備
  • UE4のビルド
  • アプリのビルド
    • アプリでのTargetの設定
    • アプリをビルド
  • アプリの実行
続きを読む

明治大渡邊恵太研「さよならメインストリーム〜解なきダイバーシティ時代におけるデベロッパー中心で切り開くエコシステム」へ行ってきた

明治大の渡邊恵太研が主催した「さよならメインストリーム〜解なきダイバーシティ時代におけるデベロッパー中心で切り開くエコシステム」のイベントへ行ってきました.

f:id:mu-777:20190316163138p:plain
PDUピラミッド(公式ページより)

keita-lab.jp

渡邊恵太先生が提案している「プラットフォーマー(P)」「デベロッパー(D)」「ユーザー(U)」で成す「PDUデザイン」をテーマに,様々なゲストを呼んでのトークがありました.

いろいろ面白いお話を聞くことができたので,各セッションの話と,自分がこの講演を通じて考えた(だけで結論はない)

  • プラットフォームがうまく機能するかは,ドメインの問題?機能性の問題?コンテンツの問題?
    • あんまり粒度がそろってないけど...
    • あと,結局どれも大事なんだろうけど
  • 自分中心な設計手法って現実的にはどううまくやっていけばいいの??
    • 日本の大企業メーカでも中の人は結構みんな技術好きだよ(観測範囲では) でも現実的にうまくやってくのは難しい気がする(観測範囲では)
    • 特にハードが絡むモノは地獄感ある...
  • インタラクション系の研究がアカデミックとしてどうなの問題について
    • イベントの本筋とは関係ないけど話の流れで出てきたので
    • 他分野出身でちょっっとだけHCI系を覗いてた自分が雑感として思ってたことを, HCI系大家の恵太先生も思ってるんだな,という気持ち

あたりの話をメモっておこうかと思います(と思ったけど,自分の考えたことは別記事にします.長すぎる...).

  • PDUピラミッドで許容するダイバーシティニーズと設計(渡邊恵太先生)
  • プラットフォーマーとは何か?(深津さん(ピースオブケイクCXO)・洛西さん(Nota Inc. CEO))
    • どのユーザもデベロッパーになれる,という話
    • Pの機能追加をどう決めていくか,から発展していった汎用性の考え方と自分中心デザインの話
    • 自分中心デザインとデザイン思考の関係について,の話
    • プラットフォームを育てていくためにどうしていくか,な話
  • DEVELOPER RELATIONS /エヴァンジェリスト/アドボケイトとは?(戸倉さん(日本IBM))
  • DEVELOPER EXPERIENCE(赤塚さん(Mozilla)・簗瀬さん(Unity/東大)・加藤さん(産総研/アーチ))
    • Unityはなぜここまで広がったか,の話
    • インタラクション研究って積み上げ難しいよね,という話
  • ハードウェアとプラットフォーム(田中あきちかさん(SIE)・小林さん(IAMAS))
    • ハードウェアプラットフォームの難しいよね,という話
    • ハードウェアプラットフォームのエコシステムについて,の話
  • まとめ
続きを読む

VRM モデルのスケールを変更すると,髪揺れがおかしくなる件の対策②

ちょう恥ずかしい.....
VRM モデルのスケールを変更すると,髪揺れがおかしくなる件の対策 - ひつじTips で全然問題解決できてなかったっす.....

なんかなーーーーここで確かにGizmoの球の位置おかしーな~と思ってたんよなぁーーーーー

f:id:mu-777:20190104045115p:plain

しかもまさかのTypo的なミスもしてるんよなぁーーーーーーーーーー

だめだ..深夜テンションで書くと絶対ミスってるので,一晩寝かせないといかんすな
(と言いつつ本記事も寝かさずにお気軽にUPしちゃうけど)

解決方法②

前記事と同じく,VRM/UniVRM/Scripts/SpringBone/VRMSpringBone.cs287行目あたりからを,

今回は以下のように修正します.

                foreach (var group in ColliderGroups)
                {
+                   var groupGlobalScale = Mathf.Max(Mathf.Max(group.transform.lossyScale.x,
+                                                              group.transform.lossyScale.y),
+                                                    group.transform.lossyScale.z);

                    if (group != null)
                    {
                        foreach (var collider in group.Colliders)
                        {
                            m_colliderList.Add(new SphereCollider
                            {
                                Position = group.transform.TransformPoint(collider.Offset),
-                               Radius = collider.Radius,
+                               Radius = collider.Radius * groupGlobalScale,
                            });
                        }
                    }
                }
            }

            var stiffness = m_stiffnessForce * Time.deltaTime;
            var external = m_gravityDir * (m_gravityPower * Time.deltaTime);
+           var globalScale = Mathf.Max(Mathf.Max(transform.lossyScale.x,
+                                                 transform.lossyScale.y),
+                                       transform.lossyScale.z);
            foreach (var verlet in m_verlet)
            {
-               verlet.Radius = m_hitRadius;
+               verlet.Radius = m_hitRadius * globalScale;
                verlet.Update(m_center,
                    stiffness,
                    m_dragForce,
                    external,
                    m_colliderList
                    );
            }
        }


前記事ではまさかのGlobalScaleの計算のところでTypoして,thisのtransform.lossyScale.zを持ってきちゃってたというね. やっちまったね.

さらに加えて,HitRadius側にも修正入れてます. これしないと,デフォルトのm_hitRadiusの大きさ(0.02f)が影響してくるぐらいモデルを小さくしたときに影響出ます(日本語不自由)

あとGizmo側も変更.

VRM/UniVRM/Scripts/SpringBone/VRMSpringBoneColliderGroup.cs33行目あたりからを,今回は以下のように修正.

            Matrix4x4 mat = transform.localToWorldMatrix;
            Gizmos.matrix = mat;
-           Gizmos.matrix = mat * Matrix4x4.Scale(new Vector3(
-               1.0f / transform.lossyScale.x,
-               1.0f / transform.lossyScale.y,
-               1.0f / transform.lossyScale.z
-               ));
+           //Gizmos.matrix = mat * Matrix4x4.Scale(new Vector3(
+           //    1.0f / transform.lossyScale.x,
+           //    1.0f / transform.lossyScale.y,
+           //    1.0f / transform.lossyScale.z
+           //    ));
            foreach (var y in Colliders)
            {
                Gizmos.DrawWireSphere(y.Offset, y.Radius);
           }


ここコメントアウトするだけでよかった!!!!!

てかわざわざスケールの逆数をかけてるのだからこれはある意味仕様っぽい...でも変えたいんすけど...

個人的にはGizmoもロジック側と合わせて,以下のように書きたい...

-           Matrix4x4 mat = transform.localToWorldMatrix;
-           Gizmos.matrix = mat;
-           Gizmos.matrix = mat * Matrix4x4.Scale(new Vector3(
-               1.0f / transform.lossyScale.x,
-               1.0f / transform.lossyScale.y,
-               1.0f / transform.lossyScale.z
-               ));
+           //Matrix4x4 mat = transform.localToWorldMatrix;
+           //Gizmos.matrix = mat;
+           //Gizmos.matrix = mat * Matrix4x4.Scale(new Vector3(
+           //    1.0f / transform.lossyScale.x,
+           //    1.0f / transform.lossyScale.y,
+           //    1.0f / transform.lossyScale.z
+           //    ));

+           var globalScale = Mathf.Max(Mathf.Max(transform.lossyScale.x,
+                                                 transform.lossyScale.y),
+                                       transform.lossyScale.z);
            foreach (var y in Colliders)
            {
-               Gizmos.DrawWireSphere(y.Offset, y.Radius);
+               Gizmos.DrawWireSphere(this.transform.TransformPoint(y.Offset), y.Radius* globalScale);
            }
        }

最後に

まだミスあったらどうしようかな...他人のコードむずいね...

VRM モデルのスケールを変更すると,髪揺れがおかしくなる件の対策

f:id:mu-777:20190104025438p:plain
https://dwango.github.io/vrm/

VRMなかなか楽しいっすねぇ~

VTuber的な使い方以外にも,常にモデルデータを求めているであろう個人ゲーム開発屋さんなども使いやすいのではないでしょうか??VRoidStudioでお手軽に作って,UniVRMでUnityに簡単インポートすれば,それでゲームも作れちゃいますしね~

ただ,そこで微妙にUniVRMのバグっぽい挙動なのが,VRMモデルのスケールを変更したときです.

VRMのルート(VRMMetaなどのComponentがあるGameObject)のスケールを小さくすると,髪の毛が爆発しますw

f:id:mu-777:20190104033244p:plain

小さい方をアップでもう一度.

f:id:mu-777:20190104042328p:plain

えらいこっちゃですね.

まぁVRMのルートのGameObjectを選択すればわかるのですが,単純にSpringBorn用のColliderのRadiusがスケール変更に対応できていないっぽいだけですね.

f:id:mu-777:20190104042521p:plain



この記事の内容だけだとちゃんと解決できません!!

こちらにもうちょい正しい(と思われる)修正方法書いたのでこちらをどうぞ!!

mu-777.hatenablog.com



解決方法

「実際に物理演算に有効なColliderのサイズ」と「Gizmoのマゼンタ球のサイズ」はそれぞれ別のところで処理されているので,その2つの処理部分に修正を入れてやれば解決できます.

まずは「実際に物理演算に有効なColliderのサイズ」の修正から.

VRM/UniVRM/Scripts/SpringBone/VRMSpringBone.cs287行目あたりからを, 以下のように修正します.

                foreach (var group in ColliderGroups)
                {
+                   var globalScale = Mathf.Max(Mathf.Max(group.transform.lossyScale.x,
+                                                         group.transform.lossyScale.y),
+                                               transform.lossyScale.z);
                    if (group != null)
                    {
                        foreach (var collider in group.Colliders)
                        {
                            m_colliderList.Add(new SphereCollider
                            {
                                Position = group.transform.TransformPoint(collider.Offset),
-                               Radius = collider.Radius,
+                               Radius = collider.Radius * globalScale,
                            });
                        }
                    }
                }


あと,「Gizmoのマゼンタ球のサイズ」の修正は,VRM/UniVRM/Scripts/SpringBone/VRMSpringBoneColliderGroup.cs33行目あたりからを,以下のように修正.

            Gizmos.matrix = mat * Matrix4x4.Scale(new Vector3(
                1.0f / transform.lossyScale.x,
                1.0f / transform.lossyScale.y,
                1.0f / transform.lossyScale.z
                ));
+           var globalScale = Mathf.Max(Mathf.Max(transform.lossyScale.x,
+                                                 transform.lossyScale.y),
+                                       transform.lossyScale.z);

            foreach (var y in Colliders)
            {
-               Gizmos.DrawWireSphere(y.Offset, y.Radius);
+               Gizmos.DrawWireSphere(y.Offset, y.Radius * globalScale);
            }


これでOKです!

確認

上の修正を入れると,このような感じになります.

f:id:mu-777:20190104045001p:plain

小さい方をアップで見てもだいじょーぶ.Gizmoのマゼンタ球も小さくなっていることがわかります.

f:id:mu-777:20190104045115p:plain

最後に

この記事で使ったVRMは,僕がVRoidStudioで作ったVRMです!

hub.vroid.com

あおいちゃんかわいい!!!!!!!!
見てね!!!!!!!!!!

WSL ubuntu18.04 に ROS Melodic を導入する際「1.3 Set up your keys」でgpgが「IPC connect call failed」「keyserver receive failed: No dirmngr」でコケる問題

小ネタなのであっさりで.

問題

WSLのubuntu18.04に,ROS Melodicを導入する際,いつもどおりmelodic/Installation/Ubuntu - ROS Wikiを参考に進めるが, 「1.3 Set up your keys」で,

$ sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key 421C365BD9FF1F717815A3895523BAEEB01FA116

を実行すると,

Executing: /tmp/apt-key-gpghome.cb5k8GtOFh/gpg.1.sh --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key 421C365BD9FF1F717815A3895523BAEEB01FA116
gpg: connecting dirmngr at '/tmp/apt-key-gpghome.cb5k8GtOFh/S.dirmngr' failed: IPC connect call failed
gpg: keyserver receive failed: No dirmngr

というように失敗する.そしてそのまま「1.4 Installation」へ進んでもROSはインストールできない.

「If you experience issues connecting to the keyserver, you can try substituting hkp://pgp.mit.edu:80 or hkp://keyserver.ubuntu.com:80 in the previous command.」と書いているが,
keyserver を変更しても,この問題は解決しない.

解決策

下記を実行する.

$ wget http://packages.ros.org/ros.key -O - | sudo apt-key add -

レスポンスは以下のような感じ.

--2018-12-11 02:17:39--  http://packages.ros.org/ros.key
Resolving packages.ros.org (packages.ros.org)... 64.50.233.100, 140.211.166.134, 64.50.236.52
Connecting to packages.ros.org (packages.ros.org)|64.50.233.100|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1162 (1.1K)
Saving to: ‘STDOUT’

-                                     100%[=========================================================================>]   1.13K  --.-KB/s    in 0s

2018-12-11 02:17:40 (31.7 MB/s) - written to stdout [1162/1162]

OK

その後,「1.4 Installation」へ進んで,

$ sudo apt update
Hit:1 http://archive.ubuntu.com/ubuntu bionic InRelease
Get:2 http://archive.ubuntu.com/ubuntu bionic-updates InRelease [88.7 kB]
Get:3 http://security.ubuntu.com/ubuntu bionic-security InRelease [83.2 kB]
Get:4 http://packages.ros.org/ros/ubuntu bionic InRelease [4031 B]
Get:5 http://archive.ubuntu.com/ubuntu bionic-backports InRelease [74.6 kB]
Get:6 http://packages.ros.org/ros/ubuntu bionic/main amd64 Packages [335 kB]
Get:7 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 Packages [455 kB]
Fetched 1041 kB in 5s (217 kB/s)
Reading package lists... Done
Building dependency tree
Reading state information... Done
115 packages can be upgraded. Run 'apt list --upgradable' to see them.
$ sudo apt install ros-melodic-desktop-full
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
  adwaita-icon-theme at-spi2-core autoconf automake autopoint autotools-dev avahi-daemon binfmt-support blt bzip2-doc cmake 
[snip]

と,インストールを始められる.

原因

WSLのubuntu18.04でgpgのバグが治っていないらしい...
(gpgがなにかは詳しく知らない...勉強しよ...)

参考

https://github.com/Microsoft/WSL/issues/3286

https://answers.ros.org/question/307024/win10-wsl-problems-installing-ros-on-ubuntu-1804/

[UE4]キーボードイベントの短押し/長押し切り分け処理

Unity勢に負けずにUE4勢もがんばりましょう!

ということで,UE4の小ネタです.

UE4はブループリントでキーイベントなど簡単に取れるのですが,短押しだけでなく長押しも取りたいよね,というお話です.

以下の方法もありますが,本記事で紹介するのは長押し時のイベントを取るようなバージョンです.

miyahuji111.hatenablog.com

やりかた

「SetTimerByEvent」ノードを使います.

以下のようなマクロ(「KeyEventSwitcher」)を作ると,キーイベントの長押し/短押しを切り分けて処理できます.

f:id:mu-777:20181127234705p:plain

仕組みは凄くシンプルで,

  • PressしてからLongPressDuration過ぎる前にReleaseしたら,ShortPressedEventをセットしてすぐ発火させる
  • PressしてからセットしたLongPressedEventが発火したら,ShortPressedEventはセットしない

という感じです.

使うときはたとえば以下のように使います.

f:id:mu-777:20181127231527p:plain

このときEnterを押して,

  • 2秒以内にEnterを離せば(Releaseすれば)ShortPressedEventが呼ばれます.
    • そのあと,KeyEventSwitcherの後ろのExecピンのShortPressReleasedからの処理が走ります
  • 2秒間Enterを押し続けていれば,LongPressedEventが呼ばれます
    • そのあと,Enterを離したタイミングでKeyEventSwitcherの後ろのExecピンのLongPressReleasedからの処理が走ります

という処理になります

かくにん

実際このKeyEventSwitcherマクロを使うとどうなるか確認します.

レベルブループリントに,以下のようなノードを組みます.

f:id:mu-777:20181127233113p:plain

ここで「PrintMessage+Time」とは,引数のStringに時間をつけてPrintしてくれるだけのマクロです.

f:id:mu-777:20181127231806p:plain

これを実行してみます.

すると,以下のようにプリントされます.

f:id:mu-777:20181127233512p:plain

ちゃんと,

  • Pressして2秒以内にReleasedしたら「ShortPressed」が
  • Pressして2秒経ってもReleaseされなければ「LongPressed」が

呼ばれていると思います!

さいごに

まぁ正直ぼくもUnityの方が好きですけど...

ブループリントのマクロはパズル的面白さがあって,これはこれで好きです笑