Help us understand the problem. What is going on with this article?

Virtual Chara開発 - その3

店舗接客などに使える仮想のキャラクターが扱えるアプリ開発をしました。そちらの説明はこちらになります。
https://qiita.com/NestVisual/items/fe4dd168178e27156682

環境:
Windows 10
Unity 2018.4.1
RealSense D435i

Nuitrackのデバッグについて:

Debug Info.png

テスト中に視覚的なデバッグ情報を得ることは最初から大切でした。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配列です。これらの正規化された座標から、利用者の顔に対応する目印を動画像上にインスタンス化するための投影座標を計算することができます。

sample1.cs
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の関節の回転制限に関して投稿します。それではまた

NestVisual
「映像コンテンツ」と「テクノロジー」の融合による高品質な映像表現を目指し、「XR(VR/AR/MR)」、「インタラクティブシステム」、「プロジェクションマッピング」など、様々なデジタルコンテンツの開発、制作に関わっています。また、受託案件だけではなく、オリジナル開発されたアプリやコンテンツなどにも力を注ぎ、日本だけではなく、アジアそして世界へ発信できるコンテンツを開発しています。
https://www.nest-vis.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした