-
Notifications
You must be signed in to change notification settings - Fork 0
Projekt modulok
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.
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.
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.
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.
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.
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.
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.
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;