ひつじTips

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

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の方が好きですけど...

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

東京大学制作展2018(iiiEx)行ってきた

最終日の終了2時間前に滑り込みギリギリで,東京大学制作展2018「"Dest-logy" REBUILD」に行ってきました!

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

www.iiiexhibition.com

クオリティの高さもさることながら,きちんと体験を通じてのメッセージを規定しているものが多くて,まさにアートという感じのものが多い印象でした.

僕もアートなことしたいなぁと刺激をもらった展示でした!

下にいくつかピックアップして感想を書いておきます.
(全体的に暗かったから写真がツラい...)

  •  自律する影
  • 二重人殻
  • モーツァルトのゆりかご
  • 生の装い
  • 全体を通じて
続きを読む

オレオレgitをまとめる

なんかいっつもググってるので,いい加減まとめる.

自分用なので,特に詳細な解説はなしで

  • コミットするとき関連
    • 部分的にAdd
    • Addした内容の確認
  • コミット間違えたとき関連
    • commitの取り消し
    • addの取り消し
    • addし忘れてcommitしちゃったとき
    • 直前のコミットのメッセージ修正
    • なんかいろいろバグった...ローカルは死んでもいいから,リモートの状態を強制的にローカルに持って来たいとき
  • リモートとのやりとり
    • リモートの別ブランチを取ってくるとき
    • マージコミットなしでpull
  • tag関連
    • 今のブランチのtagを確認
    • 指定のtagにcheckout
  • git submodule関連
    • まず最初に持ってくるとき
  • コミットメッセージ関連
続きを読む

[Fusion360]複数のコンポーネントの組み合わせで1つのコンポーネントを作るための(オレオレ)ベストプラクティス

Fusion360使ってますか???

フリーのパラメトリックCADとしては他と一線を画した機能の充実っぷりとUIの洗練っぷりではないかと思います.
(そもそもフリーのパラメトリックCADが他にあんまりないですがね...FreeCADも結構好きなのですが)

f:id:mu-777:20180716222115p:plain:w600

www.autodesk.co.jp

まぁさすがに有料CADに比べれば「これできないのか~」と思うこともありますし,クラウドベースなので結構重かったりオフライン環境での挙動に不安があったりしますが,そこまで致命的な問題はないですし,フリーなんで文句はないですね.

で,同じ会社の方と机の下でやってるプロジェクトで,Fusion360を使って下のようなパーツを作ってました.

f:id:mu-777:20180716180420p:plainf:id:mu-777:20180716191240p:plain
CAD図と実際3Dプリンタで刷ったもの

見りゃわかると思いますが,4つの穴の空いた面が3面ありますね.もちろん全部の穴の寸法は同じです.

これ3面に対して3回CADで線引くなんてやるのは,めちゃくちゃめんどくさいし,寸法変更時のパラメトリックCADの恩恵を全く受けられないのでFusion360使う意味がなくなっちゃいますね.

こういうケースにおいて,パラメトリックCADの恩恵を受けつつ,いろいろラクにするための(オレオレ)ベストプラクティスを編み出したので,そのやりかたをメモがてら書いておきます.

続きを読む