Virtuālo galviņu saskaņošana ar īstām sejām pakalpojumā Unity, izmantojot MediaPipe

Virtuālo galviņu saskaņošana ar īstām sejām pakalpojumā Unity, izmantojot MediaPipe
Virtuālo galviņu saskaņošana ar īstām sejām pakalpojumā Unity, izmantojot MediaPipe

Virtuālās galvas izvietošanas izaicinājumi AR izstrādei

Darbs pie paplašinātās realitātes (AR) projekta var būt gan aizraujošs, gan izaicinošs. Izstrādājot Android lietojumprogrammu ar Unity, es centos nemanāmi sapludināt digitālo un reālo pasauli, novietojot virtuālu galvu virs reālās pasaules sejām. Šī funkcija lielā mērā ir atkarīga no precizitātes, lai radītu iespaidīgu pieredzi. 🕶️

Lai to panāktu, es izmantoju Google MediaPipe, lai noteiktu sejas orientierus, piemēram, acis, degunu un muti. Pēc tam virtuālā galva tika ģenerēta un novietota, pamatojoties uz šiem galvenajiem punktiem. Bija aizraujoši redzēt, kā modernie rīki var pārveidot AR iespējas, taču ceļojums bija tālu no ideāla.

Problēma radās, kad virtuālā galva nesakrita ar faktisko seju, kā paredzēts. Neatkarīgi no leņķa vai ierīces izvietojums vienmēr bija nedaudz "izslēgts", radot nedabisku efektu. It kā virtuālais attēlojums būtu atrauts no realitātes. Tas izraisīja virkni problēmu novēršanas eksperimentu.

Sākot ar Unity kameras iestatījumu pielāgošanu un beidzot ar MediaPipe algoritma eksperimentēšanu, katrs mēģinājums radīja pakāpeniskus uzlabojumus, bet bez galīga risinājuma. Šajā rakstā ir apskatīta problēmas būtība, gūtās atziņas un iespējamie risinājumi izstrādātājiem, kas saskaras ar līdzīgām problēmām. 🚀

Pavēli Lietošanas piemērs
mainCamera.usePhysicalProperties Šī komanda ļauj izmantot Unity fiziskās kameras īpašības, ļaujot precīzāk kontrolēt fokusa attālumu un objektīva kropļojumus, lai saskaņotu virtuālos un reālās pasaules objektus.
faceMesh.GetDetectedFaceTransform() Izgūst atklātās sejas transformācijas datus (pozīcija un rotācija) no MediaPipe sejas tīkla, kas ir ļoti svarīgi, lai virtuālās galviņas precīzi novietotu virs reālām sejām.
UnityObjectToClipPos Ēnotājiem specifiska funkcija, kas pārveido virsotnes pozīciju no objekta telpas uz klipu vietu, ko izmanto objektīva kropļojumu korekcijas ēnotājos, lai nodrošinātu izlīdzināšanu.
tex2D Shader komanda, ko izmanto tekstūras paraugam noteiktās UV koordinātēs, kas ir būtiska, lai kameras plūsmai piemērotu kropļojumu korekciju.
length(distUV) Aprēķina UV koordinātu Eiklīda attālumu no sākuma, kas tiek izmantots, lai piemērotu pakāpeniskas lēcas kropļojumu korekcijas.
adjuster.virtualHead Skripta mainīgais, kas attiecas uz virtuālo galviņu GameObject, kas ļauj dinamiski atjaunināt tā pozīciju un rotāciju, pamatojoties uz sejas izsekošanas datiem.
[TestFixture] NUnit atribūts, kas atzīmē klasi kā pārbaudes ierīci, norādot, ka tajā ir vienības testi. Tas ir noderīgi, lai pārbaudītu virtuālās galvas izlīdzināšanas loģiku.
Assert.AreEqual NUnit metode, ko izmanto, lai salīdzinātu paredzamās un faktiskās vērtības vienības testēšanas laikā, nodrošinot, ka virtuālās galvas novietojums atbilst vēlamajiem rezultātiem.
_DistortionStrength Ēnotāja īpašība, kas pielāgo objektīva kropļojumu intensitāti, precīzi noregulējot saskaņošanu starp reālo un virtuālo pasauli.
Quaternion.Euler Izveido rotāciju, pamatojoties uz Eilera leņķiem, ko parasti izmanto tādu objektu līdzināšanai kā virtuālā galva Unity 3D telpā.

AR precizitātes uzlabošana, izmantojot Unity un MediaPipe

Pirmais skripts, kuru mēs pētījām, ir vērsts uz Unity fiziskās kameras īpašību izmantošanu. Iespējojot izmantojiet Fiziskās īpašības, mēs pielāgojam kameras darbību, lai tā atbilstu reālās pasaules optikai. Tas ir īpaši svarīgi, strādājot ar AR, kur pat nelielas fokusa attāluma vai redzes lauka atšķirības var likt virtuālajiem objektiem izskatīties nepareizi. Piemēram, fokusa attāluma iestatīšana uz precīzu vērtību, piemēram, 35 mm, var palīdzēt saskaņot virtuālo galvu ar noteikto seju. Šī pielāgošana ir līdzīga teleskopa precīzai noregulēšanai, lai perfekti fokusētu attālos objektus, nodrošinot AR dabisku un ieskaujošu sajūtu. 📸

Vēl viena būtiska skripta sastāvdaļa ir atklātās sejas pozīcijas un rotācijas izgūšana, izmantojot faceMesh.GetDetectedFaceTransform(). Šī funkcija nodrošina reāllaika atjauninājumus no MediaPipe sejas tīkla, kas ir būtiski, lai sinhronizētu virtuālo galvu ar lietotāja kustībām. Iedomājieties, ka spēlējat videospēli, kurā jūsu varoņa galva nekustas sinhroni ar jūsu galvu; pieredze būtu satraucoša. Nodrošinot precīzu izlīdzināšanu, šis skripts pārvērš AR no jauninājuma par rīku, kas var atbalstīt tādas lietojumprogrammas kā virtuālās sapulces vai uzlabotas spēles.

Otrais skripts ir veltīts ēnotāju programmēšanai, īpaši pievēršoties objektīva kropļojumiem. Ēnotājs koriģē kameras plūsmas izkropļojumus, izmantojot tādas īpašības kā _DistortionStrength, lai manipulētu ar UV koordinātu kartēšanu tekstūrai. Tas ir īpaši noderīgi, strādājot ar platleņķa objektīviem vai kamerām ar unikāliem kropļojuma profiliem. Piemēram, ja virtuālā galva šķiet lielāka vai mazāka par faktisko seju atkarībā no leņķa, izkropļojumu iestatījumu pielāgošana nodrošina labāku izlīdzināšanu. Tas ir tāpat kā spoguļa rāmja pielāgošana, lai novērstu funhouse efektu, padarot atspulgus reālistiskākus. 🎨

Visbeidzot, trešā skripta vienības testi apstiprina risinājumus. Šie testi salīdzina paredzamo virtuālās galvas stāvokli un rotāciju ar faktiskajiem rezultātiem, nodrošinot, ka pielāgojumi tiek noturēti dažādos apstākļos. Izmantojot NUnit Apgalvot.AreEqual, izstrādātāji var simulēt dažādus scenārijus, piemēram, ātri pārvietot galvu vai noliekt to ārkārtējos leņķos, lai apstiprinātu izlīdzināšanu. Piemēram, izstrādes laikā es pamanīju, ka izlīdzināšana darbojās labi, kad tas bija vērsts uz priekšu, bet novirzījās, kad galva pagriezās uz sāniem. Šie vienību testi akcentēja problēmu un vadīja turpmākus uzlabojumus, pastiprinot rūpīgas testēšanas nozīmi stabilu AR lietojumprogrammu izveidē. 🚀

Virtuālo objektu izvietojuma pielāgošana AR, izmantojot Unity un MediaPipe

1. risinājums: izmantojiet Unity fizisko kameru, lai pielāgotu FOV un objektīva kropļojumus

// 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;
        }
    }
}

Alternatīvu virtuālās galvas izlīdzināšanas iespēju izpēte

2. risinājums: izmantojiet pielāgotu ēnotāju, lai labotu objektīva kropļojumus

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
        }
    }
}

Uzlabotas saderības pārbaude Unity AR projektos

3. risinājums. Virtuālās galvas izlīdzināšanas vienību testu ieviešana

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 izvietojuma uzlabošana, izmantojot uzlabotas kalibrēšanas metodes

Viens bieži aizmirsts AR izlīdzināšanas problēmu aspekts ir kameras kalibrēšanas nozīme. Tādos AR projektos kā virtuālas galvas novietošana virs reālas, proti, objektīva iekšējie parametri spēlē būtisku lomu. Šie parametri ietver fokusa attālumu, optisko centru un kropļojumu koeficientus. Ja šīs vērtības nav precīzas, virtuālā galva var izskatīties nepareizi izlīdzināta vai izkropļota. Lai to novērstu, var izmantot kalibrēšanas rīkus, lai aprēķinātu šos parametrus konkrētai ierīces kamerai. Piemēram, programmatūra, piemēram, OpenCV, piedāvā spēcīgas kalibrēšanas utilītas, lai ģenerētu precīzas kameru matricas un kropļojumu profilus. 📐

Cita pieeja ietver Vienotības piesaisti pēcapstrādes kaudze. Lietojot tādus efektus kā lauka dziļuma vai hromatiskās aberācijas korekcijas, varat izlīdzināt neatbilstības starp renderēto virtuālo galvu un reālo vidi. Pēcapstrāde pievieno pulēšanas slāni, kas mazina plaisu starp virtuālajiem objektiem un fiziskajām telpām. Piemēram, smalks izplūšanas efekts var samazināt skarbās malas, kas padara pamanāmas novirzes. Tas ir īpaši noderīgi ieskaujošās lietojumprogrammās, kur lietotāji ļoti koncentrējas uz ainu.

Visbeidzot, nenovērtējiet par zemu dinamiskās pielāgošanās spēku izpildlaikā. Mašīnmācīšanās modeļu iekļaušana AR konveijerā var ļaut sistēmai mācīties un laika gaitā pielāgot izvietojumu. Piemēram, AI modelis varētu analizēt lietotāju atsauksmes vai atklātās neatbilstības un dinamiski precizēt izlīdzināšanu. Tas padara sistēmu izturīgāku un spējīgu tikt galā ar apgaismojuma, ierīces veiktspējas vai lietotāja uzvedības izmaiņām. Šie uzlabojumi nodrošina netraucētu AR pieredzi, liekot virtuālajai un reālajai pasaulei justies patiesi integrētai. 🚀

Bieži uzdotie jautājumi par MediaPipe un Unity AR izvietojumu

  1. Kāpēc mana virtuālā galva ir nepareizi saskaņota ar reālo seju?
  2. Problēma bieži rodas nepareizas kameras kalibrēšanas dēļ. Izmantojot tādus rīkus kā OpenCV, lai aprēķinātu camera matrix un distortion coefficients var ievērojami uzlabot izlīdzināšanu.
  3. Kāda ir fokusa attāluma loma AR izlīdzināšanā?
  4. The focal length nosaka, kā kamera projicē 3D punktus 2D plaknē. Pielāgojot to Unity fiziskās kameras iestatījumos, var uzlabot precizitāti.
  5. Vai Unity var tikt galā ar objektīva kropļojumu korekciju?
  6. Jā, Unity atbalsta ēnotājus kropļojumu korekcijai. Ieviesiet ēnotāju ar tādām īpašībām kā _DistortionStrength lai pielāgotu korekcijas, pamatojoties uz jūsu objektīva profilu.
  7. Kā es varu pārbaudīt virtuālo objektu izlīdzināšanu?
  8. Vienību testu izmantošana NUnit ar tādām komandām kā Assert.AreEqual ļauj pārbaudīt virtuālo objektu pozicionēšanu un rotāciju dažādos apstākļos.
  9. Vai AR projektiem ir nepieciešama pēcapstrāde?
  10. Lai gan tas nav obligāti, pēcapstrādes efekti, piemēram, depth of field un chromatic aberration var uzlabot AR ainu vizuālo kvalitāti un reālismu.
  11. Vai MediaPipe var noteikt citus objektus, nevis sejas?
  12. Jā, MediaPipe piedāvā risinājumus rokām, pozām un pat holistiskajai izsekošanai, padarot to daudzpusīgu dažādiem AR lietošanas gadījumiem.
  13. Kāda aparatūra vislabāk darbojas Unity AR lietojumprogrammām?
  14. Ierīces ar augstas veiktspējas GPU un precīzām kamerām ir ideāli piemērotas. Tādi rīki kā ARCore un ARKit vēl vairāk uzlabo saderību.
  15. Kāpēc noteiktos leņķos izlīdzināšana ir sliktāka?
  16. Tas varētu būt saistīts ar redzes lauka neatbilstību starp kameru un virtuālo vidi. Unity kameras regulēšana fieldOfView īpašums var palīdzēt.
  17. Kā ēnotāji uzlabo AR izlīdzināšanu?
  18. Shaders ļauj reāllaikā pielāgot renderēšanu, piemēram, izlabot kropļojumus vai simulēt objektīva efektus, nodrošinot labāku sinhronizāciju starp virtuāliem un reāliem objektiem.
  19. Vai AR sistēmas var pašregulēties laika gaitā?
  20. Jā, mašīnmācīšanās modeļu integrēšana ļauj sistēmām dinamiski pielāgoties, mācoties no atgriezeniskās saites, lai laika gaitā uzlabotu saskaņošanu un veiktspēju.

AR precizitātes uzlabošana: pēdējās domas

Precīzai līdzināšanai starp virtuālajiem un reālajiem objektiem ir izšķiroša nozīme ieskaujošā AR pieredzē. Izmantojot rūpīgu kalibrēšanu un uzlabotas metodes, var mazināt tādas problēmas kā objektīva kropļojumi un neatbilstoši fokusa attālumi, nodrošinot labāku precizitāti un lietotāju apmierinātību.

Integrējot Unity rīkus, MediaPipe algoritmus un dinamiskus pielāgojumus, tiek piedāvāti stabili risinājumi AR izstrādātājiem. Šie uzlabojumi nodrošina nemanāmu digitālās un fiziskās pasaules apvienošanu, paverot jaunas iespējas spēlēm, virtuālām sanāksmēm un ne tikai. Ar neatlaidību un inovācijām AR saskaņošanas problēmas kļūst pārvaldāmas. 🚀

Avoti un atsauces
  1. Sīkāka informācija par MediaPipe izmantošanu pakalpojumā Unity tika sniegta oficiālajā MediaPipe dokumentācijā. Izpētiet to šeit .
  2. Norādījumus par Unity kameras kalibrēšanu un fiziskajām īpašībām var atrast Unity dokumentācijas vietnē. Apmeklējiet Unity kameras iestatījumi lai iegūtu sīkāku informāciju.
  3. Ēnotāju programmēšana AR lietojumprogrammām un objektīva kropļojumu korekcija tika iedvesmota no rakstiem par ēnotāju izstrādi, piemēram, rakstiem par Kaķu kodēšana .
  4. ARCore iespējas un ierobežojumi Android izstrādei tika pārskatīti Google ARCore izstrādātāju vietnē. Uzziniet vairāk vietnē Google ARCore .