Skip to content

Projekt modulok

Somos Bence edited this page May 19, 2022 · 3 revisions

Szoftverkomponensek

Configuration

Itt találhatók a környezeti paramétereket illető konfigurációs beállítások. A WindowConfiguration osztály tartalmazza a kijelzőre és a kamerákra vonatkozó paramétereket, valamint koordináta-transzformációs segédfüggvényeket. A Bootstrapper osztályban történik a Dependency Injectionnel használt osztályok beregisztrálása és kezelése. A ConfigSerializer szerializációs segédfüggvényeket tesz elérhetővé.

A konfigurációs fájlokat az Assets/Config mappában tároljuk.

Image Capture

A felhasználókat figyelő eszközök képének rögzítését az IImageCapture interfészből leszármazó osztályok valósítják meg. Ez lehet kamerafelvétel, Kinect kép vagy a fejlesztés során használható előre elkészített videófájl feldolgozása is. Az arcfelismerést végző komponens ettől az osztálytól kapja meg az aktuális frame-et, amelyből a fejpozíciót kinyeri.

ImageProcessing

Az ImageProcessing névtérbe tartozó osztályok feladata az arcdetektálás végrehajtása a beérkező képen. Ezek az osztályok implementálják az IFaceDataProvider interfészt, melyen keresztül elérhető a felhasználó térbeli fejpozíciója (ez később bővíthető részletesebb adatokkal).

A jelenlegi elképzelés szerint a megfigyelő felhasználó helyzetét az Ultra Face Recognition algoritmus detektálja, amely kellően gyorsan és pontosan dolgozik, az ablak túloldalán álló alanyt pedig a Kinect fogja felismerni. A Kinect képes ugyanis az arcon található jellegzetes pontokat (szem, orr, száj stb.) nagy precizitással követni, aminek jó hasznát tudjuk venni a virtuális kiegészítők elhelyezésekor.

Core

A fejpozíciók alapján történő kameramozgatás a Core szkriptben található. A kamerának nem csak a pozícióját és elforgatását kell beállítani, hanem a frustumot is úgy kell módosítani, hogy a kijelző széleihez illeszkedjen.

UI

A fejlesztés segítéséhez tartalmaz vizuális debug elemeket, de egyéb, felhasználói felülettel kapcsolatos viselkedés is kerülhet ide. A FaceDetectionDebugImage megjeleníti az aktuális kameraképet, valamint bekeretezi a rajta felismert arcot. Itt külön meg kell adni a scene-ben a capture, illetve face detection szkriptet, amit aktuálisan használunk, de ehelyett jó megoldás lehet DI használata is.

Dependency Injection

A komponensek egységes és egyszerű eléréséhez a projekt dependency injectiont használ, az Injecter könyvtár felhasználásával.

Az osztályokat a Bootstrapper-ben tudjuk regisztrálni:

services.AddSingleton<WindowConfiguration>();

MonoBehaviour osztályok esetén a referenciát a scene-ből kell megszerezni, FindObjectOfType hívással:

services.AddSingleton(_ => FindObjectOfType<Core>());

MonoBehaviour osztályba függőséget injektálni az [Inject] attribútum segítségével tudunk:

[Inject] private readonly WindowConfiguration _windowConfiguration;

Egyéb osztályok esetén elég konstruktor paraméterként megadni az injektálni kívánt komponenseket.

NuGet

A UnityCsprojNuget package lehetővé teszi NuGet csomagok hozzáadását a projekthez egy erre a célra létrehozott projektfájl felhasználásával. Új package-eket ehhez az ArWindow.Nuget projekthez adhatunk hozzá, ami után újra kell generáltatni a projekt fájlokat (lásd Beüzemelés). Ez a szükséges dll-eket bemásolja a NugetDlls mappába, ahol a Unity is eléri őket.

Unity Interface Support

A Unity Inspector hátránya, hogy egy MonoBehaviour szkriptre csak másik MonoBehaviour referenciát tudunk behúzni, interfészeket nem támogat; tehát ha Inspectorból szeretnénk referenciákat hozzárendelni egy komponenshez, akkor vagy konkrét implementációt kell megadnunk, vagy interfész helyett egy MonoBehaviourből leszármazó absztrakt osztályt kell használnunk, aminek megvannak a maga hátrányai. Ezt megkerülendő használhatjuk az [InterfaceType] attribútumot, amelyet egy MonoBehaviour típusú változóra tehetünk, így specifikálva a Unity Editornak, hogy csak az adott interfészt megvalósító osztályokat fogadjon el. A szkripten belül ezután használhatunk egy belső változót, ami a MonoBehaviourt az interfész típusára castolja.

[SerializeField, InterfaceType(typeof(IImageCapture))] private MonoBehaviour _imageCapture;
private IImageCapture ImageCapture => _imageCapture as IImageCapture;