Virtualių galvų suderinimas su tikrais veidais Unity naudojant MediaPipe

Virtualių galvų suderinimas su tikrais veidais Unity naudojant MediaPipe
Virtualių galvų suderinimas su tikrais veidais Unity naudojant MediaPipe

Virtualios galvos įdėjimo iššūkiai AR plėtrai

Darbas su papildytosios realybės (AR) projektu gali būti įdomus ir sudėtingas. Kurdamas „Android“ programą su „Unity“, siekiau sklandžiai sujungti skaitmeninį ir realų pasaulį, uždėdamas virtualią galvą ant realaus pasaulio veidų. Ši funkcija labai priklauso nuo tikslumo, kad būtų sukurta įtraukianti patirtis. 🕶️

Norėdami tai pasiekti, naudojau Google MediaPipe, kad aptikčiau veido orientyrus, pvz., akis, nosį ir burną. Tada virtuali galvutė buvo sugeneruota ir įdėta remiantis šiais pagrindiniais taškais. Buvo įdomu pamatyti, kaip šiuolaikiniai įrankiai gali pakeisti AR galimybes, tačiau kelionė toli gražu nebuvo tobula.

Problema iškilo, kai virtuali galva nesutampa su tikruoju veidu, kaip tikėtasi. Nepriklausomai nuo kampo ar įrenginio, vieta visada buvo šiek tiek „išjungta“, todėl atsirado nenatūralus efektas. Atrodė, kad virtualus vaizdas buvo atitrūkęs nuo realybės. Tai paskatino trikčių šalinimo eksperimentų seriją.

Nuo „Unity“ fotoaparato nustatymų keitimo iki eksperimentavimo su „MediaPipe“ algoritmu – kiekvienas bandymas atnešė laipsniškų patobulinimų, tačiau galutinio sprendimo nebuvo. Šiame straipsnyje aprašoma problemos esmė, išmoktos pamokos ir galimi sprendimai kūrėjams, susiduriantiems su panašiais iššūkiais. 🚀

komandą Naudojimo pavyzdys
mainCamera.usePhysicalProperties Ši komanda leidžia naudoti „Unity“ fizines fotoaparato savybes, leidžiančias tiksliau valdyti židinio nuotolį ir objektyvo iškraipymą, kad būtų suderinti virtualūs ir realaus pasaulio objektai.
faceMesh.GetDetectedFaceTransform() Iš MediaPipe veido tinklelio nuskaito aptikto veido transformacijos duomenis (padėtį ir sukimąsi), kurie yra labai svarbūs norint tiksliai įdėti virtualias galvutes ant tikrų veidų.
UnityObjectToClipPos Specifinė atspalvių funkcija, paverčianti viršūnės padėtį iš objekto erdvės į klipo erdvę, naudojama objektyvo iškraipymo korekcijos šešėliuose, kad būtų užtikrintas lygiavimas.
tex2D Shader komanda, naudojama tekstūrai atrinkti nurodytomis UV koordinatėmis, būtina taikant iškraipymo korekciją kameros tiekimui.
length(distUV) Apskaičiuoja UV koordinačių euklidinį atstumą nuo pradžios, kuris naudojamas laipsniškai koreguojant objektyvo iškraipymą.
adjuster.virtualHead Scenarijaus kintamasis, nurodantis virtualią „GameObject“ galvutę, leidžiantis dinamiškai atnaujinti jos padėtį ir sukimąsi, remiantis veido stebėjimo duomenimis.
[TestFixture] NUnit atributas, kuris pažymi klasę kaip testavimo įrenginį, signalizuojantį, kad joje yra vienetų testai. Tai naudinga norint patikrinti virtualios galvutės išlygiavimo logiką.
Assert.AreEqual NUnit metodas, naudojamas laukiamoms ir faktinėms vertėms palyginti vieneto testavimo metu, užtikrinant, kad virtualios galvos padėtis atitiktų norimus rezultatus.
_DistortionStrength Šešėlio savybė, reguliuojanti objektyvo iškraipymo intensyvumą, tiksliai sureguliuojanti realaus ir virtualaus pasaulių derinimą.
Quaternion.Euler Sukuria pasukimą pagal Eulerio kampus, dažniausiai naudojamus objektams, pvz., virtualiajai galvutei, lygiuoti Unity 3D erdvėje.

AR tikslumo pagerinimas naudojant Unity ir MediaPipe

Pirmasis scenarijus, kurį ištyrėme, skirtas naudoti „Unity“ fizines fotoaparato savybes. Įjungus naudotiPhysicalProperties, koreguojame fotoaparato veikimą, kad labiau atitiktų realaus pasaulio optiką. Tai ypač svarbu dirbant su AR, kai net nedideli židinio nuotolio ar matymo lauko neatitikimai gali priversti virtualius objektus atrodyti netinkamai. Pavyzdžiui, nustačius tikslią židinio nuotolį, pvz., 35 mm, virtualioji galva gali būti suderinta su aptiktu veidu. Šis reguliavimas panašus į tikslų teleskopo derinimą, kad toli esantys objektai būtų tobulai sufokusuoti, užtikrinant, kad AR patirtis būtų natūrali ir įtraukianti. 📸

Kitas svarbus scenarijaus komponentas yra aptikto veido padėties ir sukimosi nuskaitymas naudojant faceMesh.GetDetectedFaceTransform(). Ši funkcija teikia naujinimus realiuoju laiku iš MediaPipe veido tinklelio, kuris yra būtinas norint sinchronizuoti virtualią galvutę su vartotojo judesiais. Įsivaizduokite, kad žaidžiate vaizdo žaidimą, kuriame jūsų veikėjo galva nejuda sinchroniškai su jūsų galva; patirtis būtų slegianti. Užtikrindamas tikslų suderinimą, šis scenarijus paverčia AR iš naujovės į įrankį, galintį palaikyti tokias programas kaip virtualūs susitikimai ar pažangūs žaidimai.

Antrasis scenarijus gilinasi į šešėlių programavimą, ypač sprendžiant objektyvo iškraipymą. Shader ištaiso fotoaparato tiekimo iškraipymus naudodamas tokias savybes kaip _DistortionStrength, kad būtų galima manipuliuoti UV koordinačių atvaizdavimu ant tekstūros. Tai ypač naudinga dirbant su plačiakampiais objektyvais arba fotoaparatais su unikaliais iškraipymo profiliais. Pavyzdžiui, jei virtuali galvutė atrodo didesnė arba mažesnė nei tikrasis veidas, atsižvelgiant į kampą, iškraipymo nustatymų keitimas užtikrina geresnį išlygiavimą. Tai tarsi veidrodžio rėmo reguliavimas, kad būtų pašalintas linksmybių efektas ir atspindžiai taptų tikroviškesni. 🎨

Galiausiai, vienetų testai iš trečiojo scenarijaus patvirtina sprendimus. Šiuose testuose numatoma virtualios galvos padėtis ir sukimasis lyginamos su faktiniais rezultatais, užtikrinant, kad reguliavimas išsilaikytų įvairiomis sąlygomis. Naudojant NUnit's Teigti.AreEqual, kūrėjai gali imituoti įvairius scenarijus, pvz., greitai judinti galvą arba pakreipti ją kraštutiniais kampais, kad patvirtintų išlygiavimą. Pavyzdžiui, kurdamas pastebėjau, kad išlygiavimas veikė gerai, kai atsuktas į priekį, bet nukrypo, kai galva pasuko į šoną. Šie vienetų testai išryškino problemą ir paskatino tolesnius patobulinimus, sustiprindami kruopštaus testavimo svarbą kuriant patikimas AR programas. 🚀

Virtualių objektų išdėstymo reguliavimas AR naudojant Unity ir MediaPipe

1 sprendimas: naudokite „Unity“ fizinę kamerą FOV ir objektyvo iškraipymui reguliuoti

// Import necessary Unity libraries
using UnityEngine;
using Mediapipe.Unity;

public class VirtualHeadAdjuster : MonoBehaviour
{
    public Camera mainCamera; // Assign Unity's physical camera
    public GameObject virtualHead; // Assign the virtual head prefab
    private MediapipeFaceMesh faceMesh; // MediaPipe's face mesh component

    void Start()
    {
        // Enable Unity's physical camera
        mainCamera.usePhysicalProperties = true;
        mainCamera.focalLength = 35f; // Set a standard focal length
    }

    void Update()
    {
        if (faceMesh != null && faceMesh.IsTracking)
        {
            // Update the virtual head's position and rotation
            Transform detectedHead = faceMesh.GetDetectedFaceTransform();
            virtualHead.transform.position = detectedHead.position;
            virtualHead.transform.rotation = detectedHead.rotation;
        }
    }
}

Alternatyvių virtualaus galvos išlyginimo reguliavimų tyrinėjimas

2 sprendimas: naudokite tinkintą šešėlį objektyvo iškraipymui ištaisyti

Shader "Custom/LensDistortionCorrection"
{
    Properties
    {
        _DistortionStrength ("Distortion Strength", Float) = 0.5
    }

    SubShader
    {
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            float _DistortionStrength;

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float4 pos : SV_POSITION;
                float2 uv : TEXCOORD0;
            };

            v2f vert (appdata v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.uv = v.uv;
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                float2 distUV = i.uv - 0.5;
                distUV *= 1.0 + _DistortionStrength * length(distUV);
                distUV += 0.5;
                return tex2D(_MainTex, distUV);
            }
            ENDCG
        }
    }
}

„Unity“ AR projektų patobulinto suderinamumo testavimas

3 sprendimas: Virtualios galvos išlyginimo vienetų testų įgyvendinimas

using NUnit.Framework;
using UnityEngine;
using Mediapipe.Unity;

[TestFixture]
public class VirtualHeadAlignmentTests
{
    private VirtualHeadAdjuster adjuster;
    private GameObject testHead;

    [SetUp]
    public void Init()
    {
        GameObject cameraObject = new GameObject("MainCamera");
        adjuster = cameraObject.AddComponent<VirtualHeadAdjuster>();
        testHead = new GameObject("VirtualHead");
        adjuster.virtualHead = testHead;
    }

    [Test]
    public void TestVirtualHeadAlignment()
    {
        Vector3 expectedPosition = new Vector3(0, 1, 2);
        Quaternion expectedRotation = Quaternion.Euler(0, 45, 0);

        adjuster.virtualHead.transform.position = expectedPosition;
        adjuster.virtualHead.transform.rotation = expectedRotation;

        Assert.AreEqual(expectedPosition, testHead.transform.position);
        Assert.AreEqual(expectedRotation, testHead.transform.rotation);
    }
}

AR išdėstymo tobulinimas naudojant patobulintus kalibravimo metodus

Vienas dažnai nepastebimas AR derinimo problemų aspektas yra fotoaparato kalibravimo svarba. AR projektuose, tokiuose kaip virtualios galvos uždėjimas virš tikrosios, objektyvo vidiniai parametrai vaidinti gyvybiškai svarbų vaidmenį. Šie parametrai apima židinio nuotolį, optinį centrą ir iškraipymo koeficientus. Kai šios vertės nėra tikslios, virtualioji galvutė gali pasirodyti netinkamai suderinta arba iškraipyta. Norėdami tai išspręsti, galima naudoti kalibravimo įrankius šiems konkretaus įrenginio fotoaparato parametrams apskaičiuoti. Pavyzdžiui, tokia programinė įranga kaip OpenCV siūlo patikimas kalibravimo priemones, skirtas sukurti tikslias kameros matricas ir iškraipymo profilius. 📐

Kitas metodas apima „Unity“ sverto panaudojimą papildomo apdorojimo krūva. Taikydami tokius efektus kaip lauko gylis ar chromatinės aberacijos korekcijos, galite išlyginti pateiktos virtualios galvos ir realios aplinkos neatitikimus. Vėlesnis apdorojimas prideda poliravimo sluoksnį, kuris užpildo atotrūkį tarp virtualių objektų ir fizinių erdvių. Pavyzdžiui, subtilus suliejimo efektas gali sumažinti atšiaurius kraštus, dėl kurių pastebimi neatitikimai. Tai ypač naudinga įtraukiančiose programose, kur vartotojai labai susikoncentruoja į sceną.

Galiausiai nenuvertinkite dinaminio prisitaikymo galios vykdymo metu. Įtraukus mašininio mokymosi modelius į savo AR dujotiekį, sistema gali mokytis ir laikui bėgant koreguoti vietą. Pavyzdžiui, AI modelis galėtų analizuoti vartotojų atsiliepimus arba aptiktus neatitikimus ir dinamiškai sureguliuoti derinimą. Dėl to sistema tampa tvirtesnė ir gali susidoroti su apšvietimo, įrenginio veikimo ar vartotojo elgsenos skirtumais. Šie patobulinimai užtikrina sklandžią AR patirtį, todėl virtualus ir realus pasauliai jaučiasi tikrai integruoti. 🚀

Įprasti klausimai apie „MediaPipe“ ir „Unity AR Placement“.

  1. Kodėl mano virtuali galva nesutampa su tikruoju veidu?
  2. Problema dažnai kyla dėl netinkamo fotoaparato kalibravimo. Naudodami tokius įrankius kaip OpenCV apskaičiuoti camera matrix ir distortion coefficients gali labai pagerinti derinimą.
  3. Koks yra židinio nuotolio vaidmuo derinant AR?
  4. The focal length apibrėžia, kaip fotoaparatas projektuoja 3D taškus į 2D plokštumą. Sureguliavus jį Unity fizinės kameros nustatymuose, gali padidėti tikslumas.
  5. Ar Unity gali susidoroti su objektyvo iškraipymo korekcija?
  6. Taip, „Unity“ palaiko atspalvius, skirtus iškraipymų taisymui. Įdiekite šešėlį su tokiomis savybėmis kaip _DistortionStrength pritaikyti korekcijas pagal jūsų objektyvo profilį.
  7. Kaip galiu patikrinti virtualių objektų lygiavimą?
  8. Vienetų testų naudojimas NUnit su tokiomis komandomis kaip Assert.AreEqual leidžia patvirtinti virtualių objektų padėtį ir sukimąsi įvairiomis sąlygomis.
  9. Ar AR projektams reikalingas tolesnis apdorojimas?
  10. Nors ir neprivalomas, po apdorojimo efektai, kaip depth of field ir chromatic aberration gali pagerinti AR scenų vaizdo kokybę ir tikroviškumą.
  11. Ar „MediaPipe“ gali aptikti kitus objektus, išskyrus veidus?
  12. Taip, „MediaPipe“ siūlo rankų, pozų ir net holistinio stebėjimo sprendimus, todėl jis yra universalus įvairiems AR naudojimo atvejams.
  13. Kokia aparatinė įranga geriausiai tinka „Unity AR“ programoms?
  14. Įrenginiai su didelio našumo GPU ir tiksliomis kameromis yra idealūs. Įrankiai kaip ARCore ir ARKit dar labiau pagerinti suderinamumą.
  15. Kodėl išlyginimas tam tikrais kampais blogesnis?
  16. Tai gali būti dėl fotoaparato ir virtualios aplinkos matymo lauko neatitikimo. Unity kameros reguliavimas fieldOfView turtas gali padėti.
  17. Kaip šešėliai pagerina AR suderinimą?
  18. Shaders leidžia realiuoju laiku koreguoti atvaizdavimą, pvz., ištaisyti iškraipymus arba imituoti objektyvo efektus, užtikrinant geresnį virtualių ir realių objektų sinchronizavimą.
  19. Ar AR sistemos laikui bėgant gali susireguliuoti?
  20. Taip, mašininio mokymosi modelių integravimas leidžia sistemoms dinamiškai prisitaikyti, mokytis iš grįžtamojo ryšio ir laikui bėgant pagerinti suderinimą ir našumą.

AR tikslumo didinimas: paskutinės mintys

Norint pasiekti įtraukiančių AR patirtį, labai svarbu pasiekti tikslų virtualių ir realaus pasaulio objektų suderinimą. Kruopščiai kalibruojant ir naudojant pažangias technologijas, galima sušvelninti tokias problemas kaip objektyvo iškraipymas ir nesuderinti židinio nuotoliai, užtikrinant didesnį tikslumą ir naudotojų pasitenkinimą.

Integruojant „Unity“ įrankius, „MediaPipe“ algoritmus ir dinaminius koregavimus galima rasti patikimų sprendimų AR kūrėjams. Šie patobulinimai leidžia sklandžiai sujungti skaitmeninį ir fizinį pasaulius, atverdami naujas žaidimų, virtualių susitikimų ir kitų galimybių. Dėl atkaklumo ir naujovių AR derinimo iššūkiai tampa valdomi. 🚀

Šaltiniai ir nuorodos
  1. Išsami informacija apie MediaPipe naudojimą Unity buvo pateikta oficialioje MediaPipe dokumentacijoje. Ištirkite jį čia .
  2. „Unity“ kameros kalibravimo ir fizinių savybių gaires galite rasti „Unity“ dokumentacijos svetainėje. Aplankykite „Unity“ fotoaparato nustatymai Norėdami gauti daugiau informacijos.
  3. Shader programavimas AR programoms ir objektyvo iškraipymo korekcijai buvo įkvėptas straipsnių apie šešėlių kūrimą, pvz., apie Katinis kodavimas .
  4. „ARCore“ galimybės ir „Android“ kūrimo apribojimai buvo peržiūrėti „Google“ ARCore kūrėjų svetainėje. Sužinokite daugiau adresu Google ARCore .