2022/07/29

HandIKAppier for Unity

Hand IK apply on Timeline for Unity

UnityでHumanoidアニメーションIKを扱う場合、FootIKはClipにOn/Offがあるんでいいですが、HandIKの場合、普通はAnimationControllerでIKPassを有効にして、コンポーネントのOnAnimatorIK()内で処理コードを書きますよね。
じゃあPlayableDirector(Timeline)の場合は?
DirectorとAnimationControllerは排他関係にありますので、Directorで動かす場合はAnimationControllerは外しますね。OnAnimatorIK()受けるためだけに、無理やり同時使用するのも出来なくはないですが、ワーニング出るし気持ち悪いです。

今回作ったのは、モーキャプしたモーションをDirector/Timelineで再生する際にモーションのHandIKを使えるようにするスクリプトです。
Gist: https://gist.github.com/hiroshi-nishiura/9a696e2f5ba28fc82e410f8c16dc09c9

適応したいAnimatorが付いているオブジェクトもしくはその配下のオブジェクトにつければ機能します。左右それぞれのウエイト調整ができます。なぜウエイトかというと体格によっては手がターゲットに届かなくて腕がピーンってなってしまうのでどのくらい近づけるかというウエイト値になってます。
PlayableDirectorはどこにあってもいいものなので、Directorの場所もコンポーネントに教えてやります。Directorを設定しない場合は普通にOnAnimatorIK()が動きます。両対応ってことです。

Directorで動いているAnimatorでどうやってIK処理するかですが、IAnimationJobを使いました。Directorが作成するPlayableGraphからAnimatorに対応する出力にAnimationScriptPlayableノードを追加します。
このノードからJobにAnimationHumanStreamが渡ってきますので、JobのProcessAnimation()内でIK処理をやってます。
AnimationJobに関しては https://github.com/Unity-Technologies/animation-jobs-samples が参考になります。
DirectorのGraphに関しては情報がほとんどなく、ちょっと難儀しました。
因みに、AnimationControllerのGraphをいじろうとするとReadOnlyでいじれませんでした。DirectorのGraphは編集可能でよかったです。

2022/06/02

OrbitCameraController

OrbitCameraController for Unity

最近Unityでなんだかんだすることがあり、ちょっと便利なの作ったので。。

GameViewでSceneViewのようにカメラ操作が可能なスクリプトを公開
Gist URL
https://gist.github.com/hiroshi-nishiura/f70838083ad818d38911bfb77beb7557

カメラアングルが重要じゃない開発段階で、キャラの動きやポストエフェクトの確認とかでSceneViewとGameViewの切り替えが面倒。GameカメラをSceneViewに合わせてから実行とか面倒。GameView上でSceneView感覚でぐりぐり出来たらいいのに。という思いで作りました。

このスクリプトをGameカメラオブジェクトに加えると、GameView上でSceneViewとほぼ同じ感覚でカメラ操作ができるようになります。
実行時にSceneViewのアングルをGameカメラに反映させたり、終了時にGameカメラのアングルをSceneViewに反映することができるので、SceneViewとGameViewがシームレスな感じになります。

意識的に変えているところは、Altキーを押す必要があるという点と
SceneViewではできない、BallOrbitとRollが可能なところ。
後、SceneViewカメラを初期化するボタンもあります。

複数カメラにも一応対応してます。カメラの区別はTargetDisplayで判断しているので、操作を分けたい場合は、カメラのTargetDisplayを指定して、GameViewのDisplayを切り替えると別々の操作になります。

2022/05/21

fSpy Loader for Unity 2020.3+

fSpy という1枚の写真に数本のガイドラインを引いただけで3Dカメラキャリブレーションができるという秀逸なものがあり、Blender用のインポータプラグインがあるのですが、探してもUnity版が見当たらなかったので、EditorWindow版スクリプト書いてみました。

fSpyアプリからエキスポートしたJSONファイルを読んで、選択したシーンのカメラに反映させるシンプルなものです。
2020.3.26f1で作ったのでそれ以降だったら動くと思います。

Gist: https://gist.github.com/hiroshi-nishiura/294b24834e84e8ffdf69bd9fa612d339

JSON内にUnityのJsonUtilityでは扱えない配列とかがあるので、Json読むために Newtonsoft.Jsonを使用するので、PackageManager左上の+ボタンから、「Add package from git URL...」でcom.unity.nuget.newtonsoft-jsonを追加してインストールする必要があります。

fSpyはBlender向け(Z-up)として作られているらしく、Unityの座標系と相性が良くありませんが、FloorまたはWallに対する何種類かの軸モードに対応してUnity用に変換します。
Blender版を試したことがないので本来の動作じゃないかもしれませんが、自分だったらこういう結果になって欲しいという作りにしました。