店舗接客などに使える仮想のキャラクターが扱えるアプリ開発をしました。そちらの説明はこちらになります。
https://qiita.com/NestVisual/items/fe4dd168178e27156682
環境:
Windows 10
Unity 2018.4.1
RealSense D435i
Nuitrackのデバッグについて:
テスト中に視覚的なデバッグ情報を得ることは最初から大切でした。Nuitrackのドキュメントページに、骨格データを有用な方法で可視化するUnityのチュートリアルがあるのは良かったです:
https://download.3divi.com/Nuitrack/doc/UnityRGBandSkeletons_page.html
SimpleSkeletonAvatar.cs クラスを継承し、いくつかの調整を加えることで、骨格表現を常に ビデオ画像に合うようにスケールしたり移動させたりすることができました。こうすることで、利用者動画や骨格の可視化を縮小して右上に移動させて、キャラクターの邪魔にならないようにができました。 また、デバッグデータが表示されるのを切り替える機能をキーにマッピングしました。
フェイストラッキングを実装する際には、視覚的なデバッグ用の顔データを表示する機能も必要になりました。残念ながらチュートリアルはありませんが、方法は似ていました。トラッキングされた顔の資料を取る方法はここに記載しています:
https://download.3divi.com/Nuitrack/doc/Instance_based_API.html
Nuitrack.GetInstancesJson()というメソッドがあるので、最新アップデートからすべての顔トラッキング資料を含むjson文字列を返します。この資料を「FaceInfo」というNuitrack SDKクラスに変換することができます。このクラスから得られる最も興味深い変数は 「landmark」 で、31の顔のポイントを含むVector2配列です。これらの正規化された座標から、利用者の顔に対応する目印を動画像上にインスタンス化するための投影座標を計算することができます。
private void ProcessFaceLandmark()
{
nuitrack.Skeleton skeleton = CurrentUserTracker.CurrentSkeleton;
_faceInfo = NuitrackHelper.GetFaceInfo();
if (CanProcessFaceLandmark(skeleton))
{
for (int i = 0; i < _landmarks.Count; i++)
{
Vector2 landmarkNormalizedPos = _faceInfo.Instances[0].face.landmark[i];
_landmarks[i].SetActive(true);
_landmarks[i].transform.position = GetLandmarkRenderPosition(_image, landmarkNormalizedPos);
}
}
else
{
for (int i = 0; i < _landmarks.Count; i++) _landmarks[i].SetActive(false);
}
}
private Vector2 GetLandmarkRenderPosition(RawImage image, Vector2 landmarkPosition)
{
float width = _image.rectTransform.rect.width;
float height = _image.rectTransform.rect.height;
Vector2 imagePosition = _image.gameObject.transform.position;
float jointX = (imagePosition.x - (width / 2.0f)) + (landmarkPosition.x * width);
float jointY = (imagePosition.y + (height / 2.0f)) - (landmarkPosition.y * height);
return new Vector2(jointX, jointY);
}
次回はNuitrackの関節の回転制限に関して投稿します。それではまた