簡単!ターゲットを見つめる!
とにかくお手軽に気になるあの子を振り向かせたい
詳細な設定とかはいいから、とにかくお手軽にそれっぽく振り向かせたい!見つめられたい!
そんな人向きの内容になります。
HeadLookController万歳!
Animator.SetLookAtPositionという手もありますが、個人的にはUnity謹製のアセット「HeadLookController」の動きのほうが自然で好きです。ただちょっと設定が面倒です。そこで、簡単に利用できるようにHelperを作りました。このHelperをヒューマンモデルにくっつけて、ターゲットを指定するだけで全てが解決します。やったぜ!
ダウンロード
HeadLookControllerHelper
(2015/11/29 リンク先を変更しました)
使い方
- HeadLookControllerをAssetStoreからインポートしてください。
AssetStore HeadLookControllerページ - 次に本記事からダウンロードしたHeadLookHelperをヒューマンモデルにアタッチし、LookAtTargetObjectに見つめるターゲットを指定してください。(モデルにHeadLookControllerはアタッチしないでください)
- 以上で完了です。これでLookAtTargetObjectに指定したオブジェクトを見つめてくれます。ヒューマンモデルにちゃんと目の設定がされていて、AnimatorのIKが有効になっていればHelperによって目も動いてくれるようになってます。
NearEffectDampingって何?
デフォルトではオフですが、Helperの最重要機能です。
まず、NearEffectDampingをオフにしてターゲットを顔に近づけてみると、こんな感じでのけぞってターゲットを避けようとします。
これが何を意味するかというと…
ちゅっちゅ出来ない!(絶望)
しかし、NearEffectDampingをオンにすると、近づくにつれて背骨のLookAt効果が減衰していき…
いい感じでちゅっちゅ出来る!(歓喜)
補足説明
とりあえず説明しとかなきゃってところだけ説明しときます。
Delay Setup (2015/09/06 追加)
デフォルトONで、モデルへのHeadLookControllerのAddComponentを2フレーム遅らせます。ターゲットとは別の場所を見てしまう問題がかなり緩和されると思います。それでもダメならOverrideAnimationをONにしてみるのもアリです。
Target Velocity Adjustment
実際に見る位置をこの数値だけターゲットから縦方向にずらします。往々にしてターゲットより上を見つめがちなのでデフォルトは4.5cmほどターゲットの下を見つめてます。
Near Damping Min
背骨のLookAt効果が0になる距離を指定します。
Near Damping Range
背骨のLookAt効果が減衰し始める距離をNear Damping Minからの距離として指定します。デフォルトはNear Damping Minが0.17、Near Damping Rangeが0.30なのでターゲットが47cm以内になると減衰し始め、17cmで背骨のLockAt効果はなくなります。(17cm以内は首と目だけ動く状態)
Look At Eye Weight
大きい値にすると目の動きが大きくなります。
HeadLookControllerの詳細について
HeadLookControllerについて詳しく知りたい方は、下記の2つのサイトが参考になるかと思います。
1つ目のサイト
2つ目のサイト
HeadLookControllerの使い方 Gryith
説明画像に利用したモデル
説明画像に利用したかわいこちゃんは「プロ生ちゃん」です。
スクリプトで呼吸させる - 第2回 | Unity3D
そもそも
リアルな人間が呼吸をする場合、息を吸えば胸が膨らむし、横隔膜だって動くからお腹も動く。でも、Unityのヒューマンモデルで呼吸を実現するとなるとそうはいかない。骨の動きだけでそれっぽく見えるようにしないといけない。そんな制限条件付きの、実に日本人向けなプロジェクトとなっております。
(2015/9/5 追記:プログラミング生放送さんにて紹介記事を書いて頂きました。感謝!)
実際に動かした骨
実際にスクリプトで動かした骨は、Spine,Chest,Neck,Head,Shoulder(or UpperArm)の5つ。Shoulderは呼吸した際に腕が不自然に揺れるのを防いでいるだけです。なので実際は4本の骨の傾きのみで実現しています。できればSpineよりも下の骨も動かしたかったんですが、それを実現しようとすると途端に色々と問題が浮上してきたのでやめました。
骨のローカル座標系の向き
モデル毎に骨のローカル座標系の向きってバラバラなんですね。初めて知りました。。。X軸が体の前方むいてたり、Z軸が体の前方むいてたり。しかもその骨のローカル座標系から見て、どの方向が体の前方なのか後方なのかを正しく調べる方法が分かりませんでした。しかたないので、骨のローカル座標系X軸、Y軸、Z軸とワールド座標系との内積から、どの軸が一番それっぽいかをファジーに判定しています。なので、シーン開始時などにおいて極端に体をひねったポーズを取っていると軸判定に誤りが生じるかもしれません。
人間工学に基づくアプローチ
- 人間の吸気時の吸気量曲線はsinカーブに似ているらしいので、吸う時のイージングはEaseOutSine曲線を、吐く時はEaseInOutQuad曲線を採用。
- 「息を吸う」、「息を吐く」だけではなく、「息の休止期」も考慮。
- 上記を踏まえた上で、Unity上で不自然にならないよう調整。
そして出来たものがこちら
注意: 小さい画面だと分からないかもしれません
ダウンロード(beta版)
BreathController
(2019/06/23 ソースコードにMITライセンスについての記載を追加。)
使い方
Humanモデルにアタッチして使用してください。(HumanモデルにはAnimatorControllerがアタッチされている必要があります)
DurationRate
呼吸1サイクルに要する時間を調整します。大きくすると遅くなります。小さくすると早くなります。初期値は1で、2にすると1回の呼吸に倍の時間がかかります。最小値は0です。
EffectRate
呼吸の深さを調整します。大きくすると深くなります。小さくすると浅くなります。初期値は1で、2にすると各骨が倍の角度で回転します。最小値は0で、呼吸しなくります。
ケーススタディ
参考程度にケーススタディを記載します。個人的な好みで控えめな設定値になっています。もう少し派手に動いて欲しい場合は、DurationRateを上げて調整してください。また、モデルによっても見え方が変わってきます。Tda式AppendミクさんはEffecRate1.2~1.3くらいがちょうど良かったです。まぁ、どんな感じで調節すればよいかの指標になれば幸いです。
通常時
DurationRate: 1 / EffectRate: 1
通常時の落ち着いた呼吸。
睡眠時、モルヒネ中毒時、呼吸筋の麻痺時
DurationRate: 1 / EffectRate: 0.7
速度は変わらず、浅くなる。
発熱時、興奮時
DurationRate: 0.5 / EffectRate: 1
速度が早くなる。深さは変わらず。
運動時、高熱時、神経症時
DurationRate: 0.3 / EffectRate: 2
速度が早くなり、深くなる。
貧血時(過呼吸)
DurationRate: 1 / EffectRate: 2
速度は変わらず、深くなる。
末期患者
DurationRate: 1.6 / EffectRate: 0.7
速度が遅くなり、浅くなる。
HeadLookControllerとの併用
HeadLookControllerはLateUpdate内でLookAt処理を行っており、本BreathControllerも呼吸処理をLateUpdate内で行っています。その関係上、HeadLookControllerがBreathControllerの後に実行されると、呼吸処理による骨の回転がHeadLookControllerにて上書きされ無効化されます。
そこで、下記の手順にてスクリプトの実行順を明示的に指定してやる必要があります。
- メニュー: Edit > Project Settings > Script Execution Order で Script Execution Order 設定を開く。
- Default Timeの部分にHeadLookController.csとBreathController.csをそれぞれドラッグし、BreathController.csがHeadLookController.csの下になるよう設定します。
HeadLookController以外にもLateUpdate内で骨の回転を制御するようなスクリプトが存在する場合は、そのスクリプトも追加する必要があるかもしれません。
スクリプト実行順の詳しい説明は下記の公式リファレンスを参照してください。
http://docs.unity3d.com/ja/current/Manual/class-ScriptExecution.html
詳細設定 (Advanced Config)
呼吸時間(吸う、吐く、停止)や、各骨の回転量を詳細に設定できます。
Duration
呼吸時間の詳細設定です。実行時にはDurationRateが乗算されて最終的な秒数が算出されます。
Inhale
息を吸うのに要する秒数です。
Exhale
息を吐くのに要する秒数です。
Rest
息を吐いた後の停止秒数です。
Angle
各骨がオリジナルの角度から最大何度回転するかを設定します。実行時にはEffectRateが乗算されて最終的な回転角度が算出されます。
[BoneName]Inhale
息を吸った時の骨の回転量です。+で胸側へ、-で背側へ回転します。
[BoneName]Exhale
息を吐いた時の骨の回転量です。+で胸側へ、-で背側へ回転します。
調整のポイントは、吸った時と吐いた時それぞれで頭の角度が変わらないようにNeckとHeadで調整することです。
Etc
Inhale Method
吸気時のイージングメソッドを変更できます。基本的には初期値の"Ease Out Sine"を推奨しますが、気に入らない時は"Ease In Out Quad"を試してみてください。
なお、排気時のイージングメソッドは"Ease In Out Quad"固定となっており変更できません。
スクリプトで呼吸させる - 第1回 | Unity3D
ハァハァさせたい
AnimationClipに頼らず、スクリプトでHumanモデルに呼吸をさせたいんです。呼吸の長さとか深さとかを動的に弄りたいんです!眠ってるモーションのAnimationClipとか探したり作ったりしたくないんです!!IKで適当にポーズ付けて、呼吸用のスクリプトくっつけたら息してほしいんです!!!
立ちはだかる壁
正直、MMDのアニメーションも作ったことないし、もちろんUnityのAnimationClipでのアニメーションも作ったことないです。なので、基本的に人体モデルのどの骨をどのように回転させたら息しているようになるのかさっぱり理解していない状態。さらに、骨を回転させるということはオイラー角やらクォータニオンやらジンバルロックやらと戦うことになるの!?とか考えたら気分が沈む。ジンバルロックとか映画「アポロ13」でしか耳にしたことないよっ!
まぁ結局のところ、各骨毎に一方向のみの回転で且つ回転量も少量で実現できるはずなのでジンバルロックはあまり気にしないことにして、何も考えずオイラー角で操作することにしました。あまり考えると精神衛生上良くないので。
考えるよりもまずやってみようの心意気
と、カレイドスターになったあの人も言ってました。大事です。これ大事。
息を吸った時と吐いた時の各骨の回転量と回転時間を設定したらそれに従って骨を回転させるスクリプトを作成し、その数値を試行錯誤で調整していきました。Googleさんもフル稼働し、人間の呼吸について調べ、ハァハァしているMMD動画をニコニコで見まくり……
そんな作業の中、この動画の1:40~は本当に参考になった。ありがとうキュアパイン!色んな意味で!
できた試作版
そして出来た超試作版。ユニティちゃんのAnimationClip - Pose06(固定ポーズ)をプロ生ちゃんに設定。ついでなのでHeadLookControllerもセットアップしてみた。そして、今回作成した試作版BreathControllerをくっつける。まだ動きも調整中だけど、どうなるかな…
注意: 小さい画面だと分からないかもしれません
天 使 降 臨
かわええええw呼吸させるだけで破壊力がやばい!
今後の予定
- 呼吸モーションをもっと自然にしたい。
- 呼吸速度を早くすると不自然さが目立ってくるので、これも何とかしたい。
- その後、スクリプトをブラッシュアップ。
FaciemForMecanimアップデート | Unity3D
MMD4MecanimModelの表情をUnityのMecanim機能で制御できるようになるMMD4MecaimFaciemForMecanim(略 FaciemForMecanim)をアップデートしました。
アップデート内容
今まではMMD4MecanimのMorphHelperスクリプトを介して表情制御してましたが、今回追加したMorphHelperの使用チェックオプションを外す事によりMorphHelperを使用せずにFaciemForMecanim内で直接表情の制御を行います。たぶんこの方が無駄な処理を挟まないのでちょっとだけ軽いはず。たくさんのMorphHelperが作成されることもないので、再生中のInspectorもスッキリ!
ダウンロード
ダウンロードは下記ページからお願いします。
理想はボタンで
ただまぁ、あれですね。まだイマイチ使い勝手悪いですよね。パラメーター1つとはいえ、表情毎のAnimationClipを作成するのがダルいことダルいこと…。ボタンでAnimationClipを作成できればいいんだけど、EditorScriptでの作り方が良く分かりません。(T_T)
Leap Service が自動起動しない
なんだかよく分かりませんが、ウチの環境だとWindows起動時にLeap Serviceが自動で起動してくれません。で、色々と試した結果 Leap Service を遅延開始にしたら自動で起動してくれるようになりました。
個人的にはPC立ち上げて直ぐにLeap Serviceが必要になることはないんで、まぁこれでいいかな。
LeapMotion 突き抜けない手がほしい - 第3回 | Unity3D
出来ました!出来ましたよー!Beta版です。美しくない実装だけど動くはずです。これ大事。MMD4モデルのおっぱい揉みにお役立てください。
ダウンロード(Beta版)
OppaiHandBeta
(手首までのモデルでしか動かないきがします。)
(2015/11/29 リンク先を変更しました)
使い方
Physics ModelとしてHand Controllerに設定してください。
Colliderの動き
手のColliderは物体との接触を検知した際にNonActive化され、接触位置にもう一つの指Collider郡をActive化して配置します。接触中の手の位置の動きはPalmColliderの挙動次第なので、まだ改善の余地ありです。
次のステップ
位置の元になってるColliderがひっくり返らないで、体を撫で回せるように!難しそうだなぁ。。。
MMD4Mecanimの表情をUnityのMecanimで制御する | Unity3D
MMD4Mecanimモデルの表情をUnityのMecanim機能で制御できるようになるアセット「MMD4MecanimFaciemForMecanim」です。Mecanimで制御できるという事はBlendTreeを利用できるという事なので、たとえば「笑っている表情」と「怒っている表情」をfloat値によってブレンド出来るようになります。
必要なもの
- MMD4Mecanim
- MMD4MecanimFaciem (最新版を使用してください)
- MMD4MecanimFaciemForMecanim (本アセット)
ダウンロード(Beta版)
MMD4MecanimFaciemForMecanim
(2015/11/29 リンク先を変更しました)
コンポーネントの説明
FaciemForMecanimコンポーネント
MMD4Mecanimモデルにアタッチして使用します。
■Use Official Morph Helper
チェックするとMMD4MecanimのMorpHelperを介して表情を制御します。デフォルトはオフでMorpHelperを使用せず、FaciemForMecanim内部からモデルのモーフを直接制御します。
■Override Weight
MMD4MecanimのMorpHelperのOverride Weightと同様の機能です。
■(Re)Create Object For Animation ボタン
表情オブジェクトを作成します。
Weightコンポーネント
FaciemForMecanimの"(Re)Create Object For Animation"ボタンで作成される表情オブジェクトに最初からアタッチされています。
■Weight
表情のWeight値です。最小値は0で表情が反映されません。最大値は1です。
■Create AnimationClip File ボタン
Weightがプロパティとして設定されたAnimationClipファイルをAssets配下に作成します。設定されるWeight値は1です。
使い方 (How to)
- MMD4Mecanimで作成したモデルをHierarchyに配置します。
- 配置したモデルにFaciemDatabaseコンポーネントとFaciemForMecanimコンポーネントをアタッチしてください。
- MMD4MecanimModelのMorphタブからMorph値を変更して表情を作成し、FaciemDatabaseで表情を保存してください。(下記画像では"にっこり"と"おこ"の2つの表情を作成)
- FaciemForMecanimの"(Re)Create Object For Animation"ボタンを押してください。するとモデルの1階層下にFaciemオブジェクトが追加され、さらにその下には表情名のオブジェクトが作成されます。
- 作成された表情名のオブジェクトにはWeightスクリプトがアタッチされていて、そのスクリプトにはValueが設定できるようになっています。
- この時点で試しにシーンを再生し、WeightスクリプトのValue値を0以上に変更してみてください。値が1に近づくにつれ表情が変わることが確認できると思います。また、複数の表情オブジェクトのWeightスクリプトのValue値に0以上の値を設定すると、その値に従い表情がブレンドされます。確認ができたらシーンを停止してください。
- つまり、このValue値をAnimationClipで動かしてやれば表情が変わるわけです。AnimationClipで表情を変更できるということは、Mecanimでの表情ブレンドが可能ということです。
- 表情オブジェクトにアタッチされたWeightコンポーネントの"Create AnimationClip File"ボタンでAnimationClipファイルが作成できます。Assets配下に作成されます。
ただAnimatorの設定にコツがいりますので、それについて以下に記述します。Animatorには表情制御用のレイヤーが必要になります。またそのレイヤーは最上部に位置する必要があります。こんな感じ。(ここではFaceレイヤーとしました)元からあったBase LayerのWeight値が0になってたりする場合があるので、1であることを確認してください。2つのレイヤー共にBlendingは「Override」でOK。- (2015.09.20 追記)Animatorでの表情の制御に関するレイヤー分けと設定については、ユニティちゃんアセットに付属しているシーン"ActionCheck"のAnimatorのように、AvatarMaskを使用するのが正しい作法な気がします。
以上です。あとはBlendTreeなどで表情のブレンドなどを行ってみてください。
補足説明
- 表情のモーフ値変更は表情オブジェクトの再作成を必要としません。
- 表情を追加、削除した場合は"(Re)Create Object For Animation"ボタンで表情オブジェクトを再作成してください。
- 表情名の変更をした後に"(Re)Create Object For Animation"を実行しても既に作成された表情オブジェクトの名前は変わりません。これはAnimationClipとのリンク切れを防ぐためです。AnimationClipとリンクが切れるのを覚悟の上で名前を変更したい場合は、該当の表情オブジェクトを手動で削除した後に"(Re)Create Object For Animation"を実行してください。
- 同一名称の表情オブジェクトが複数存在しても正しく動作します。内部的にはGUIDで管理しているためです。
- Mecanimにおける表情制御では、FaciemDatabaseで設定したSpeed値は全く影響を及ぼしません。
- 同様にMecanimにおける表情制御では、FaciemDatabaseでのDefault表情指定は影響を及ぼしません。
制限事項
- FaciemController及びFaciemBlinkとの併用はできません。(エラーにはなりませんが、Controller及びBlinkは動作しません)